diff --git a/debug-tools/Android.mk b/debug-tools/Android.mk
deleted file mode 100644
index 8e4e086..0000000
--- a/debug-tools/Android.mk
+++ /dev/null
@@ -1,6 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-include $(call all-makefiles-under, $(LOCAL_PATH))
-
diff --git a/debug-tools/LogCollector/Android.mk b/debug-tools/LogCollector/Android.mk
deleted file mode 100644
index 001ac1c..0000000
--- a/debug-tools/LogCollector/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := wigig_logcollector
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CPPFLAGS := -Wall -fexceptions
-
-LOCAL_C_INCLUDES += \
-	$(LOCAL_PATH)/../lib/WlctPciAcss \
-	$(LOCAL_PATH)/../lib/inc \
-	$(LOCAL_PATH)/../lib/utils \
-
-LOCAL_SHARED_LIBRARIES := \
-	libwigig_utils \
-	libwigig_pciaccess \
-
-LOCAL_SRC_FILES := \
-	LogCollector.cpp
-
-include $(BUILD_EXECUTABLE)
-
-# LogCollector configuration file
-
-include $(CLEAR_VARS)
-LOCAL_MODULE       := wigig_logcollector.ini
-LOCAL_MODULE_TAGS  := optional
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH  := $(TARGET_OUT_ETC)
-LOCAL_SRC_FILES    := linux/wigig_logcollector.ini
-include $(BUILD_PREBUILT)
-
-
diff --git a/debug-tools/LogCollector/LogCollector.cpp b/debug-tools/LogCollector/LogCollector.cpp
deleted file mode 100644
index b59737f..0000000
--- a/debug-tools/LogCollector/LogCollector.cpp
+++ /dev/null
@@ -1,826 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <stdarg.h>
-#include <ctime>
-
-#ifndef _WINDOWS	// Linux
-#include <unistd.h>
-#include <getopt.h>
-#include <err.h>
-#else				// Windows
-#include <windows.h>
-#endif  //#ifdef _WINDOWS
-
-
-
-#include "WlctPciAcss.h"
-
-using namespace std;
-
-////////// TYPE DEFINITIONS //////////
-enum TRACER_TYPE
-{
-    TRACER_TYPE_FW,
-    TRACER_TYPE_UCODE
-};
-
-enum MODULES
-{
-	SYSTEM,
-	DRIVERS,
-	MAC_MON,
-	HOST_CMD,
-	PHY_MON,
-	INFRA,
-	CALIBS,
-	TXRX,
-	RAD_MGR,
-	SCAN,
-	MLME,
-	L2_MGR,
-	DISC,
-	MGMT_SRV,
-	SECURITY,
-	PSM,
-	WBE_MNGR,
-	NUM_MODULES,
-};
-
-string module_names[NUM_MODULES] = {"SYSTEM", "DRIVERS", "MAC_MON", "HOST_CMD", "PHY_MON", "INFRA", "CALIBS", "TXRX", "RAD_MGR", "SCAN", "MLME", "L2_MGR", "DISC", "MGMT_SRV", "SECURITY", "PSM", "WBE_MNGR"};
-
-typedef uint32_t u32;
-typedef int32_t s32;
-typedef unsigned int uint;
-
-#ifdef _WINDOWS
-struct module_level_enable { /* Little Endian */
-	uint error_level_enable : 1;
-	uint warn_level_enable : 1;
-	uint info_level_enable : 1;
-	uint verbose_level_enable : 1;
-	uint reserved0 : 4;
-};
-struct log_trace_header { /* Little Endian */
-	uint strring_offset : 20;
-	uint module : 4; /* module that outputs the trace */
-	uint level : 2;
-	uint parameters_num : 2; /* [0..3] */
-	uint is_string : 1; /* indicate if the printf uses %s */
-	uint signature : 3; /* should be 5 (2'101) in valid header */
-};
-#else
-struct module_level_enable { /* Little Endian */
-	uint error_level_enable : 1;
-	uint warn_level_enable : 1;
-	uint info_level_enable : 1;
-	uint verbose_level_enable : 1;
-	uint reserved0 : 4;
-} __attribute__((packed));
-
-struct log_trace_header { /* Little Endian */
-	/* the offset of the trace string in the strings sections */
-	uint strring_offset : 20;
-	uint module : 4; /* module that outputs the trace */
-	/*	0 - Error
-		1- WARN
-		2 - INFO
-		3 - VERBOSE */
-	uint level : 2;
-	uint parameters_num : 2; /* [0..3] */
-	uint is_string : 1; /* indicate if the printf uses %s */
-	uint signature : 3; /* should be 5 (2'101) in valid header */
-} __attribute__((packed));
-#endif
-
-union log_event {
-	struct log_trace_header hdr;
-	u32 param;
-};
-
-struct log_table_header {
-	u32 write_ptr; /* incremented by trace producer every write */
-	struct module_level_enable module_level_enable[NUM_MODULES];
-	union log_event evt[0];
-};
-
-enum {
-	str_mask = 0xFFFFF,
-};
-
-////////// END - TYPE DEFINITIONS ///////
-
-/////////// CONSTANTS ///////////////////
-
-const int SECOND_IN_MILLISECONDS = 1000;
-
-// 50 MB file size
-const int MAX_FILE_FRAGMENT_SIZE = 1024 * 1024 * 50;
-
-// RGFs containing log buffer addresses
-// FW log address
-const int REG_FW_USAGE_1 = 0x880004;
-// uCode log address
-const int REG_FW_USAGE_2 = 0x880008;
-
-// Firmware version RGFs
-const int FW_VERSION_MAJOR 	= 0x880a2c;
-const int FW_VERSION_MINOR 	= 0x880a30;
-const int FW_VERSION_SUB 	= 0x880a34;
-const int FW_VERSION_BUILD 	= 0x880a38;
-
-// Firmware Compilation Time RGFs
-const int FW_COMP_TIME_HOUR 	= 0x880a14;
-const int FW_COMP_TIME_MINUTE 	= 0x880a18;
-const int FW_COMP_TIME_SECOND 	= 0x880a1c;
-const int FW_COMP_TIME_DAY 		= 0x880a20;
-const int FW_COMP_TIME_MONTH 	= 0x880a24;
-const int FW_COMP_TIME_YEAR 	= 0x880a28;
-
-// Log buffer offsets
-// FW log address offset
-const int FW_LOG_ADDRESS_OFFSET = 0xc8000;
-// uCode log address offset
-//const int UCODE_LOG_ADDRESS_OFFSET = 0;
-
-// Entries in the fw log buf
-const size_t fw_log_buf_entries = 0x1000/4;
-
-// Config file filename
-#ifdef _WINDOWS
-const char* const DEFAULT_CONFIG_FILE_NAME = "wigig_logcollector.ini";
-#else
-const char* const DEFAULT_CONFIG_FILE_NAME = "/etc/wigig_logcollector.ini";
-#endif
-
-//////////// END - CONSTANTS ////////////
-
-//////////// Global Variables ///////////
-
-// Log addresses
-int fw_log_address = 0;
-int ucode_log_address = 0;
-
-/////// Config file parameters /////////
-int pollingInterval = 100;
-string resultPath = "";
-string deviceName = "";
-string deviceType = "";
-int fileFragmentSize = MAX_FILE_FRAGMENT_SIZE;
-bool debugPrint = false;
-DType_t devType = MST_NONE;
-
-log_table_header logHeader;
-
-//// END - Config file parameters /////
-
-void* handler = NULL;
-
-DWORD fwVersionMajor;
-DWORD fwVersionMinor;
-DWORD fwVersionSub;
-DWORD fwVersionBuild;
-
-DWORD fwCompTimeHour;
-DWORD fwCompTimeMinute;
-DWORD fwCompTimeSecond;
-DWORD fwCompTimeDay;
-DWORD fwCompTimeMonth;
-DWORD fwCompTimeYear;
-
-std::string configFilePath;
-const char *mod;
-int i;
-unsigned long x;
-char *endptr;
-int help; /* = 0; */
-
-void *log_bu; /* memory allocated for the log buf */
-
- void *str_buf;
- size_t str_sz;
- u32 rptr; /* = 0; */
- u32 last_wptr; /* = 0; */
- const char *const levels[] = {
-	"E",
-	"W",
-	"I",
-	"V",
-};
-
-const char *modules[16];
-
-//////////// END - Global Variables //////
-
-static inline size_t log_size(size_t entry_num)
-{
-	return sizeof(struct log_table_header) + entry_num * 4;
-}
-
-// OS Agnostic system time
-struct tm OSGetSystemTime()
-{
-	time_t current_time;
-	time(&current_time);
-
-	struct tm *pTimeStruct = localtime(&current_time);
-	struct tm timeStruct = {};
-    if (pTimeStruct)
-    {
-        timeStruct = *pTimeStruct;
-    }
-
-	return timeStruct;
-}
-
-// OS agnostic debug print function
-void DebugPrint(const char* error_message, ...)
-{
-	if (debugPrint == false) return;
-
-	va_list argptr;
-	va_start(argptr, error_message);
-
-	vfprintf(stderr, error_message, argptr);
-
-	va_end(argptr);
-}
-
-void DisplayHelp()
-{
-		static char *help_str = (char*)("Usage: LogCollector [OPTION]...\n"
-								"Extract trace log from firmware\n"
-								"\n"
-								"Mandatory arguments to long options are mandatory for short options too.\n"
-								" The following switches are mandatory:\n"
-								"  -m, --memdump=FILE		File to read memory dump from\n"
-								"  -l, --logsize=NUMBER		Log buffer size, entries\n");
-		printf("%s", help_str);
-		exit(1);
-}
-
-// OS agnostic sleep function
-void OSSleep(int sleep_period)
-{
-#ifdef _WINDOWS
-	Sleep(sleep_period);
-#else
-	usleep(sleep_period * SECOND_IN_MILLISECONDS);
-#endif
-}
-
-// OS agnostic error print function
-void OSError(const char* error_message, ...)
-{
-	va_list argptr;
-    va_start(argptr, error_message);
-
-#ifdef _WINDOWS
-	vfprintf(stderr, error_message, argptr);
-
-	exit(0);
-#else
-	vfprintf(stderr, error_message, argptr);
-
-	exit(0);
-#endif
-
-	va_end(argptr);
-}
-
-void ParseModuelLevel(string moduleString)
-{
-	for (int i = 0; i < NUM_MODULES; i++)
-	{
-		if (moduleString.find(module_names[i]) == 0)
-		{
-			// + 1 for '='
-			string levels = moduleString.substr(module_names[i].size() + 1);
-
-			if (levels.find("V") != string::npos)
-			{
-				logHeader.module_level_enable[i].verbose_level_enable = 1;
-			}
-			if (levels.find("I") != string::npos)
-			{
-				logHeader.module_level_enable[i].info_level_enable = 1;
-			}
-			if (levels.find("E") != string::npos)
-			{
-				logHeader.module_level_enable[i].error_level_enable = 1;
-			}
-			if (levels.find("W") != string::npos)
-			{
-				logHeader.module_level_enable[i].warn_level_enable = 1;
-			}
-		}
-	}
-}
-
-// OS agnostic get arguments function
-void ParseConfigLine(string line)
-{
-	const char* device_name = "device_name=";
-	const char* device_type = "device_type=";
-	const char* polling_interval = "polling_interval=";
-	const char* result_path = "result_path=";
-	const char* module_level_prefix = "MODULE_LEVEL_";
-	const char* debug_print = "debug_print=";
-	const char* log_fragment_size = "log_fragment_size=";
-
-	DebugPrint("configuration line = %s\n", line.c_str());
-
-	// Skip comments
-	if (line.find("//") == 0)
-	{
-		return;
-	}
-
-	try
-	{
-		if (line.find(debug_print) == 0)
-		{
-			debugPrint = (line.substr(strlen(debug_print)).find("TRUE") == 0);
-			DebugPrint("Debug Prints Enabled\n");
-		}
-		else if (line.find(log_fragment_size) == 0)
-		{
-			fileFragmentSize = atoi(line.substr(strlen(log_fragment_size)).c_str()) * 1024 * 1024;
-			DebugPrint("File fragment size is %d MB\n", atoi(line.substr(strlen(log_fragment_size)).c_str()));
-		}
-		else if (line.find(device_name) == 0)
-		{
-			deviceName = line.substr(strlen(device_name));
-			DebugPrint("Device Name Requested: %s\n", deviceName.c_str());
-		}
-		else if (line.find(polling_interval) == 0)
-		{
-			pollingInterval = atoi(line.substr(strlen(polling_interval)).c_str());
-			DebugPrint("Polling Interval Is:%d\n", pollingInterval);
-		}
-		else if (line.find(result_path) == 0)
-		{
-			resultPath = line.substr(strlen(result_path));
-			DebugPrint("Result path = %s\n", resultPath.c_str());
-		}
-		else if (line.find(module_level_prefix) == 0)
-		{
-			ParseModuelLevel(line.substr(strlen(module_level_prefix)));
-		}
-		else if (line.find(device_type) == 0)
-		{
-			deviceType = line.substr(strlen(device_type));
-
-			DebugPrint("Device Type = %s\n", deviceType.c_str());
-
-			if (deviceType.find("MARLON") == 0)
-			{
-				DebugPrint("Device selected MARLON=%d\n", MST_MARLON);
-				devType = MST_MARLON;
-			}
-			else if (deviceType.find("SPARROW") == 0)
-			{
-				DebugPrint("Device selected SPARROW=%d\n", MST_SPARROW);
-				devType = MST_SPARROW;
-			}
-			else if (deviceType.find("TALYN") == 0)
-			{
-				DebugPrint("Device selected TALYN=%d\n", MST_LAST);
-				devType = MST_LAST;
-			}
-			else
-			{
-				DebugPrint("Device selected NONE=%d\n", MST_NONE);
-				devType = MST_NONE;
-			}
-
-		}
-		else
-		{
-		}
-	}
-	catch (int)
-	{
-		OSError("Error: Failed to parse Config File");
-	}
-}
-
-// Open device interface
-static void OpenDevice()
-{
-	INTERFACE_LIST interfaces;
-	int num_items;
-	int res;
-	res = GetInterfaces(&interfaces, &num_items);
-
-	if (res != 0 || num_items == 0)
-	{
-		OSError("Error: retrieving interfaces");
-	}
-
-	string currentDeviceName;
-
-	// No specific device was requested or only one device is available
-	// Select first device in device list
-	bool deviceFound = false;
-
-	if (deviceName.compare("") == 0 || num_items == 1)
-	{
-		cout << "Selecting device: " << interfaces.list[0].ifName << "\n";
-		currentDeviceName = interfaces.list[0].ifName;
-	}
-	else
-	{
-		// Iterate through all found devices to find the one in config file
-		for (int i = 0 ; i < MAX_INTERFACES; i ++)
-		{
-			currentDeviceName = interfaces.list[i].ifName;
-
-			if (deviceName.compare(currentDeviceName) == 0)
-			{
-				// We have found the device we are looking for
-				cout << "Found device: " << currentDeviceName.c_str() << "\n";
-				deviceFound = true;
-				break;
-			}
-		}
-
-		if (!deviceFound)
-		{
-			OSError("A device named: %s, was not found", deviceName.c_str());
-		}
-	}
-
-	DebugPrint ("Opening Device: %s\n", currentDeviceName.c_str());
-
-	// Create a handler to the device
-	DWORD err = CreateDeviceAccessHandler(currentDeviceName.c_str(), devType, &handler);
-	if (!(err == 0 && isInit(handler)))
-	{
-		OSError("Failed to open device: %s, Error code: %d\n", currentDeviceName.c_str(), err);
-	}
-}
-
-// Get log address
-static int GetLogAddress(TRACER_TYPE type)
-{
-	DWORD val;
-	DWORD addr = REG_FW_USAGE_1;
-
-	if (type == TRACER_TYPE_UCODE)
-	{
-		addr = REG_FW_USAGE_2;
-	}
-	else if (type == TRACER_TYPE_FW)
-	{
-		addr = REG_FW_USAGE_1;
-	}
-	else
-	{
-		OSError("Invalid log tracer type - using FW as default");
-	}
-
-
-	// Read log offset
-	WlctAccssRead(handler, addr, val);
-
-	if (val == 0)
-	{
-		OSError("Invalid log buffer pointer address");
-	}
-
-	return val;
-}
-
-// OS agnostic read log function
-static bool OSReadLog(void *buf, size_t size)
-{
-	// Check if the device is open
-	if ((NULL == handler) || (!isInit(handler)))
-	{
-		OSError("Device not opened when trying the read log");
-	}
-
-	// Update FW & uCode log addresses
-	if (!fw_log_address) fw_log_address = GetLogAddress(TRACER_TYPE_FW) + FW_LOG_ADDRESS_OFFSET;
-	//if (!ucode_log_address) ucode_log_address = GetLogAddress(TRACER_TYPE_UCODE);
-
-	// Read the actual log
-	if(0 != readBlock(handler, fw_log_address, size, (char*)buf))
-	{
-		return false;
-		// OSError("Failed to read log buffer");
-	}
-	return true;
-}
-
-// OS agnostic read configuration file function
-static void OSReadConfigFile()
-{
-	try
-	{
-            ifstream file(configFilePath.c_str());
-
-		if(!file || !file.good())
-		{
-                    OSError("Error: failed to read config file: %s. %s \n", configFilePath.c_str(), strerror(errno));
-		}
-
-		string line;
-		while(std::getline(file, line))
-		{
-			ParseConfigLine(line);
-		}
-	}
-	catch (int i)
-	{
-            OSError("Exception while trying to open config file: %s\n", configFilePath.c_str());
-	}
-}
-
- void AddTimestamp(ofstream& outputFile)
-{
-	struct tm now = OSGetSystemTime();
-
-	std::ostringstream timeStampBuilder;
-
-	timeStampBuilder << "<Log_Content>"
-		<< "<Sample_Time>"
-		<< "<Hour>" << now.tm_hour << "</Hour>"
-		<< "<Minute>" << now.tm_min << "</Minute>"
-		<< "<Second>" << now.tm_sec << "</Second>"
-		<< "<Day>" << now.tm_mday << "</Day>"
-		<< "<Month>" << now.tm_mon + 1 << "</Month>"
-		<< "<Year>" << now.tm_year + 1900 << "</Year>"
-		<< "</Sample_Time>";
-
-	outputFile << timeStampBuilder.str();
-}
-
-static int ParseLog(void* log_buf, size_t log_buf_entries, ofstream& outputFile)
-{
-//	DebugPrint("Parsing log\n");
-
-	int sizeAdded = 0;
-
-	// Prepare a header pointing to log buffer top
-	struct log_table_header *h = (struct log_table_header*)log_buf;
-
-	u32 wptr = h->write_ptr;
-
-	if ((wptr - rptr) <= 0)
-	{
-		// Nothing to read.
-		return 0;
-	}
-
-	if ((wptr - rptr) >= log_buf_entries)
-	{
-		// overflow; try to parse last wrap
-		rptr = wptr - log_buf_entries;
-	}
-	DebugPrint("  wptr = %d rptr = %d\n", wptr, rptr);
-
-	AddTimestamp(outputFile);
-	outputFile << "<Content>";
-
-	for (; ((s32)(wptr - rptr) > 0) && (wptr != last_wptr); rptr++)
-	{
-		DebugPrint("wptr = %d, rptr = %d\n", wptr, rptr);
-
-		int i;
-		u32 p[3] = {0};
-		union log_event *evt = &h->evt[rptr % log_buf_entries];
-
-		if (evt->hdr.signature != 5)
-		{
-			continue;
-		}
-		if (evt->hdr.strring_offset > str_sz)
-		{
-//			continue;
-		}
-		if (evt->hdr.parameters_num > 3)
-		{
-			DebugPrint("Parameter Num = %d", evt->hdr.parameters_num);
-			continue;
-		}
-		for (i = 0; i < evt->hdr.parameters_num; i++)
-			p[i] = h->evt[(rptr + i + 1) % log_buf_entries].param;
-		/*DebugPrint("%d,%s,%d:", evt->hdr.module,
-					levels[evt->hdr.level],
-					evt->hdr.strring_offset);
-
-		DebugPrint("%d,%d,%d\n",
-			(p[0]),
-			(p[1]),
-			(p[2]));*/
-
-		outputFile << evt->hdr.module << "," << levels[evt->hdr.level] << "," << evt->hdr.strring_offset << ":" << p[0] << "," << p[1] << "," << p[2] << "\n";
-
-		// (paramters) (verbosity type) (delimiters)
-		sizeAdded += (5 * sizeof(int)) + (1 * sizeof(char)) + (4 * sizeof(char));
-
-		rptr += evt->hdr.parameters_num;
-	}
-
-	last_wptr = wptr;
-
-	outputFile << "</Content></Log_Content>";
-
-	fflush(stdout);
-	return sizeAdded;
-}
-
-void SetModuleVerbosity()
-{
-	// Check if the device is open
-	if ((NULL == handler) || (!isInit(handler)))
-	{
-		OSError("Device not opened when trying to set module verbosity");
-	}
-
-	// Update FW & uCode log addresses
-	if (!fw_log_address) fw_log_address = GetLogAddress(TRACER_TYPE_FW) + FW_LOG_ADDRESS_OFFSET;
-	//if (!ucode_log_address) ucode_log_address = GetLogAddress(TRACER_TYPE_UCODE);
-
-	DebugPrint("fw log address = %d\n", fw_log_address);
-
-	// Write verbosity to the device
-	if(-1 == writeBlock(handler, fw_log_address + sizeof(logHeader.write_ptr), sizeof(logHeader.module_level_enable), (char*)logHeader.module_level_enable))
-	{
-		OSError("Failed to write module verbosity structure");
-	}
-}
-
-void ReadDeviceInfo()
-{
-	// Check if the device is open
-	if ((NULL == handler) || (!isInit(handler)))
-	{
-		OSError("Device not opened when trying to read device info");
-	}
-
-	// Read FW Version
-	WlctAccssRead(handler, FW_VERSION_MAJOR, fwVersionMajor);
-	WlctAccssRead(handler, FW_VERSION_MINOR, fwVersionMinor);
-	WlctAccssRead(handler, FW_VERSION_SUB, fwVersionSub);
-	WlctAccssRead(handler, FW_VERSION_BUILD, fwVersionBuild);
-
-	// Read compilation Time
-	WlctAccssRead(handler, FW_COMP_TIME_HOUR, fwCompTimeHour);
-	WlctAccssRead(handler, FW_COMP_TIME_MINUTE, fwCompTimeMinute);
-	WlctAccssRead(handler, FW_COMP_TIME_SECOND, fwCompTimeSecond);
-	WlctAccssRead(handler, FW_COMP_TIME_DAY, fwCompTimeDay);
-	WlctAccssRead(handler, FW_COMP_TIME_MONTH, fwCompTimeMonth);
-	WlctAccssRead(handler, FW_COMP_TIME_YEAR, fwCompTimeYear);
-}
-
-void* AllocateBuffer()
-{
-	void* log_buf = malloc(log_size(fw_log_buf_entries));
-	if (!log_buf)
-	{
-		OSError("Error: Unable to allocate log buffer %zd bytes", log_size(fw_log_buf_entries));
-	}
-
-	return log_buf;
-}
-
-bool CreateNewOutputFile(string path, ofstream& outputFile)
-{
-	std::ostringstream fileNameBuilder;
-	fileNameBuilder << path << "logFile_" << time(0);
-
-	DebugPrint("Path: %s\n", path.c_str());
-	DebugPrint("Creating output file: %s\n", fileNameBuilder.str().c_str());
-
-	outputFile.open(fileNameBuilder.str().c_str());
-
-	if (outputFile.fail())
-	{
-		printf("Error opening output file: %s\n", fileNameBuilder.str().c_str());
-		return false;
-	}
-
-	std::ostringstream headerBuilder;
-
-	headerBuilder << "<LogFile>"
-		<< "<FW_Ver>"
-		<< "<Major>" << fwVersionMajor << "</Major>"
-		<< "<Minor>" << fwVersionMinor <<"</Minor>"
-		<< "<Sub>" << fwVersionSub << "</Sub>"
-		<< "<Build>" << fwVersionBuild << "</Build>"
-		<< "</FW_Ver>"
-		<< "<Compilation_Time>"
-		<< "<Hour>" << fwCompTimeHour << "</Hour>"
-		<< "<Minute>" << fwCompTimeMinute << "</Minute>"
-		<< "<Second>" << fwCompTimeSecond << "</Second>"
-		<< "<Day>" << fwCompTimeDay << "</Day>"
-		<< "<Month>" << fwCompTimeMonth << "</Month>"
-		<< "<Year>" << fwCompTimeYear << "</Year>"
-		<< "</Compilation_Time>"
-		<< "<Logs>";
-
-	outputFile << headerBuilder.str();
-	return true;
-}
-
-void CloseOutputFile(ofstream& outputFile)
-{
-	outputFile << "</Logs></LogFile>";
-	outputFile.close();
-	DebugPrint("Output file closed\n");
-}
-
-int main(int argc, char *argv[])
-{
-    configFilePath = DEFAULT_CONFIG_FILE_NAME;
-	if (argc == 2)
-	{
-            configFilePath = argv[1];
-	}
-
-	// Read configuration file
-	OSReadConfigFile();
-
-	if (false) // TODO decide when to show help
-	{
-		help = 1;
-	}
-
-	if (help)
-	{
-		DisplayHelp();
-	}
-
-	OpenDevice();
-
-	ReadDeviceInfo();
-
-	SetModuleVerbosity();
-
-	// Allocate log buffer
-	void* log_buf = AllocateBuffer();
-
-	long currentFileSize = 0;
-
-	ofstream outputFile;
-
-	bool status = CreateNewOutputFile(resultPath, outputFile);
-	if (!status) return 1;
-
-	while (true)
-	{
-		if (currentFileSize > fileFragmentSize)
-		{
-			currentFileSize = 0;
-			CloseOutputFile(outputFile);
-			status = CreateNewOutputFile(resultPath, outputFile);
-			if (!status) return 1;
-		}
-
-		// Read the log
-		if (!OSReadLog(log_buf, log_size(fw_log_buf_entries)))
-		{
-			OSSleep(pollingInterval);
-			continue;
-		}
-
-		currentFileSize += ParseLog(log_buf, fw_log_buf_entries, outputFile);
-		DebugPrint("Current File Size = %d\n", currentFileSize);
-
-		OSSleep(pollingInterval);
-	}
-
-	return 0;
-}
diff --git a/debug-tools/LogCollector/Makefile b/debug-tools/LogCollector/Makefile
deleted file mode 100644
index 88d91ed..0000000
--- a/debug-tools/LogCollector/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
--include $(TOPDIR)/rules.mk
-
-CFLAGS := -fPIE -Wall -g -MMD
-LDFLAGS := -pie -fPIE -pthread -lwigig_pciaccess -lwigig_utils
-
-ifneq ($(CONFIG_TARGET_ipq)$(CONFIG_TARGET_ipq806x),)
-is_ipq806x = 1
-endif
-
-ifeq ($(is_ipq806x), 1)
-ifneq ($(strip $(TOOLPREFIX)),)
-CROSS:=$(TOOLPREFIX)
-endif
-endif
-
-CC = $(CROSS)gcc
-CXX = $(CROSS)g++
-
-.DEFAULT_GOAL = all
-PROG = wigig_logcollector
-
-INCLUDES = -I ../lib/WlctPciAcss \
-           -I ../lib/inc \
-           -I ../lib/utils \
-
-LIBS = -L../lib/WlctPciAcss \
-       -L../lib/utils \
-
-CPP_FILES = $(shell find . -type f -name '*.cpp')
-OBJ_FILES = $(CPP_FILES:.cpp=.o)
-
-all: $(PROG)
-
-$(PROG): $(OBJ_FILES)
-	$(CXX) -o $@ $^ $(LIBS) $(LDFLAGS)
-
-%.o : %.cpp
-	$(CXX) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-
-clean:
-	rm -rf $(PROG)
-	find . -type f \( -name "*.d" -o -name "*.o" \) -delete
-
--include $(OBJ_FILES:%.o=%.d)
diff --git a/debug-tools/LogCollector/linux/wigig_logcollector.ini b/debug-tools/LogCollector/linux/wigig_logcollector.ini
deleted file mode 100644
index 0ad18b4..0000000
--- a/debug-tools/LogCollector/linux/wigig_logcollector.ini
+++ /dev/null
@@ -1,28 +0,0 @@
-debug_print=FALSE
-device_name=
-device_type=SPARROW
-polling_interval=100
-log_fragment_size=10
-result_path=/tmp/
-
-// Log Module Levels
-// V - Verbose, I - Info, E - Error, W - Warning
-// For example: MODULE_LEVEL_SYSTEM=VIE
-// Or: MODULE_LEVEL_DRIVERS=WIV
-MODULE_LEVEL_SYSTEM=VIEW
-MODULE_LEVEL_DRIVERS=VIEW
-MODULE_LEVEL_MAC_MON=VIEW
-MODULE_LEVEL_HOST_CMD=VIEW
-MODULE_LEVEL_PHY_MON=VIEW
-MODULE_LEVEL_INFRA=VIEW
-MODULE_LEVEL_CALIBS=VIEW
-MODULE_LEVEL_TXRX=VIEW
-MODULE_LEVEL_RAD_MGR=VIEW
-MODULE_LEVEL_SCAN=VIEW
-MODULE_LEVEL_MLME=VIEW
-MODULE_LEVEL_L2_MGR=VIEW
-MODULE_LEVEL_DISC=VIEW
-MODULE_LEVEL_MGMT_SRV=VIEW
-MODULE_LEVEL_SECURITY=VIEW
-MODULE_LEVEL_PSM=VIEW
-MODULE_LEVEL_WBE_MNGR=VIEW
diff --git a/debug-tools/Makefile b/debug-tools/Makefile
deleted file mode 100644
index e82e937..0000000
--- a/debug-tools/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-.DEFAULT_GOAL = all
-
-.PHONY = all install uninstall clean
-
-all: make_host_manager_11ad make_remoteserver make_logcollector make_wiburn make_wlctutils make_wlctpciacss make_flashacss
-
-make_host_manager_11ad:
-	$(MAKE) -C host_manager_11ad CROSS=$(CROSS)
-
-make_remoteserver: make_wlctutils make_wlctpciacss
-	$(MAKE) -C remoteserver CROSS=$(CROSS)
-
-make_logcollector: make_wlctutils make_wlctpciacss
-	$(MAKE) -C LogCollector CROSS=$(CROSS)
-
-make_wiburn: make_wlctutils make_wlctpciacss make_flashacss
-	$(MAKE) -C wiburn CROSS=$(CROSS)
-
-make_wlctutils:
-	$(MAKE) -C lib/utils CROSS=$(CROSS)
-
-make_wlctpciacss:
-	$(MAKE) -C lib/WlctPciAcss CROSS=$(CROSS)
-
-make_flashacss:
-	$(MAKE) -C lib/FlashAcss CROSS=$(CROSS)
-
-clean:
-	echo "Cleaning up wigig debug tools"
-	$(MAKE) -C host_manager_11ad clean
-	$(MAKE) -C remoteserver clean
-	$(MAKE) -C LogCollector clean
-	$(MAKE) -C wiburn clean
-	$(MAKE) -C lib/utils clean
-	$(MAKE) -C lib/WlctPciAcss clean
-	$(MAKE) -C lib/FlashAcss clean
-
diff --git a/debug-tools/host_manager_11ad/Android.mk b/debug-tools/host_manager_11ad/Android.mk
deleted file mode 100644
index 8a96497..0000000
--- a/debug-tools/host_manager_11ad/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := host_manager_11ad
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CPPFLAGS := -Wall -lpthread -fexceptions
-
-LOCAL_C_INCLUDES += \
-	$(LOCAL_PATH)/access_layer_11ad \
-	$(LOCAL_PATH)/access_layer_11ad/Unix \
-
-LOCAL_SRC_FILES := $(shell find $(LOCAL_PATH) -name '*.cpp' | sed s:^$(LOCAL_PATH)::g )
-
-include $(BUILD_EXECUTABLE)
diff --git a/debug-tools/host_manager_11ad/ArgumentsParser.cpp b/debug-tools/host_manager_11ad/ArgumentsParser.cpp
deleted file mode 100644
index 2c9848b..0000000
--- a/debug-tools/host_manager_11ad/ArgumentsParser.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "ArgumentsParser.h"
-#include "HostInfo.h"
-#include "Host.h"
-
-#include <cstdio>
-#include <vector>
-#include <string>
-#include <algorithm>
-
-using namespace std;
-// *************************************************************************************************
-
-bool ArgumentsParser::ParseAndHandleArguments(int argc, char * argv[], unsigned int &commandsTcpPort)
-{
-
-    //do something with params
-    (void)commandsTcpPort;
-
-    for (int i = 0; i < argc; i++)
-    {
-        m_arguments.push_back(string(argv[i]));
-    }
-    if (DoesArgumentExist("-v"))
-    { //Argument for the version of host_manager_11ad.
-      // No need to run host manager
-        printf("Host Manager 11ad version: %s\n", HostInfo::GetVersion().c_str());
-        return false;
-    }
-    if (DoesArgumentExist("-p"))
-    { //Argument for setting the port of the commands TCP port
-
-    }
-    if (DoesArgumentExist("-statusBar"))
-    { //Argument for setting the textual status bar display
-        printf("Showing Status Bar Periodically");
-        g_LogConfig.SetStatusBarPrinter(true);
-    }
-    if (DoesArgumentExist("-menu"))
-    { //Argument for showing host_manager menu
-        Host::GetHost().SetMenuDisplay(true);
-    }
-
-    unsigned val;
-    if (GetArgumentValue("-d", val))
-    { //Argument for setting verbosity level
-        g_LogConfig.SetMaxSeverity(val);
-    }
-
-    return true;
-}
-
-bool ArgumentsParser::DoesArgumentExist(string option)
-{
-    bool doesArgumentExist = find(m_arguments.begin(), m_arguments.end(), option) != m_arguments.end();
-    return doesArgumentExist;
-}
-
-bool ArgumentsParser::GetArgumentValue(string option, unsigned& val)
-{
-    auto argumentIter = find(m_arguments.begin(), m_arguments.end(), option);
-    if (argumentIter != m_arguments.end())
-    {
-        auto valueIter = ++argumentIter;
-        if (valueIter != m_arguments.end())
-        {
-            string valStr = *valueIter;
-            try
-            {
-                val = strtoul(valStr.c_str(), NULL, 10);
-                return true;
-            }
-            catch (...)
-            {
-                printf("Error in setting verbosity level\n");
-            }
-        }
-    }
-    return false;
-}
diff --git a/debug-tools/host_manager_11ad/ArgumentsParser.h b/debug-tools/host_manager_11ad/ArgumentsParser.h
deleted file mode 100644
index a029786..0000000
--- a/debug-tools/host_manager_11ad/ArgumentsParser.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _ARGUMENTSPARSER_H_
-#define _ARGUMENTSPARSER_H_
-
-#include "DebugLogger.h"
-
-#include <string>
-#include <vector>
-
-using namespace std;
-
-// *************************************************************************************************
-/*
- * Class for parsing the arguments given in the command line
- */
-class ArgumentsParser
-{
-public:
-    // retun value - true for continue running host manager, fasle for exit
-    bool ParseAndHandleArguments(int argc, char* argv[], unsigned int &commandsTcpPort);
-
-private:
-    vector<string> m_arguments; //Vector that holds each one of the arguments that was given in the command line
-    bool DoesArgumentExist(string option);
-    bool GetArgumentValue(string option, unsigned& val); // returns true iff the argument exists in the srguments list and its value was extracted correctly
-};
-
-#endif // !_ARGUMENTSPARSER_H_
diff --git a/debug-tools/host_manager_11ad/CommandsExecutor.cpp b/debug-tools/host_manager_11ad/CommandsExecutor.cpp
deleted file mode 100644
index 25dee8c..0000000
--- a/debug-tools/host_manager_11ad/CommandsExecutor.cpp
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <array>
-#include <sstream>
-#include "CommandsExecutor.h"
-#include "Host.h"
-
-using namespace std;
-
-CommandsExecutor::CommandsExecutor(Host& host) :
-    m_host(host)
-{
-}
-
-// *************************************************************************************************
-bool CommandsExecutor::GetHostData(HostData& data)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-
-    if (Host::GetHost().GetHostUpdate(data))
-    {
-        return true;
-    }
-
-    return false;
-}
-
-// *************************************************************************************************
-bool CommandsExecutor::SetHostAlias(const string& name)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-
-    if (Host::GetHost().GetHostInfo().SaveAliasToFile(name))
-    {
-        return true;
-    }
-
-    return false;
-}
-
-bool CommandsExecutor::AddDeviceRegister(const std::string& deviceName, const string& name, uint32_t address)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-
-    return Host::GetHost().GetDeviceManager().AddRegister(deviceName, name, address);
-}
-
-bool CommandsExecutor::RemoveDeviceRegister(const std::string& deviceName, const string& name)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-
-    return Host::GetHost().GetDeviceManager().RemoveRegister(deviceName, name);
-}
-
-//for testing purposes only
-static string hostAlias = "STA-1021";
-static vector<RegisterData> customRegs[3] =
-{
-    std::vector<RegisterData>(),
-    std::vector<RegisterData>(),
-    std::vector<RegisterData>{ { "Test1", "0x87" },{ "Test2", "OK" },{ "Test3", "0" }}
-};
-static std::array<string, 3> deviceNames{"wlan0", "wlan1", "wlan2"};
-
-bool CommandsExecutor::GetTestHostData(HostData& data)
-{
-    static int counter = 0;
-    static bool associated = true;
-    static int rfStatus = 0;
-    if (counter >= 10)
-    {
-        counter = 0;
-        associated = !associated;
-        rfStatus++;
-        if (rfStatus >= 3)
-        {
-            rfStatus = 0;
-        }
-    }
-    counter++;
-
-    data.m_hostManagerVersion = "1.1.2";
-    data.m_hostAlias = hostAlias;
-    data.m_hostIP = "10.18.172.149";
-
-    DeviceData device1;
-    device1.m_deviceName = deviceNames[0];
-    device1.m_associated = associated;
-    device1.m_signalStrength = 5;
-    device1.m_fwAssert = 0;
-    device1.m_uCodeAssert = 0;
-    device1.m_mcs = 7;
-    device1.m_channel = 1;
-    device1.m_fwVersion.m_major = 5;
-    device1.m_fwVersion.m_minor = 1;
-    device1.m_fwVersion.m_subMinor = 0;
-    device1.m_fwVersion.m_build = 344;
-    device1.m_bootloaderVersion = "7253";
-    device1.m_mode = "Operational";
-    device1.m_compilationTime.m_hour = 14;
-    device1.m_compilationTime.m_min = 52;
-    device1.m_compilationTime.m_sec = 1;
-    device1.m_compilationTime.m_day = 7;
-    device1.m_compilationTime.m_month = 8;
-    device1.m_compilationTime.m_year = 2017;
-    device1.m_hwType = "SPR-D0";
-    device1.m_hwTemp = "32.1";
-    device1.m_rfType = "SPR-R";
-    device1.m_rfTemp = "32.1";
-    device1.m_boardFile = "Generic_500mW";
-    device1.m_rf.push_back(2);
-    device1.m_rf.push_back(1);
-    device1.m_rf.push_back(2);
-    device1.m_rf.push_back(1);
-    device1.m_rf.push_back(rfStatus);
-    device1.m_rf.push_back(0);
-    device1.m_rf.push_back(0);
-    device1.m_rf.push_back(0);
-    device1.m_fixedRegisters.push_back({ "uCodeRxOn", "Rx On" });
-    device1.m_fixedRegisters.push_back({ "BfSeq", "2" });
-    device1.m_fixedRegisters.push_back({ "BfTrigger", "FW_TRIG" });
-    device1.m_fixedRegisters.push_back({ "NAV", "5" });
-    device1.m_fixedRegisters.push_back({ "TxGP", "1001" });
-    device1.m_fixedRegisters.push_back({ "RxGP", "547" });
-    device1.m_customRegisters = customRegs[0];
-    data.m_devices.push_back(device1);
-
-    DeviceData device2;
-    device2.m_deviceName = deviceNames[1];
-    device2.m_associated = false;
-    device2.m_signalStrength = 0;
-    device2.m_fwAssert = 0;
-    device2.m_uCodeAssert = 0;
-    device2.m_mcs = 0;
-    device2.m_channel = 0;
-    device2.m_fwVersion.m_major = 4;
-    device2.m_fwVersion.m_minor = 1;
-    device2.m_fwVersion.m_subMinor = 0;
-    device2.m_fwVersion.m_build = 1;
-    device2.m_bootloaderVersion = "7253";
-    device2.m_mode = "Operational";
-    device2.m_compilationTime.m_hour = 11;
-    device2.m_compilationTime.m_min = 11;
-    device2.m_compilationTime.m_sec = 11;
-    device2.m_compilationTime.m_day = 5;
-    device2.m_compilationTime.m_month = 8;
-    device2.m_compilationTime.m_year = 2017;
-    device2.m_hwType = "SPR-D1";
-    device2.m_hwTemp = "22.1";
-    device2.m_rfType = "SPR-R";
-    device2.m_rfTemp = "22.1";
-    device2.m_boardFile = "Generic_400mW";
-    device2.m_rf.push_back(2);
-    device2.m_rf.push_back(1);
-    device2.m_rf.push_back(2);
-    device2.m_rf.push_back(1);
-    device2.m_rf.push_back(0);
-    device2.m_rf.push_back(0);
-    device2.m_rf.push_back(0);
-    device2.m_rf.push_back(0);
-    device2.m_fixedRegisters.push_back({ "uCodeRxOn", "Rx On" });
-    device2.m_fixedRegisters.push_back({ "BfSeq", "1" });
-    device2.m_fixedRegisters.push_back({ "BfTrigger", "FW_TRIG" });
-    device2.m_fixedRegisters.push_back({ "NAV", "5" });
-    device2.m_fixedRegisters.push_back({ "TxGP", "1" });
-    device2.m_fixedRegisters.push_back({ "RxGP", "1" });
-    device2.m_customRegisters = customRegs[1];
-    data.m_devices.push_back(device2);
-
-    DeviceData device3;
-    device3.m_deviceName = deviceNames[2];
-    device3.m_associated = false;
-    device3.m_signalStrength = 0;
-    device3.m_fwAssert = 0x29;
-    device3.m_uCodeAssert = 0xff;
-    device3.m_mcs = 0;
-    device3.m_channel = 2;
-    device3.m_fwVersion.m_major = 3;
-    device3.m_fwVersion.m_minor = 2;
-    device3.m_fwVersion.m_subMinor = 0;
-    device3.m_fwVersion.m_build = 5;
-    device3.m_bootloaderVersion = "7253";
-    device3.m_mode = "Error";
-    device3.m_compilationTime.m_hour = 14;
-    device3.m_compilationTime.m_min = 52;
-    device3.m_compilationTime.m_sec = 1;
-    device3.m_compilationTime.m_day = 7;
-    device3.m_compilationTime.m_month = 8;
-    device3.m_compilationTime.m_year = 2017;
-    device3.m_hwType = "SPR-D1";
-    device3.m_hwTemp = "22.1";
-    device3.m_boardFile = "Generic_400mW";
-    device3.m_rf.push_back(0);
-    device3.m_rf.push_back(0);
-    device3.m_rf.push_back(0);
-    device3.m_rf.push_back(0);
-    device3.m_rf.push_back(0);
-    device3.m_rf.push_back(0);
-    device3.m_rf.push_back(0);
-    device3.m_rf.push_back(0);
-    device3.m_fixedRegisters.push_back({ "uCodeRxOn", "Rx Off" });
-    device3.m_fixedRegisters.push_back({ "BfSeq", "1" });
-    device3.m_fixedRegisters.push_back({ "NAV", "4" });
-    device3.m_fixedRegisters.push_back({ "RxGP", "0" });
-    device3.m_customRegisters = customRegs[2];
-
-    data.m_devices.push_back(device3);
-
-    return true;
-}
-
-bool CommandsExecutor::SetTestHostAlias(const std::string& name)
-{
-    hostAlias = name;
-    return true;
-}
-
-bool CommandsExecutor::AddTestDeviceRegister(const std::string& deviceName, const std::string& name, uint32_t address)
-{
-    for (size_t i = 0; i < deviceNames.size(); i++)
-    {
-        if (deviceNames[i] == deviceName)
-        {
-            auto elem = std::find_if(std::begin(customRegs[i]), std::end(customRegs[i]),
-                [&name](const RegisterData& item) {return item.m_name == name; });
-            if (std::end(customRegs[i]) == elem)
-            {
-                std::stringstream ss;
-                ss << address;
-                customRegs[i].push_back({ name, ss.str() });
-                return true;
-            }
-        }
-    }
-    return false;
-}
-
-bool CommandsExecutor::RemoveTestDeviceRegister(const std::string& deviceName, const std::string& name)
-{
-    for (size_t i = 0; i < deviceNames.size(); i++)
-    {
-        if (deviceNames[i] == deviceName)
-        {
-            auto elem = std::find_if(std::begin(customRegs[i]), std::end(customRegs[i]),
-                [&name](const RegisterData& item) {return item.m_name == name; });
-            if (std::end(customRegs[i]) != elem)
-            {
-                customRegs[i].erase(elem);
-                return true;
-            }
-        }
-    }
-    return false;
-}
diff --git a/debug-tools/host_manager_11ad/CommandsExecutor.h b/debug-tools/host_manager_11ad/CommandsExecutor.h
deleted file mode 100644
index 3785089..0000000
--- a/debug-tools/host_manager_11ad/CommandsExecutor.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-#ifndef _COMMANDSEXECUTOR_H_
-#define _COMMANDSEXECUTOR_H_
-
-#include <string>
-#include <vector>
-#include "HostDefinitions.h"
-
-struct RegisterData
-{
-    std::string m_name;
-    std::string m_value;
-};
-
-struct DeviceData
-{
-    std::string m_deviceName;
-    bool m_associated = false;
-    int m_signalStrength = 0;
-    int m_fwAssert = 0;
-    int m_uCodeAssert = 0;
-    int m_mcs = 0;
-    int m_channel = 0;
-    FwVersion m_fwVersion = {};
-    std::string m_bootloaderVersion;
-    string m_mode;
-    FwTimestamp m_compilationTime = {};
-    std::string m_hwType;
-    std::string m_hwTemp;
-    std::string m_rfType;
-    std::string m_rfTemp;
-    std::string m_boardFile;
-    std::vector<int> m_rf;
-    std::vector<RegisterData> m_fixedRegisters;
-    std::vector<RegisterData> m_customRegisters;
-};
-
-struct HostData
-{
-    std::string m_hostManagerVersion; //should it be a structure like FwVersion??
-    std::string m_hostAlias;
-    std::string m_hostIP;
-    std::vector<DeviceData> m_devices;
-};
-
-class Host;
-
-class CommandsExecutor
-{
-public:
-    CommandsExecutor(Host& host);
-
-    bool GetHostData(HostData& data);
-    bool SetHostAlias(const std::string& name);
-    bool AddDeviceRegister(const std::string& deviceName,  const std::string& name, uint32_t address);
-    bool RemoveDeviceRegister(const std::string& deviceName, const std::string& name);
-
-private:
-    Host& m_host; // a refernce to the host (enables access to deviceManager and hostInfo)
-
-    //for testing purposes only
-    bool GetTestHostData(HostData& data);
-    bool SetTestHostAlias(const std::string& name);
-    bool AddTestDeviceRegister(const std::string& deviceName, const std::string& name, uint32_t address);
-    bool RemoveTestDeviceRegister(const std::string& deviceName, const std::string& name);
-};
-
-
-#endif // _COMMANDSEXECUTOR_H_
diff --git a/debug-tools/host_manager_11ad/CommandsHandler.cpp b/debug-tools/host_manager_11ad/CommandsHandler.cpp
deleted file mode 100644
index 7d4009f..0000000
--- a/debug-tools/host_manager_11ad/CommandsHandler.cpp
+++ /dev/null
@@ -1,1176 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sstream>
-#include <string>
-#include <set>
-#include "CommandsHandler.h"
-#include "Host.h"
-#include "HostDefinitions.h"
-#include "FileReader.h"
-#include "JsonSerializeHelper.h"
-
-#ifdef _WINDOWS
-#include "ioctl_if.h"
-#endif
-
-CommandsHandler::CommandsHandler(ServerType type, Host& host) :
-    m_host(host)
-{
-    if (stTcp == type) // TCP server
-    {
-        m_functionHandler.insert(make_pair("get_interfaces", &CommandsHandler::GetInterfaces));
-        m_functionHandler.insert(make_pair("open_interface", &CommandsHandler::OpenInterface));
-        m_functionHandler.insert(make_pair("close_interface", &CommandsHandler::CloseInterface));
-        m_functionHandler.insert(make_pair("r", &CommandsHandler::Read));
-        m_functionHandler.insert(make_pair("rb", &CommandsHandler::ReadBlock));
-        m_functionHandler.insert(make_pair("w", &CommandsHandler::Write));
-        m_functionHandler.insert(make_pair("wb", &CommandsHandler::WriteBlock));
-        m_functionHandler.insert(make_pair("interface_reset", &CommandsHandler::InterfaceReset));
-        m_functionHandler.insert(make_pair("sw_reset", &CommandsHandler::SwReset));
-        m_functionHandler.insert(make_pair("alloc_pmc", &CommandsHandler::AllocPmc));
-        m_functionHandler.insert(make_pair("dealloc_pmc", &CommandsHandler::DeallocPmc));
-        m_functionHandler.insert(make_pair("create_pmc_file", &CommandsHandler::CreatePmcFile));
-        m_functionHandler.insert(make_pair("read_pmc_file", &CommandsHandler::FindPmcFile));
-        m_functionHandler.insert(make_pair("send_wmi", &CommandsHandler::SendWmi));
-        m_functionHandler.insert(make_pair("set_host_alias", &CommandsHandler::SetHostAlias));
-        m_functionHandler.insert(make_pair("get_host_alias", &CommandsHandler::GetHostAlias));
-        m_functionHandler.insert(make_pair("get_time", &CommandsHandler::GetTime));
-        m_functionHandler.insert(make_pair("set_local_driver_mode", &CommandsHandler::SetDriverMode));
-        m_functionHandler.insert(make_pair("get_host_manager_version", &CommandsHandler::GetHostManagerVersion));
-        m_functionHandler.insert(make_pair("driver_control", &CommandsHandler::DriverControl));
-        m_functionHandler.insert(make_pair("driver_command", &CommandsHandler::DriverCommand));
-        m_functionHandler.insert(make_pair("set_silence_mode", &CommandsHandler::SetDeviceSilenceMode));
-        m_functionHandler.insert(make_pair("get_silence_mode", &CommandsHandler::GetDeviceSilenceMode));
-        m_functionHandler.insert(make_pair("get_connected_users", &CommandsHandler::GetConnectedUsers));
-        m_functionHandler.insert(make_pair("get_device_capabilities_mask", &CommandsHandler::GetDeviceCapabilities));
-        m_functionHandler.insert(make_pair("get_host_capabilities_mask", &CommandsHandler::GetHostCapabilities));
-        m_functionHandler.insert(make_pair("on_target_log_recording", &CommandsHandler::OnTargetLogRecording));
-    }
-    else // UDP server
-    {
-        m_functionHandler.insert(make_pair(/*"get_host_network_info"*/"GetHostIdentity", &CommandsHandler::GetHostNetworkInfo));
-    }
-}
-
-// *************************************************************************************************
-
-string CommandsHandler::DecorateResponseMessage(bool successStatus, string message)
-{
-    string status = successStatus ? "Success" : "Fail";
-    string decoratedResponse = Utils::GetCurrentLocalTimeString() + m_reply_feilds_delimiter + status;
-    if (message != "")
-    {
-        decoratedResponse += m_reply_feilds_delimiter + message;
-    }
-    return decoratedResponse;
-}
-
-// **************************************TCP commands handlers*********************************************************** //
-ResponseMessage CommandsHandler::GetInterfaces(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)arguments;
-
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
-    {
-        set<string> devices;
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().GetDevices(devices);
-
-        if (dmosSuccess != status)
-        {
-            LOG_ERROR << "Error while trying to get interfaces. Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-            response.message = (dmosNoSuchConnectedDevice == status)? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-        else
-        {
-            // create one string that contains all connected devices
-            stringstream devicesSs;
-            bool firstTime = true;
-
-            for (std::set<string>::const_iterator it = devices.begin(); it != devices.end(); ++it)
-            {
-                if (firstTime)
-                {
-                    devicesSs << *it;
-                    firstTime = false;
-                    continue;
-                }
-                devicesSs << m_device_delimiter << *it;
-            }
-            response.message = DecorateResponseMessage(true, devicesSs.str());
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::OpenInterface(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
-    {
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().OpenInterface(arguments[0]);
-
-        if (dmosSuccess != status)
-        {
-            LOG_ERROR << "Error while trying to open interface " << arguments[0] + ". Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-            response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-        else
-        {
-            response.message = DecorateResponseMessage(true, arguments[0]); // backward compatibility
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::CloseInterface(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
-    {
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().CloseInterface(arguments[0]);
-
-        if (dmosSuccess != status)
-        {
-            LOG_ERROR << "Error while trying to close interface " << arguments[0] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-            response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-        else
-        {
-            response.message = DecorateResponseMessage(true); // backward compatibility
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::Read(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 2, response.message))
-    {
-        DWORD address;
-        if (!Utils::ConvertHexStringToDword(arguments[1], address))
-        {
-            LOG_WARNING << "Error in Read arguments: given address isn't starting with 0x" << endl;
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        else
-        {
-            DWORD value;
-            DeviceManagerOperationStatus status = m_host.GetDeviceManager().Read(arguments[0], address, value);
-            if (dmosSuccess != status)
-            {
-                if (dmosSilentDevice == status)
-                {
-                    response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
-                }
-                else
-                {
-                    LOG_ERROR << "Error while trying to read address " << arguments[1] << " from " + arguments[0] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-                    response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                        DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-
-                }
-            }
-            else
-            {
-                stringstream message;
-                message << "0x" << hex << value;
-                response.message = DecorateResponseMessage(true, message.str());
-            }
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::Write(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 3, response.message))
-    {
-        DWORD address, value;
-        if (!Utils::ConvertHexStringToDword(arguments[1], address) || !Utils::ConvertHexStringToDword(arguments[2], value))
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        else
-        {
-            DeviceManagerOperationStatus status = m_host.GetDeviceManager().Write(arguments[0], address, value);
-            if (dmosSuccess != status)
-            {
-                if (dmosSilentDevice == status)
-                {
-                    response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
-                }
-                else
-                {
-                    LOG_ERROR << "Error while trying to write value " << arguments[2] << " to " << arguments[1] + " on "
-                              << arguments[0] + ". Error: "
-                              << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-                    response.message = (dmosNoSuchConnectedDevice == status) ?
-                        DecorateResponseMessage(false,m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                        DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-                }
-            }
-            else
-            {
-                response.message = DecorateResponseMessage(true);
-            }
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::ReadBlock(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 3, response.message))
-    {
-        DWORD address, blockSize;
-        if (!Utils::ConvertHexStringToDword(arguments[1], address) || !Utils::ConvertHexStringToDword(arguments[2], blockSize))
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        else
-        {
-            vector<DWORD> values;
-            DeviceManagerOperationStatus status = m_host.GetDeviceManager().ReadBlock(arguments[0], address, blockSize, values);
-            if (dmosSuccess != status)
-            {
-                if (dmosSilentDevice == status)
-                {
-                    response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
-                }
-                else
-                {
-                    LOG_ERROR << "Error while trying to read " << arguments[2] << " addresses starting at address "
-                              << arguments[1] << " from " << arguments[0] << ". Error: "
-                              << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-                    response.message = (dmosNoSuchConnectedDevice == status) ?
-                        DecorateResponseMessage(false,m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                        DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-                }
-            }
-            else
-            {
-                stringstream responseSs;
-                auto it = values.begin();
-                if (it != values.end())
-                {
-                    responseSs << "0x" << hex << *it;
-                    ++it;
-                }
-                for (; it != values.end(); ++it)
-                {
-                    responseSs << m_array_delimiter << "0x" << hex << *it;
-                }
-                response.message = DecorateResponseMessage(true, responseSs.str());
-            }
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::WriteBlock(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 3, response.message))
-    {
-        DWORD address;
-        vector<DWORD> values;
-        if (!Utils::ConvertHexStringToDword(arguments[1], address) || !Utils::ConvertHexStringToDwordVector(arguments[2], m_array_delimiter, values))
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        else
-        {
-            // perform write block
-            DeviceManagerOperationStatus status = m_host.GetDeviceManager().WriteBlock(arguments[0], address, values);
-            if (dmosSuccess != status)
-            {
-                if (dmosSilentDevice == status)
-                {
-                    response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
-                }
-                else
-                {
-                    LOG_ERROR << "Error in write blocks. arguments are:\nDevice name - " << arguments[0]
-                              << "\nStart address - " << arguments[1] <<
-                        "\nValues - " << arguments[2] << endl;
-                    response.message = (dmosNoSuchConnectedDevice == status) ?
-                        DecorateResponseMessage(false,m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)):
-                        DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-                }
-            }
-            else
-            {
-                response.message = DecorateResponseMessage(true);
-            }
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::InterfaceReset(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
-    {
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().InterfaceReset(arguments[0]);
-        if (dmosSuccess != status)
-        {
-            LOG_ERROR << "Failed to perform interface reset on " << arguments[0] << ". Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-            response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-        else
-        {
-            response.message = DecorateResponseMessage(true);
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::SwReset(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
-    {
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().SwReset(arguments[0]);
-        if (dmosSuccess != status)
-        {
-            LOG_ERROR << "Failed to perform sw reset on " << arguments[0] << ". Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-            response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-        else
-        {
-            response.message = DecorateResponseMessage(true);
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::AllocPmc(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)numberOfArguments;
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    stringstream ss;
-    for (auto& s : arguments)
-    {
-        ss << "," << s;
-    }
-    LOG_VERBOSE << ss.str() << endl;
-
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 3, response.message))
-    {
-        unsigned descSize;
-        unsigned descNum;
-        if (!Utils::ConvertDecimalStringToUnsignedInt(arguments[1], descSize) ||
-            !Utils::ConvertDecimalStringToUnsignedInt(arguments[2], descNum))
-        {
-            stringstream error;
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        else
-        {
-            std::string errorMsg;
-            DeviceManagerOperationStatus status = m_host.GetDeviceManager().AllocPmc(arguments[0], descSize, descNum, errorMsg);
-            if (dmosSuccess != status)
-            {
-                stringstream error;
-                LOG_ERROR << "PMC allocation Failed: " << errorMsg << std::endl;
-                response.message = DecorateResponseMessage(false, errorMsg);
-            }
-            else
-            {
-                response.message = DecorateResponseMessage(true);
-            }
-        }
-    }
-
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::DeallocPmc(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)numberOfArguments;
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    stringstream ss;
-    for (auto& s : arguments)
-    {
-        ss << "," << s;
-    }
-    LOG_VERBOSE << ss.str() << endl;
-
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 1, response.message))
-    {
-        std::string errorMsg;
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().DeallocPmc(arguments[0], errorMsg);
-        if (dmosSuccess != status)
-        {
-            stringstream error;
-            LOG_ERROR << "PMC de-allocation Failed: " << errorMsg << std::endl;
-            response.message = DecorateResponseMessage(false, errorMsg);
-        }
-        else
-        {
-            response.message = DecorateResponseMessage(true);
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::CreatePmcFile(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)numberOfArguments;
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    stringstream ss;
-    for (auto& s : arguments)
-    {
-        ss << "," << s;
-    }
-    LOG_VERBOSE << ss.str() << endl;
-
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 2, response.message))
-    {
-        unsigned refNumber;
-        if (!Utils::ConvertDecimalStringToUnsignedInt(arguments[1], refNumber))
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        else
-        {
-            std::string outMsg;
-            DeviceManagerOperationStatus status = m_host.GetDeviceManager().CreatePmcFile(arguments[0], refNumber, outMsg);
-            if (dmosSuccess != status)
-            {
-                stringstream error;
-                LOG_ERROR << "PMC data file creation failed: " << outMsg << std::endl;
-                response.message = DecorateResponseMessage(false, outMsg);
-            }
-            else
-            {
-                response.message = DecorateResponseMessage(true, outMsg);
-            }
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::FindPmcFile(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)numberOfArguments;
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    stringstream ss;
-    for (auto& s : arguments)
-    {
-        ss << "," << s;
-    }
-    LOG_VERBOSE << ss.str() << endl;
-
-    ResponseMessage response;
-    response.type = REPLY_TYPE_BUFFER;
-
-#ifdef _WINDOWS
-    response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsLinuxSupportOnly));
-#else
-    if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 2, response.message))
-    {
-        unsigned refNumber;
-        if (!Utils::ConvertDecimalStringToUnsignedInt(arguments[1], refNumber))
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        else
-        {
-            std::string outMessage;
-            DeviceManagerOperationStatus status = m_host.GetDeviceManager().FindPmcFile(arguments[0], refNumber, outMessage);
-            if (dmosSuccess != status)
-            {
-                stringstream error;
-                LOG_ERROR << "PMC data file lookup failed: " << outMessage << std::endl;
-                response.message = DecorateResponseMessage(false, outMessage);
-            }
-            else
-            {
-                response.message = outMessage;
-                response.type = REPLY_TYPE_FILE;
-            }
-        }
-    }
-#endif // _WINDOWS
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::SendWmi(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)numberOfArguments;
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    stringstream ss;
-    for (auto& s : arguments)
-    {
-        ss << "," << s;
-    }
-    LOG_VERBOSE << ss.str() << endl;
-
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 3, response.message))
-    {
-        DWORD command;
-        vector<DWORD> payload;
-        if (!Utils::ConvertHexStringToDword(arguments[1], command) || !Utils::ConvertHexStringToDwordVector(arguments[2], m_array_delimiter, payload))
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().SendWmi(arguments[0], command, payload);
-        if (dmosSuccess != status)
-        {
-            if (dmosSilentDevice == status)
-            {
-                response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
-            }
-            else
-            {
-                LOG_ERROR << __FUNCTION__ << ":" << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-                response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                    DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-            }
-        }
-        else
-        {
-            response.message = DecorateResponseMessage(true);
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::SetHostAlias(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
-    {
-        if (m_host.GetHostInfo().SaveAliasToFile(arguments[0]))
-        {
-            response.message = DecorateResponseMessage(true);
-        }
-        else
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::GetHostAlias(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
-    {
-        response.message = DecorateResponseMessage(true, m_host.GetHostInfo().GetAlias());
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::GetHostCapabilities(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
-    {
-        stringstream message;
-        message << m_host.GetHostInfo().GetHostCapabilities();
-        response.message = DecorateResponseMessage(true, message.str());
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::OnTargetLogRecording(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 4, response.message)) // arg0 - devices names, arg1 - cpu types, arg2 - operation, arg3 - parameter, arg4 - value
-    {
-        vector<string> deviceNames = Utils::Split(arguments[0], ',');
-        vector<string> cpuNames = Utils::Split(arguments[1], ',');
-
-        if ("start" == arguments[2]) // currently start and stop are done for all devices and cpus
-        {
-            if (m_host.GetDeviceManager().GetLogCollectionMode())
-            {
-                response.message = DecorateResponseMessage(false, "already recording logs");
-            }
-            else
-            {
-                m_host.GetDeviceManager().SetLogCollectionMode(true);
-                response.message = DecorateResponseMessage(true);
-            }
-        }
-        else if ("stop" == arguments[2]) // currently start and stop are done for all devices and cpus
-        {
-            if (!m_host.GetDeviceManager().GetLogCollectionMode())
-            {
-                response.message = DecorateResponseMessage(false, "logs aren't being recorded");
-            }
-            else
-            {
-                m_host.GetDeviceManager().SetLogCollectionMode(false);
-                response.message = DecorateResponseMessage(true);
-            }
-        }
-        else if ("set_config" == arguments[2])
-        {
-            string errorMsg;
-            if (!m_host.GetDeviceManager().SetLogCollectionConfiguration(deviceNames, cpuNames, arguments[3], arguments[4], errorMsg))
-            {
-                response.message = DecorateResponseMessage(false, errorMsg);
-            }
-        }
-        else if ("get_config" == arguments[2])
-        {
-            response.message = DecorateResponseMessage(true, m_host.GetDeviceManager().GetLogCollectionConfiguration(deviceNames, cpuNames, arguments[3]));
-        }
-        else if ("dump_config" == arguments[2])
-        {
-            response.message = DecorateResponseMessage(true, m_host.GetDeviceManager().DumpLogCollectionConfiguration(deviceNames, cpuNames));
-        }
-        else
-        {
-            response.message = DecorateResponseMessage(false, " Unknown on target log recording operation");
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::GetTime(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)arguments;
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
-    {
-        response.message = DecorateResponseMessage(true);
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-// *************************************************************************************************
-ResponseMessage CommandsHandler::SetDriverMode(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 2, response.message))
-    {
-#ifdef _WINDOWS
-        int newMode = IOCTL_WBE_MODE;
-        int oldMode = IOCTL_WBE_MODE;
-
-        if ("WBE_MODE" == arguments[1])
-        {
-            newMode = IOCTL_WBE_MODE;
-        }
-        else if ("WIFI_STA_MODE" == arguments[1])
-        {
-            newMode = IOCTL_WIFI_STA_MODE;
-        }
-        else if ("WIFI_SOFTAP_MODE" == arguments[1])
-        {
-            newMode = IOCTL_WIFI_SOFTAP_MODE;
-        }
-        else if ("CONCURRENT_MODE" == arguments[1])
-        {
-            newMode = IOCTL_CONCURRENT_MODE;
-        }
-        else if ("SAFE_MODE" == arguments[1])
-        {
-            newMode = IOCTL_SAFE_MODE;
-        }
-        else
-        {
-            // TODO
-            response.message = dmosFail;
-            response.type = REPLY_TYPE_BUFFER;
-            response.length = response.message.size();
-            return response;
-        }
-#else
-        int newMode = 0;
-        int oldMode = 0;
-#endif
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().SetDriverMode(arguments[0], newMode, oldMode);
-        if (dmosSuccess != status)
-        {
-            LOG_ERROR << "Failed to set driver mode on " << arguments[0] << ". Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-            response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-#ifdef _WINDOWS
-        else
-        {
-            string message;
-
-            switch (oldMode)
-            {
-            case IOCTL_WBE_MODE:
-                message = "WBE_MODE";
-                break;
-            case IOCTL_WIFI_STA_MODE:
-                message = "WIFI_STA_MODE";
-                break;
-            case IOCTL_WIFI_SOFTAP_MODE:
-                message = "WIFI_SOFTAP_MODE";
-                break;
-            case IOCTL_CONCURRENT_MODE:
-                message = "CONCURRENT_MODE";
-                break;
-            case IOCTL_SAFE_MODE:
-                message = "SAFE_MODE";
-                break;
-            default:
-                break;
-            }
-
-            response.message = DecorateResponseMessage(true, message);
-        }
-#endif
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::GetHostManagerVersion(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)arguments;
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
-    {
-        string res = m_host.GetHostInfo().GetVersion();
-        response.message = DecorateResponseMessage(true, res);
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ResponseMessage CommandsHandler::DriverCommand(vector<string> arguments, unsigned int numberOfArguments)
-{
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 5, response.message))
-    {
-        DWORD commandId, inBufSize, outBufSize;
-        std::vector<unsigned char> inputBuf;
-        if ( !(Utils::ConvertHexStringToDword(arguments[1], commandId)
-               && Utils::ConvertHexStringToDword(arguments[2], inBufSize)
-               && Utils::ConvertHexStringToDword(arguments[3], outBufSize)
-               && JsonSerializeHelper::Base64Decode(arguments[4], inputBuf)
-               && inputBuf.size() == inBufSize) ) // inBufSize is the size of the original binary buffer before Base64 encoding
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        else
-        {
-            std::vector<unsigned char> outputBuf(outBufSize, 0);
-
-            DeviceManagerOperationStatus status =
-                m_host.GetDeviceManager().DriverControl(arguments[0], commandId, inputBuf.data(), inBufSize, outBufSize? outputBuf.data() : nullptr, outBufSize);
-
-            if (dmosSuccess != status)
-            {
-                LOG_DEBUG << "Driver IO command handler: Failed to execute driver IOCTL operation" << endl;
-                response.message = (dmosNoSuchConnectedDevice == status) ?
-                    DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                    DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-            }
-            else
-            {
-                LOG_DEBUG << "Driver IO command handler: Success" << endl;
-                response.message = DecorateResponseMessage(true, JsonSerializeHelper::Base64Encode(outputBuf)); // empty string if the buffer is empty
-            }
-        }
-    }
-
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-
-// *************************************************************************************************
-ResponseMessage CommandsHandler::DriverControl(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //cout << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 4, response.message))
-    {
-        DWORD inBufSize;
-        //vector<DWORD> inputValues;
-        if (!Utils::ConvertHexStringToDword(arguments[2], inBufSize))
-        {
-            response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-        }
-        response.inputBufSize = inBufSize;
-    }
-    response.internalParsedMessage = arguments;
-    response.type = REPLY_TYPE_WAIT_BINARY;
-    return response;
-}
-// *************************************************************************************************
-
-// *************************************************************************************************
-ResponseMessage CommandsHandler::GenericDriverIO(vector<string> arguments, void* inputBuf, unsigned int inputBufSize)
-{
-    //cout << __FUNCTION__ << endl;
-    ResponseMessage response;
-    DWORD id, inBufSize, outBufSize;
-    //vector<DWORD> inputValues;
-    if (!Utils::ConvertHexStringToDword(arguments[1], id) || !Utils::ConvertHexStringToDword(arguments[2], inBufSize) || !Utils::ConvertHexStringToDword(arguments[3], outBufSize))
-    {
-        response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-    }
-
-    else {
-        DeviceManagerOperationStatus status;
-
-        uint8_t* outputBuf = new uint8_t[outBufSize];
-        memset(outputBuf, 0, outBufSize);
-
-        status = m_host.GetDeviceManager().DriverControl(arguments[0], id, inputBuf, inBufSize, outputBuf, outBufSize);
-        response.length = outBufSize;
-
-        if (dmosSuccess != status)
-        {
-            LOG_DEBUG << "Driver IO command handler: Failed to execute driver IOCTL operation" << endl;
-            response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-            response.binaryMessage = (uint8_t*)"Failed to read from driver";
-        }
-        else
-        {
-            LOG_DEBUG << "Driver IO command handler: Success" << endl;
-            response.binaryMessage = (uint8_t*)outputBuf;
-        }
-    }
-
-    response.type = REPLY_TYPE_BINARY;
-    return response;
-}
-
-
-ResponseMessage CommandsHandler::GetDeviceSilenceMode(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
-    {
-        bool silentMode;
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().GetDeviceSilentMode(arguments[0], silentMode);
-        if (dmosSuccess != status)
-        {
-            LOG_ERROR << "Error while trying to GetDeviceSilenceMode at " << arguments[0] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-            response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-        else
-        {
-            stringstream message;
-            message << (silentMode ? 1 : 0);
-            response.message = DecorateResponseMessage(true, message.str());
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-
-ResponseMessage CommandsHandler::SetDeviceSilenceMode(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 2, response.message))
-    {
-        {
-            bool silentMode = false;
-
-            if (!Utils::ConvertStringToBool(arguments[1], silentMode))
-            {
-                response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
-            }
-
-            DeviceManagerOperationStatus status = m_host.GetDeviceManager().SetDeviceSilentMode(arguments[0], silentMode);
-            if (dmosSuccess != status)
-            {
-                LOG_ERROR << "Error while trying to SetDeviceSilenceMode at: " << arguments[0] << " to: " + arguments[1] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-                response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                    DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-            }
-            else
-            {
-                string mode = silentMode ? "Silenced" : "UnSilenced";
-                LOG_INFO << "Device:"<< arguments[0] <<"is now " << mode << endl;
-                stringstream message;
-                message << "Silent mode set to:" << silentMode;
-                response.message = DecorateResponseMessage(true, message.str());
-            }
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-
-ResponseMessage CommandsHandler::GetConnectedUsers(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
-    {
-
-        std::set<std::string> connectedUserList = m_host.GetHostInfo().GetConnectedUsers();
-        stringstream os;
-        for (const string & cl : connectedUserList)
-        {
-            os << cl << " ";
-        }
-
-        response.message = DecorateResponseMessage(true, os.str());
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-
-}
-ResponseMessage CommandsHandler::GetDeviceCapabilities(vector<string> arguments, unsigned int numberOfArguments)
-{
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-    if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
-    {
-        DWORD deviceCapabilitiesMask;
-        DeviceManagerOperationStatus status = m_host.GetDeviceManager().GetDeviceCapabilities(arguments[0], deviceCapabilitiesMask);
-        if (dmosSuccess != status)
-        {
-            LOG_ERROR << "Error while trying to GetDeviceCapabilities at " << arguments[0] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
-            response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
-                DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
-        }
-        else
-        {
-            stringstream message;
-            message << deviceCapabilitiesMask;
-            response.message = DecorateResponseMessage(true, message.str());
-        }
-    }
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-// **************************************UDP commands handlers*********************************************************** //
-ResponseMessage CommandsHandler::GetHostNetworkInfo(vector<string> arguments, unsigned int numberOfArguments)
-{
-    //do something with params
-    (void)numberOfArguments;
-    LOG_VERBOSE << __FUNCTION__ << endl;
-    ResponseMessage response;
-
-    if (arguments.size() != 0)
-    {
-        response.message = DecorateResponseMessage(false, "Failed to get host's info: expected zero argument");
-    }
-    else
-    {
-        response.message = "GetHostIdentity;" + m_host.GetHostInfo().GetIps().m_ip + ";" + m_host.GetHostInfo().GetAlias();
-    }
-
-    response.type = REPLY_TYPE_BUFFER;
-    response.length = response.message.size();
-    return response;
-}
-// *************************************************************************************************
-
-ConnectionStatus CommandsHandler::ExecuteCommand(string message, ResponseMessage &referencedResponse)
-{
-    MessageParser messageParser(message);
-    string commandName = messageParser.GetCommandFromMessage();
-
-    if (m_functionHandler.find(commandName) == m_functionHandler.end())
-    { //There's no such a command, the return value from the map would be null
-        LOG_WARNING << "Unknown command from client: " << commandName << endl;
-        referencedResponse.message = "Unknown command: " + commandName;
-        referencedResponse.length = referencedResponse.message.size();
-        referencedResponse.type = REPLY_TYPE_BUFFER;
-        return KEEP_CONNECTION_ALIVE;
-    }
-    referencedResponse = (this->*m_functionHandler[commandName])(messageParser.GetArgsFromMessage(), messageParser.GetNumberOfArgs()); //call the function that fits commandName
-
-    return KEEP_CONNECTION_ALIVE;
-}
-
-// *************************************************************************************************
-
-ConnectionStatus CommandsHandler::ExecuteBinaryCommand(uint8_t* binaryInput, ResponseMessage &referencedResponse)
-{
-    referencedResponse = GenericDriverIO(referencedResponse.internalParsedMessage, binaryInput, referencedResponse.inputBufSize);
-
-    return KEEP_CONNECTION_ALIVE;
-}
-
-// *************************************************************************************************
-
-string CommandsHandler::GetCommandsHandlerResponseStatusString(CommandsHandlerResponseStatus status)
-{
-    switch (status)
-    {
-    case chrsInvalidNumberOfArguments:
-        return "Invalid arguments number";
-    case chrsInvalidArgument:
-        return "Invalid argument type";
-    case chrsOperationFailure:
-        return "Operation failure";
-    case chrsLinuxSupportOnly:
-        return "Linux support only";
-    case chrsSuccess:
-        return "Success";
-    case chrsDeviceIsSilent:
-        return "SilentDevice";
-
-    default:
-        return "CommandsHandlerResponseStatus is unknown";
-    }
-}
-
-// *************************************************************************************************
-
-bool CommandsHandler::ValidArgumentsNumber(string functionName, size_t numberOfArguments, size_t expectedNumOfArguments, string& responseMessage)
-{
-    if (expectedNumOfArguments != numberOfArguments)
-    {
-        stringstream error;
-        LOG_WARNING << "Mismatching number of arguments in " << functionName << ": expected " << expectedNumOfArguments << " but got " << numberOfArguments << endl;
-        responseMessage = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidNumberOfArguments));
-        return false;
-    }
-    return true;
-}
diff --git a/debug-tools/host_manager_11ad/CommandsHandler.h b/debug-tools/host_manager_11ad/CommandsHandler.h
deleted file mode 100644
index 520275b..0000000
--- a/debug-tools/host_manager_11ad/CommandsHandler.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _COMMANDSHANDLER_H_
-#define _COMMANDSHANDLER_H_
-
-#include <iostream>
-#include <memory>
-#include <map>
-#include "MessageParser.h"
-#include "HostDefinitions.h"
-#include <sstream>
-
-class Host;
-
-using namespace std;
-
-
-// *************************************************************************************************
-
-class CommandsHandler
-{
-public:
-    /*
-     * pCommandFunction is used for the functions map - each function gets two arguments:
-     * vector of strings which holds the arguments and the number of arguments in that vector
-     */
-    typedef ResponseMessage(CommandsHandler::*pCommandFunction)(vector<string>, unsigned int);
-
-    /*
-     * The constructor inserts each one of the available functions into the map - m_functionHandler - according to server type (TCP/UDP)
-     */
-    CommandsHandler(ServerType type, Host& host);
-
-    ConnectionStatus ExecuteCommand(string message, ResponseMessage &referencedResponse);
-    ConnectionStatus ExecuteBinaryCommand(uint8_t* binaryInput, ResponseMessage &referencedResponse);
-
-private:
-    //m_functionHandler is a map that maps a string = command name, to a function
-    map<string, pCommandFunction> m_functionHandler;
-    Host& m_host; // a refernce to the host (enables access to deviceManager and hostInfo)
-
-    enum CommandsHandlerResponseStatus
-    {
-        chrsInvalidNumberOfArguments,
-        chrsInvalidArgument,
-        chrsOperationFailure,
-        chrsLinuxSupportOnly,
-        chrsDeviceIsSilent,
-        chrsSuccess
-    };
-
-    string GetCommandsHandlerResponseStatusString(CommandsHandlerResponseStatus status);
-
-    /*
-      FormatResponseMessage
-      Decorate the response message with time stamp and a success status
-      @param: successStatus - true for a successful operation, false otherwise
-      @param: message - the content of the response
-      @return: the decorated response
-    */
-    string DecorateResponseMessage(bool successStatus, string message = "");
-
-    // **********************************Commands Functions:****************************************
-    ResponseMessage GetInterfaces(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage OpenInterface(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage CloseInterface(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage Read(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage Write(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage ReadBlock(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage WriteBlock(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage InterfaceReset(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage SwReset(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage AllocPmc(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage DeallocPmc(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage CreatePmcFile(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage FindPmcFile(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage SendWmi(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage GetTime(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage SetDriverMode(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage GetHostManagerVersion(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage DriverControl(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage DriverCommand(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage GenericDriverIO(vector<string> arguments, void* inputBuf, unsigned int inputBufSize);
-
-    ResponseMessage GetDeviceSilenceMode(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage SetDeviceSilenceMode(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage GetConnectedUsers(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage GetDeviceCapabilities(vector<string> arguments, unsigned int numberOfArguments);
-
-    bool ValidArgumentsNumber(string functionName, size_t numberOfArguments, size_t expectedNumOfArguments, string& responseMessage);
-
-    /*
-      GetHostNetworkInfo
-      Return host's IP and host's alias as the Response
-      @param: an empty vector
-      @return: a response with a string that contains both  host's IP and host's alias
-    */
-    ResponseMessage GetHostNetworkInfo(vector<string> arguments, unsigned int numberOfArguments);
-
-    /*
-      SetHostAlias
-      Get a new alias and define it as the new host's alias
-      @param: a vector with one string representing the new alias
-      @return: a response with feedback about the operation status (success/failure)
-    */
-    ResponseMessage SetHostAlias(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage GetHostAlias(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage GetHostCapabilities(vector<string> arguments, unsigned int numberOfArguments);
-
-    ResponseMessage OnTargetLogRecording(vector<string> arguments, unsigned int numberOfArguments);
-
-    const char m_device_delimiter = ' ';
-
-    const char m_array_delimiter = ' ';
-
-    const char m_reply_feilds_delimiter = '|';
-};
-
-
-#endif // !_COMMANDSHANDLER_H_
diff --git a/debug-tools/host_manager_11ad/CommandsTcpServer.cpp b/debug-tools/host_manager_11ad/CommandsTcpServer.cpp
deleted file mode 100644
index 2d27ed5..0000000
--- a/debug-tools/host_manager_11ad/CommandsTcpServer.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <thread>
-#include "CommandsTcpServer.h"
-#include "TcpNetworkInterface.h"
-#include "FileReader.h"
-#include "Host.h"
-
-using namespace std;
-
-// *************************************************************************************************
-
-CommandsTcpServer::CommandsTcpServer(unsigned int commandsTcpPort, Host& host)
-    :m_port(commandsTcpPort),m_pSocket(new TcpNetworkInterfaces::NetworkInterface()), m_host(host), m_running(true)
-{
-}
-
-// *************************************************************************************************
-
-void CommandsTcpServer::Start()
-{
-    //LOG_INFO << "Starting commands TCP server on port " << m_port << endl;
-    m_pSocket->Bind(m_port);
-    m_pSocket->Listen();
-
-    //Infinite loop that waits for clients to connect to the commands TCP server - there's no reason to stop this loop,
-    //should run forever unless there is a problem
-    while (m_running)
-    {
-        try
-        {
-            //thread serverThread = thread(&ServerThread, m_pServer->accept());
-            thread serverThread(&CommandsTcpServer::ServerThread, this, m_pSocket->Accept()); //open a new thread for each client
-            serverThread.detach();
-        }
-        catch (exception e)
-        {
-            LOG_ERROR << "Couldn't make a new connection or starting a new thread in Commands TCP server for a new client " << e.what() << endl;
-        }
-    }
-}
-
-void CommandsTcpServer::Stop()
-{
-    LOG_INFO << "Stopping the commands TCP server" << endl;
-    m_pSocket->Close(); //type 2 -> Acts like the close(), shutting down both input and output
-    m_pSocket.reset();
-    m_running = false;
-}
-
-
-
-// *************************************************************************************************
-//A thread function to handle each client that connects to the server
-void CommandsTcpServer::ServerThread(TcpNetworkInterfaces::NetworkInterface client)
-{
-    unique_ptr<CommandsHandler> pCommandsHandler(new CommandsHandler(stTcp, m_host));
-    ConnectionStatus keepConnectionAliveFromCommand = KEEP_CONNECTION_ALIVE; //A flag for the content of the command - says if the client wants to close connection
-    ConnectionStatus keepConnectionAliveFromReply = KEEP_CONNECTION_ALIVE; //A flag for the reply status, for problems in sending reply etc..
-    // notify that new clinet is connected to the host (send list of connected users before adding the new one, and a notification of the new one)
-    Host::GetHost().PushEvent(ClientConnectedEvent(Host::GetHost().GetHostInfo().GetConnectedUsers(), client.GetPeerName()));
-    m_host.GetHostInfo().AddNewConnectedUser(client.GetPeerName()); // add the user's to the host's connected users
-
-    do
-    {
-        string concatenatedMessages;
-
-        try
-        {
-            const char* message = client.Receive();
-            if (NULL == message)
-            {
-                keepConnectionAliveFromReply = CLOSE_CONNECTION;
-                break;
-            }
-
-            concatenatedMessages = message;
-            vector<string> splitMessages = Utils::Split(concatenatedMessages, '\r');
-
-            for (auto& message : splitMessages)
-            {
-                ResponseMessage referencedResponse;
-                if (message.empty())
-                { //message back from the client is "", means the connection is closed
-                    break;
-                }
-                //Try to execute the command from the client, get back from function if to keep the connection with the client alive or not
-                keepConnectionAliveFromCommand = pCommandsHandler->ExecuteCommand(message, referencedResponse);
-
-                if (referencedResponse.type == REPLY_TYPE_WAIT_BINARY) {
-                    uint8_t* binaryInput = (uint8_t*)client.BinaryReceive(referencedResponse.inputBufSize);
-                    keepConnectionAliveFromCommand = pCommandsHandler->ExecuteBinaryCommand(binaryInput, referencedResponse);
-                }
-
-                //Reply back to the client an answer for his command. If it wasn't successful - close the connection
-                keepConnectionAliveFromReply = CommandsTcpServer::Reply(client, referencedResponse);
-            }
-            //LOG_VERBOSE << "Message from Client to commands TCP server: " << message << endl;
-        }
-        catch (exception e)
-        {
-            LOG_ERROR << "Couldn't get the message from the client" << e.what() << endl;
-            break;
-        }
-
-    } while (keepConnectionAliveFromCommand != CLOSE_CONNECTION && keepConnectionAliveFromReply != CLOSE_CONNECTION);
-
-    //client.shutdown(0); //TODO - check how to do it correctly (without exception)
-    //client.shutdown(1); //TODO - check how to do it correctly (without exception)
-    //client.close(); //TODO - check how to do it correctly (without exception)
-    LOG_INFO << "Closed connection with the client: " << client.GetPeerName() << endl;
-    m_host.GetHostInfo().RemoveConnectedUser(client.GetPeerName());
-    //notify that new client is disconnected from the host
-    Host::GetHost().PushEvent(ClientDisconnectedEvent(Host::GetHost().GetHostInfo().GetConnectedUsers(), client.GetPeerName()));
-
-}
-
-// *************************************************************************************************
-
-ConnectionStatus CommandsTcpServer::Reply(TcpNetworkInterfaces::NetworkInterface &client, ResponseMessage &responseMessage)
-{
-    LOG_VERBOSE << "Reply is: " << responseMessage.message << endl;
-
-    switch (responseMessage.type)
-    {
-    case REPLY_TYPE_BUFFER:
-        return ReplyBuffer(client, responseMessage);
-    case REPLY_TYPE_FILE:
-        return ReplyFile(client, responseMessage);
-    case REPLY_TYPE_BINARY:
-        return ReplyBinary(client, responseMessage);
-    default:
-        LOG_ERROR << "Unknown reply type" << endl;
-        return CLOSE_CONNECTION;
-    }
-}
-
-
-// *************************************************************************************************
-
-ConnectionStatus CommandsTcpServer::ReplyBuffer(TcpNetworkInterfaces::NetworkInterface &client, ResponseMessage &responseMessage)
-{
-    LOG_VERBOSE << "Replying from a buffer (" << responseMessage.length << "B) Content: " << responseMessage.message << endl;
-
-    if (0 == responseMessage.length)
-    {
-        LOG_ERROR << "No reply generated by a command handler - connection will be closed" << endl;
-        return CLOSE_CONNECTION;
-    }
-
-    //TODO - maybe the sending format is ending with "\r\n"
-    if (!client.SendString(responseMessage.message + "\r"))
-    {
-        LOG_ERROR << "Couldn't send the message to the client, closing connection" << endl;
-        return CLOSE_CONNECTION;
-    }
-
-    return KEEP_CONNECTION_ALIVE;
-}
-
-
-//TODO - reply file had been copied from old "wilserver" almost without touching it.
-//It has to be checked and also modified to fit the new "host_server_11ad"
-//The same applies to "FileReader.h" and "FileReader.cpp"
-ConnectionStatus CommandsTcpServer::ReplyFile(TcpNetworkInterfaces::NetworkInterface& client, ResponseMessage& fileName)
-{
-    FileReader fileReader(fileName.message.c_str());
-    size_t fileSize = fileReader.GetFileSize();
-    LOG_VERBOSE << "Replying from a file: " << fileName.message
-              << " Size: " << fileSize << " B" << std::endl;
-
-    if (0 == fileSize)
-    {
-        LOG_ERROR << "No file content is available for reply" << std::endl;
-        return CLOSE_CONNECTION;
-    }
-
-    static const size_t SEND_BUFFER_LEN = 1024 * 1024;
-    std::unique_ptr<char[]> spSendBuffer(new char[SEND_BUFFER_LEN]);
-    if (!spSendBuffer)
-    {
-        LOG_ERROR << "Cannot allocate send buffer of " << SEND_BUFFER_LEN << " B";
-        return CLOSE_CONNECTION;
-    }
-
-    size_t chunkSize = 0;
-    do
-    {
-        LOG_VERBOSE << "Requesting for a file chunk of " << SEND_BUFFER_LEN << " B"  << std::endl;
-
-        chunkSize = fileReader.ReadChunk(spSendBuffer.get(), SEND_BUFFER_LEN);
-        if (chunkSize > 0)
-        {
-            LOG_ASSERT(chunkSize <= SEND_BUFFER_LEN);
-            if (!client.SendBuffer(spSendBuffer.get(), chunkSize))
-            {
-                LOG_ERROR << "Error occurred while replying file content - transport error" << std::endl;
-                return CLOSE_CONNECTION;
-            }
-        }
-
-        // Error/Completion may occur with non-zero chunk as well
-        if (fileReader.IsError())
-        {
-            LOG_ERROR << "Cannot send reply - file read error" << std::endl;
-            return CLOSE_CONNECTION;
-        }
-
-        if (fileReader.IsCompleted())
-        {
-            LOG_VERBOSE << "File Content successfully delivered" << std::endl;
-            return KEEP_CONNECTION_ALIVE;
-        }
-
-        LOG_VERBOSE << "File Chunk Delivered: " << chunkSize << "B" << std::endl;
-    }
-    while (chunkSize > 0);
-
-    return KEEP_CONNECTION_ALIVE;
-}
-
-ConnectionStatus CommandsTcpServer::ReplyBinary(TcpNetworkInterfaces::NetworkInterface &client, ResponseMessage &responseMessage)
-{
-    if (0 == responseMessage.length)
-    {
-        LOG_ERROR << "No reply generated by a command handler - connection will be closed" << endl;
-        return CLOSE_CONNECTION;
-    }
-
-    if (!client.SendBuffer((const char*)responseMessage.binaryMessage, responseMessage.length))
-    {
-        LOG_ERROR << "Couldn't send the message to the client, closing connection" << endl;
-        return CLOSE_CONNECTION;
-    }
-
-    return KEEP_CONNECTION_ALIVE;
-}
\ No newline at end of file
diff --git a/debug-tools/host_manager_11ad/CommandsTcpServer.h b/debug-tools/host_manager_11ad/CommandsTcpServer.h
deleted file mode 100644
index 78820c8..0000000
--- a/debug-tools/host_manager_11ad/CommandsTcpServer.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _COMMANDSTCPSERVER_H_
-#define _COMMANDSTCPSERVER_H_
-
-#include "TcpNetworkInterface.h"
-#include <memory>
-#include "HostDefinitions.h"
-#include "CommandsHandler.h"
-
-using namespace std;
-
-class Host;
-
-/*
-* Commands TCP Server is a synchronous server that handles each client separately.
-* When a client sends a new command to the Commands TCP Server, the host processes it and sends back to the client an answer.
-*/
-class CommandsTcpServer
-{
-public:
-
-    /*
-    * Commands TCP server constructor gets the port to start in. It also initializes new Socket object.
-    */
-    CommandsTcpServer(unsigned int commandsTcpPort, Host& host);
-
-    /*
-    * Start the commands TCP server at the given port (given in the constructor).
-    * For each new client that is connecting to the server it opens a new thread and
-    * continue to listen on the port for more clients.
-    */
-    void Start();
-
-    /*
-    * Stop the commands TCP server by doing some clean ups for the sockets.
-    */
-    void Stop();
-
-private:
-
-    unsigned int m_port; //The port in which the commands TCP server is working on
-    shared_ptr<TcpNetworkInterfaces::NetworkInterface> m_pSocket; //an object that holds the connection with each client
-    Host& m_host; // refernce to the host object (that is passed to commandsHandler each time a new TCP connection is created)
-
-    void ServerThread(TcpNetworkInterfaces::NetworkInterface client);
-    ConnectionStatus Reply(TcpNetworkInterfaces::NetworkInterface &client, ResponseMessage &responseMessage);
-    ConnectionStatus ReplyBuffer(TcpNetworkInterfaces::NetworkInterface &client, ResponseMessage &responseMessage);
-    ConnectionStatus ReplyFile(TcpNetworkInterfaces::NetworkInterface &client, ResponseMessage &fileName);
-    ConnectionStatus ReplyBinary(TcpNetworkInterfaces::NetworkInterface &client, ResponseMessage &responseMessage);
-
-    bool m_running;
-};
-
-
-#endif // !_COMMANDSTCPSERVER_H_
-
diff --git a/debug-tools/host_manager_11ad/DebugLogger.cpp b/debug-tools/host_manager_11ad/DebugLogger.cpp
deleted file mode 100644
index b510ba3..0000000
--- a/debug-tools/host_manager_11ad/DebugLogger.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "DebugLogger.h"
-#include <stdio.h>
-
-// *************************************************************************************************
-
-LogConfig g_LogConfig(LOG_SEV_INFO, false);
-
-// *************************************************************************************************
-
-LogConfig::LogConfig(LogSeverity maxSeverity, bool bPrintLocation)
-    : m_MaxSeverity(maxSeverity)
-    , m_ShowStatusBar(false)
-    , m_PrintLocation(bPrintLocation)
-    , m_ExitOnAssert(false)
-{
-}
-
-void LogConfig::SetStatusBarPrinter(bool statusBarShow)
-{
-    m_ShowStatusBar = statusBarShow;
-    std::cout << "m_ShowStatusBar is " << m_ShowStatusBar << std::endl;
-}
-
-void LogConfig::SetMaxSeverity(int traceLevel)
-{
-    if (traceLevel > LOG_SEV_VERBOSE)
-    {
-        fprintf(stderr, "Invalid trace level, setting %d\n", LOG_SEV_VERBOSE);
-        m_MaxSeverity = LOG_SEV_VERBOSE;
-    }
-    else
-    {
-        m_MaxSeverity = static_cast<LogSeverity>(traceLevel);
-        fprintf(stdout, "Setting trace level to %d\n", m_MaxSeverity);
-    }
-}
-
-// *************************************************************************************************
-
-const char* LogMsgPrefix::SeverityToString(LogSeverity sev)
-{
-    static const char* const pSeverityToString[] = { "ERR", "WRN", "INF", "DBG", "VRB" };
-
-    size_t index = static_cast<size_t>(sev);
-    if (index >= sizeof(pSeverityToString) / sizeof(pSeverityToString[0]))
-    {
-        return "---";
-    }
-
-    return pSeverityToString[index];
-}
-
-std::ostream& operator<<(std::ostream& os, const LogMsgPrefix& prefix)
-{
-    os << '[' << LogMsgPrefix::SeverityToString(prefix.Severity) << "] ";
-    if (!g_LogConfig.ShouldPrintLocation()) return os;
-    return os << "(" << prefix.File << ':' << prefix.Line << ") ";
-}
diff --git a/debug-tools/host_manager_11ad/DebugLogger.h b/debug-tools/host_manager_11ad/DebugLogger.h
deleted file mode 100644
index 5ccd170..0000000
--- a/debug-tools/host_manager_11ad/DebugLogger.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef  _DEBUGLOGGER_H_
-#define _DEBUGLOGGER_H_
-
-#include <iostream>
-
-// Severity values are expected to raise from zero
-enum LogSeverity
-{
-    LOG_SEV_ERROR   = 0,   // Unexpected input/events that may cause server misbehavior
-    LOG_SEV_WARNING = 1,   // Suspicious events
-    LOG_SEV_INFO    = 2,   // Events like command/response
-    LOG_SEV_DEBUG   = 3,   // Detailed functionality
-    LOG_SEV_VERBOSE = 4,   // Excessive debug
-};
-
-#define TRACE_WITH_PREFIX(SEV)                                          \
-    g_LogConfig.ShouldPrint(SEV) && std::cout << LogMsgPrefix(SEV, __FILE__, __LINE__)
-
-
-#define LOG_ERROR   TRACE_WITH_PREFIX(LOG_SEV_ERROR)
-#define LOG_WARNING TRACE_WITH_PREFIX(LOG_SEV_WARNING)
-#define LOG_INFO    TRACE_WITH_PREFIX(LOG_SEV_INFO)
-#define LOG_DEBUG   TRACE_WITH_PREFIX(LOG_SEV_DEBUG)
-#define LOG_VERBOSE TRACE_WITH_PREFIX(LOG_SEV_VERBOSE)
-
-#define LOG_STATUS                                             \
-    g_LogConfig.ShouldPrintStatus()
-
-
-// Decoupling from system assert allows to print an error message when
-// assert is disabled.
-#define LOG_ASSERT(CONDITION)                                           \
-    do {                                                                \
-        if (!(CONDITION)) {                                             \
-            LOG_ERROR << "ASSERTION FAILURE: " << #CONDITION            \
-                << " at " << __FILE__ << ':' << __LINE__                \
-                << std::endl;                                           \
-                if (g_LogConfig.ShouldExitOnAssert()) exit(1);          \
-        }                                                               \
-    } while (false)
-
-// *************************************************************************************************
-
-struct LogConfig
-{
-public:
-    LogConfig(LogSeverity maxSeverity, bool bPrintLocation);
-    void SetMaxSeverity(int traceLevel);
-    void SetStatusBarPrinter(bool showStatusBar);
-
-    bool ShouldPrint(LogSeverity sev) const { return sev <= m_MaxSeverity; }
-    bool ShouldPrintStatus() const
-    {
-        return m_ShowStatusBar;
-    }
-    bool ShouldPrintLocation() const { return m_PrintLocation; }
-    bool ShouldExitOnAssert() const { return m_ExitOnAssert; }
-
-private:
-
-    LogSeverity m_MaxSeverity;
-    bool m_ShowStatusBar;
-    const bool m_PrintLocation;
-    const bool m_ExitOnAssert;
-
-};
-
-// *************************************************************************************************
-
-extern LogConfig g_LogConfig;
-
-// *************************************************************************************************
-
-class LogMsgPrefix
-{
-    friend std::ostream& operator<<(std::ostream& os, const LogMsgPrefix& prefix);
-
-public:
-
-    LogMsgPrefix(LogSeverity severity, const char* pFile, int line)
-        : Severity(severity), File(pFile), Line(line) {}
-
-private:
-
-    static const char* SeverityToString(LogSeverity sev);
-
-    const LogSeverity Severity;
-    const char* const File;
-    const int Line;
-};
-
-
-// *************************************************************************************************
-// Stream Formatters
-// *************************************************************************************************
-
-// Print a boolean value as a string
-struct BoolStr
-{
-    explicit BoolStr(bool value): Value(value) {}
-    const bool Value;
-};
-
-inline std::ostream& operator<<(std::ostream& os, const BoolStr& boolStr)
-{
-    return os << std::boolalpha << boolStr.Value << std::noboolalpha;
-}
-
-// *************************************************************************************************
-
-// Print a boolean value as a Success/Failure string
-struct SuccessStr
-{
-    explicit SuccessStr(bool value): Value(value) {}
-    const bool Value;
-};
-
-inline std::ostream& operator<<(std::ostream& os, const SuccessStr& successStr)
-{
-    return os << (successStr.Value ? "Success" : "Failure");
-}
-
-// *************************************************************************************************
-
-// Print a string while displaying newline characters
-struct PlainStr
-{
-    explicit PlainStr(const std::string& value): Value(value) {}
-    const std::string& Value;
-};
-
-inline std::ostream& operator<<(std::ostream& os, const PlainStr& plainStr)
-{
-    for (std::string::const_iterator it = plainStr.Value.begin(); it != plainStr.Value.end(); ++it)
-    {
-        switch (*it)
-        {
-        case '\r': os << "\\r"; break;
-        case '\n': os << "\\n"; break;
-        case '\t': os << "\\t"; break;
-        default:   os << *it; break;
-        }
-    }
-
-    return os;
-}
-
-
-#endif // ! _DEBUGLOGGER_H_
diff --git a/debug-tools/host_manager_11ad/Device.cpp b/debug-tools/host_manager_11ad/Device.cpp
deleted file mode 100644
index 663e3af..0000000
--- a/debug-tools/host_manager_11ad/Device.cpp
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <map>
-
-#include "Device.h"
-#include "Host.h"
-
-Device::Device(const string& deviceName) :
-    m_basebandType(BASEBAND_TYPE_NONE),
-    m_driver(AccessLayer::OpenDriver(deviceName)),
-    m_isSilent(false),
-    m_deviceName(deviceName),
-    m_capabilitiesMask((DWORD)0)
-{
-    m_isAlive = ReadDeviceFwInfoInternal(m_fwVersion, m_fwTimestamp);
-    if (m_isAlive)
-    {
-        RegisterDriverControlEvents();
-    }
-}
-
-bool Device::Init()
-{
-    // log collector initialization
-    m_logCollectors.clear();
-    unique_ptr<log_collector::LogCollector> fwTracer(new log_collector::LogCollector(this, CPU_TYPE_FW));
-    m_logCollectors.insert(make_pair(CPU_TYPE_FW, move(fwTracer)));
-    unique_ptr<log_collector::LogCollector> ucodeTracer(new log_collector::LogCollector(this, CPU_TYPE_UCODE));
-    m_logCollectors.insert(make_pair(CPU_TYPE_UCODE, move(ucodeTracer)));
-
-    if (Host::GetHost().GetDeviceManager().GetLogCollectionMode())
-    {
-        StartLogCollector();
-    }
-
-    return true;
-}
-
-bool Device::Fini()
-{
-    if (Host::GetHost().GetDeviceManager().GetLogCollectionMode())
-    {
-        StopLogCollector();
-    }
-    m_logCollectors.clear();
-    return true;
-}
-
-BasebandType Device::GetBasebandType()
-{
-    if (m_basebandType == BASEBAND_TYPE_NONE)
-    {
-        m_basebandType = ReadBasebandType();
-    }
-
-    return m_basebandType;
-}
-
-void Device::SetCapability(CAPABILITIES capability, bool isTrue)
-{
-    const DWORD mask = (DWORD)1 << capability;
-    m_capabilitiesMask = isTrue ? m_capabilitiesMask | mask : m_capabilitiesMask & ~mask;
-}
-
-bool Device::IsCapabilitySet(CAPABILITIES capability) const
-{
-    return (m_capabilitiesMask & (DWORD)1 << capability) != (DWORD)0;
-}
-
-BasebandType Device::ReadBasebandType() const
-{
-    DWORD jtagVersion = Utils::REGISTER_DEFAULT_VALUE;
-    const int rev_id_address = 0x880B34; //USER.JTAG.USER_USER_JTAG_1.dft_idcode_dev_id
-    const int device_id_mask = 0x0fffffff; //take the first 28 bits from the Jtag Id
-    BasebandType res = BASEBAND_TYPE_NONE;
-
-    if (!m_driver->Read(rev_id_address, jtagVersion))
-    {
-        LOG_ERROR << "Failed to read baseband type" << "\n";
-    }
-
-    LOG_INFO << "JTAG rev ID = " << hex << jtagVersion << "\n";
-
-    switch (jtagVersion & device_id_mask)
-    {
-    case 0x612072F:
-        res = BASEBAND_TYPE_MARLON;
-        break;
-    case 0x632072F:
-        res = BASEBAND_TYPE_SPARROW;
-        break;
-    case 0x642072F:
-    case 0x007E0E1:
-        res = BASEBAND_TYPE_TALYN;
-        break;
-    default:
-        ////LOG_MESSAGE_WARN("Invalid device type - assuming Sparrow");
-        res = BASEBAND_TYPE_SPARROW;
-        break;
-    }
-
-    return res;
-}
-
-bool Device::RegisterDriverControlEvents()
-{
-    CAPABILITIES capability = DRIVER_CONTROL_EVENTS;
-
-    bool supportedCommand = GetDriver()->RegisterDriverControlEvents();
-
-    if (!supportedCommand)
-    {
-        SetCapability(capability, false);
-        return false;
-    }
-    SetCapability(capability, true);
-
-    return true;
-}
-
-vector<unique_ptr<HostManagerEventBase>> Device::Poll(void)
-{
-    // TODO: implement polling: MB, logs, rgf
-
-    vector<unique_ptr<HostManagerEventBase>> events;
-    events.reserve(3U);
-    lock_guard<mutex> lock(m_mutex);
-
-    PollFwVersion(events);
-    PollLogs(events);
-
-    return events;
-}
-
-void Device::PollFwVersion(vector<unique_ptr<HostManagerEventBase>>& events)
-{
-    FwVersion fwVersion;
-    FwTimestamp fwTimestamp;
-
-    m_isAlive = ReadDeviceFwInfoInternal(fwVersion, fwTimestamp);
-    if (m_isAlive && !(m_fwVersion == fwVersion && m_fwTimestamp == fwTimestamp))
-    {
-        m_fwVersion = fwVersion;
-        m_fwTimestamp = fwTimestamp;
-
-        events.emplace_back(new NewDeviceDiscoveredEvent(GetDeviceName(), m_fwVersion, m_fwTimestamp));
-    }
-}
-
-void Device::PollLogs(vector<unique_ptr<HostManagerEventBase>>& events)
-{
-    std::vector<log_collector::RawLogLine> rawLogLines;
-
-    for (auto& logCollector : m_logCollectors)
-    {
-        if (!logCollector.second->IsInitialized())
-        {
-            logCollector.second->PrepareLogCollection();
-        }
-        if (logCollector.second->CollectionIsNeeded())
-        {
-            logCollector.second->GetNextLogs(rawLogLines);
-        }
-
-        if (rawLogLines.size() > 0)
-        {
-            events.emplace_back(new NewLogsEvent(GetDeviceName(), CPU_TYPE_FW, rawLogLines));
-        }
-        rawLogLines.clear();
-    }
-}
-
-bool Device::StartLogCollector()
-{
-    for (auto it = m_logCollectors.begin(); it != m_logCollectors.end(); ++it)
-    {
-        it->second->StartCollectingLogs();
-    }
-
-    return true;
-}
-
-bool Device::StopLogCollector()
-{
-    for (auto it = m_logCollectors.begin(); it != m_logCollectors.end(); ++it)
-    {
-        it->second->StopCollectingLogs();
-    }
-
-    return true;
-}
-
-log_collector::LogCollector* Device::GetLogCollector(CpuType type)
-{
-    auto found = m_logCollectors.find(type);
-    if (m_logCollectors.end() != found)
-    {
-        return found->second.get();
-    }
-    return nullptr;
-}
-
-
-bool Device::AddCustomRegister(const string& name, int address)
-{
-    if (m_customRegisters.find(name) != m_customRegisters.end())
-    {
-        // Register already exists
-        return false;
-    }
-
-    m_customRegisters[name] = address;
-
-    return true;
-}
-
-bool Device::RemoveCustomRegister(const string& name)
-{
-    if (m_customRegisters.find(name) == m_customRegisters.end())
-    {
-        // Register already does not exist
-        return false;
-    }
-
-    m_customRegisters.erase(name);
-
-    return true;
-}
-
-std::map<string, int>& Device::GetCustomRegisters()
-{
-    return m_customRegisters;
-}
-
-// Internal service for fetching the FW version and compile time
-// Note: The device lock should be acquired by the caller
-bool Device::ReadDeviceFwInfoInternal(FwVersion& fwVersion, FwTimestamp& fwTimestamp) const
-{
-    // FW version
-    bool readOk = m_driver->Read(FW_VERSION_MAJOR_REGISTER, fwVersion.m_major);
-    readOk &= m_driver->Read(FW_VERSION_MINOR_REGISTER, fwVersion.m_minor);
-    readOk &= m_driver->Read(FW_VERSION_SUB_MINOR_REGISTER, fwVersion.m_subMinor);
-    readOk &= m_driver->Read(FW_VERSION_BUILD_REGISTER, fwVersion.m_build);
-
-    // FW compile time
-    readOk &= m_driver->Read(FW_TIMESTAMP_HOUR_REGISTER, fwTimestamp.m_hour);
-    readOk &= m_driver->Read(FW_TIMESTAMP_MINUTE_REGISTER, fwTimestamp.m_min);
-    readOk &= m_driver->Read(FW_TIMESTAMP_SECOND_REGISTER, fwTimestamp.m_sec);
-    readOk &= m_driver->Read(FW_TIMESTAMP_DAY_REGISTER, fwTimestamp.m_day);
-    readOk &= m_driver->Read(FW_TIMESTAMP_MONTH_REGISTER, fwTimestamp.m_month);
-    readOk &= m_driver->Read(FW_TIMESTAMP_YEAR_REGISTER, fwTimestamp.m_year);
-
-    if (!readOk)
-    {
-        LOG_ERROR << "Failed to read FW info for device " << GetDeviceName() << endl;
-    }
-
-    return readOk;
-}
diff --git a/debug-tools/host_manager_11ad/Device.h b/debug-tools/host_manager_11ad/Device.h
deleted file mode 100644
index e0877c2..0000000
--- a/debug-tools/host_manager_11ad/Device.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _11AD_DEVICE_H_
-#define _11AD_DEVICE_H_
-
-#include <string>
-#include <vector>
-#include <set>
-#include <iostream>
-#include <memory>
-#include <mutex>
-
-#include "OperatingSystemConstants.h"
-#include "access_layer_11ad/Definitions.h"
-#include "../DebugLogger.h"
-#include "../DriverAPI.h"
-#include "AccessLayerAPI.h"
-#include "EventsDefinitions.h"
-#include "HostDefinitions.h"
-#include "LogCollector.h"
-#include <thread>
-
-using namespace std;
-
-class Device
-{
-public:
-    explicit Device(const string& deviceName);
-
-    virtual ~Device() {}
-
-    // Functionality common to all devices
-
-    bool Init();
-
-    bool Fini();
-
-    bool IsValid() const { return m_driver != nullptr; }
-
-    const string& GetDeviceName(void) const { return m_deviceName; }
-
-    bool SendWmi(DWORD command, vector<DWORD> payload)
-    {
-        //do something with params
-        (void)command;
-        (void)payload;
-        return false;
-
-    }
-
-    vector<DWORD> GetWmiEvent()
-    {
-
-        vector<DWORD> ret;
-        return ret;
-    }
-
-    std::vector<unique_ptr<HostManagerEventBase>> Poll(void);
-
-    // ************************** [END] Device API **********************//
-
-    BasebandType GetBasebandType();
-
-    bool GetSilenceMode() const { return m_isSilent; }
-
-    void SetSilenceMode(bool silentMode) { m_isSilent = silentMode;    }
-
-    DriverAPI* GetDriver() const { return m_driver.get(); }
-
-    //TODO: make private after blocking simultaneous driver actions
-    mutable mutex m_mutex; // threads synchronization
-
-    bool GetIsAlive(void) const { return m_isAlive; }
-
-    const FwVersion& GetFwVersion(void) const { return m_fwVersion; }
-
-    const FwTimestamp& GetFwTimestamp(void) const { return m_fwTimestamp; }
-
-    DWORD GetCapabilities(void) const { return m_capabilitiesMask; }
-
-    // ************************ Log Collector *************************//
-    bool StartLogCollector(); // TODO - use GetLogCollector functions instead of this one and remove this function
-
-    bool StopLogCollector(); // TODO - use GetLogCollector functions instead of this one and remove this function
-
-    log_collector::LogCollector* GetLogCollector(CpuType type);
-
-    // *********************** [END] Log Collector *******************//
-
-    // ************************ Custom Regs *************************//
-    bool AddCustomRegister(const string& name, int address);
-
-    bool RemoveCustomRegister(const string& name);
-
-    std::map<string, int>& GetCustomRegisters();
-    // *********************** [END] Custom Regs *******************//
-
-private:
-    BasebandType m_basebandType;
-    unique_ptr<DriverAPI> m_driver;
-    bool m_isSilent;
-    bool m_isAlive;
-    string m_deviceName;
-    FwVersion m_fwVersion;
-    FwTimestamp m_fwTimestamp;
-    map<CpuType,unique_ptr<log_collector::LogCollector>> m_logCollectors;
-
-    BasebandType ReadBasebandType() const;
-
-    // Custom registers
-    std::map<std::string, int> m_customRegisters;
-
-    bool RegisterDriverControlEvents();
-
-    // Internal service for fetching the FW version and compile time
-    bool ReadDeviceFwInfoInternal(FwVersion& fwVersion, FwTimestamp& fwTimestamp) const;
-
-    void PollFwVersion(vector<unique_ptr<HostManagerEventBase>>& events);
-    void PollLogs(vector<unique_ptr<HostManagerEventBase>>& events);
-
-    enum FwInfoRegisters : DWORD
-    {
-        FW_VERSION_MAJOR_REGISTER        = 0x880a2c,
-        FW_VERSION_MINOR_REGISTER        = 0x880a30,
-        FW_VERSION_SUB_MINOR_REGISTER    = 0x880a34,
-        FW_VERSION_BUILD_REGISTER        = 0x880a38,
-        FW_TIMESTAMP_HOUR_REGISTER        = 0x880a14,
-        FW_TIMESTAMP_MINUTE_REGISTER    = 0x880a18,
-        FW_TIMESTAMP_SECOND_REGISTER    = 0x880a1c,
-        FW_TIMESTAMP_DAY_REGISTER        = 0x880a20,
-        FW_TIMESTAMP_MONTH_REGISTER        = 0x880a24,
-        FW_TIMESTAMP_YEAR_REGISTER        = 0x880a28
-    };
-
-    // Capabilities region:
-    DWORD m_capabilitiesMask;
-
-    // each value in the enum represents a bit in the DWORD (the values would be 1,2,3,4...)
-    enum CAPABILITIES : DWORD
-    {
-        DRIVER_CONTROL_EVENTS // capability of the driver to send and receive driver control commands and events
-    };
-
-    void SetCapability(CAPABILITIES capability, bool isTrue);
-    bool IsCapabilitySet(CAPABILITIES capability) const;
-};
-
-#endif // !_11AD_DEVICE_H_
diff --git a/debug-tools/host_manager_11ad/DeviceManager.cpp b/debug-tools/host_manager_11ad/DeviceManager.cpp
deleted file mode 100644
index ce2e816..0000000
--- a/debug-tools/host_manager_11ad/DeviceManager.cpp
+++ /dev/null
@@ -1,1232 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <chrono>
-#include <sstream>
-
-#include "DeviceManager.h"
-#include "Utils.h"
-#include "AccessLayerAPI.h"
-#include "DebugLogger.h"
-#include "Utils.h"
-#include "Host.h"
-
-using namespace std;
-
-// Initialize translation maps for the front-end data
-const static std::string sc_noRfStr("NO_RF");
-const std::unordered_map<int, std::string> DeviceManager::m_rfTypeToString = { {0, sc_noRfStr }, {1, "MARLON"}, {2, "SPR-R"}, {3, "TLN-A1"}, { 4, "TLN-A2" } };
-
-const std::unordered_map<int, std::string> DeviceManager::m_basebandTypeToString =
-{
-    { 0, "UNKNOWN" }, { 1, "MAR-DB1" }, { 2, "MAR-DB2" },
-    { 3, "SPR-A0"  }, { 4, "SPR-A1"  }, { 5, "SPR-B0"  },
-    { 6, "SPR-C0"  }, { 7, "SPR-D0"  }, { 8, "TLN-M-A0"  },
-    { 9, "TLN-M-B0" }
-};
-
-const std::unordered_map<int, std::string> DeviceManager::m_boardfileTypeToString =
-{
-    { 0, "UNDEFINED" },
-    { 1, "generic_single_ant" },
-    { 2, "generic_SIP" },
-    { 3, "generic_reduced_size" },
-    { 4, "generic_patches_only" },
-    { 5, "generic_500mW" },
-    { 6, "generic_500mW_removed_RF" },
-    { 16, "ROGERS" },
-    { 32, "GENERIC_LTCC" },
-    { 48, "REGULATORY_LTCC" },
-    { 64, "FeiDao_6430u" },
-    { 80, "GENERIC_FALCON" },
-    { 112, "DELL_E7440_non-touch" },
-    { 113, "DELL_E7240_non" },
-    { 114, "DELL_E7440_touch" },
-    { 115, "DELL_E7240_touch" },
-    { 128, "Corse" },
-    { 144, "DELL_E5440" },
-    { 160, "MURATA_DELL_D5000" },
-    { 176, "DELL_XPS13" },
-    { 192, "TOSHIBA_Z10" },
-    { 208, "Semco_Sip" },
-    { 209, "Semco_Sip_rev1_3" },
-    { 224, "MTP-BStep" },
-    { 225, "MTP-CStep" },
-    { 240, "Liquid" },
-    { 257, "Murata SI" }
-};
-
-DeviceManager::DeviceManager(std::promise<void>& eventsTCPServerReadyPromise) :
-    m_deviceManagerRestDurationMs(500),
-    m_terminate(false),
-    m_collectLogs(false)
-{
-    m_deviceManager = thread(&DeviceManager::PeriodicTasks, this, std::ref(eventsTCPServerReadyPromise));
-}
-
-DeviceManager::~DeviceManager()
-{
-    m_terminate = true;
-    m_deviceManager.join();
-}
-
-string DeviceManager::GetDeviceManagerOperationStatusString(DeviceManagerOperationStatus status)
-{
-    switch (status)
-    {
-    case dmosSuccess:
-        return "Successful operation";
-    case dmosNoSuchConnectedDevice:
-        return "Unknown device";
-    case dmosFailedToReadFromDevice:
-        return "Read failure";
-    case dmosFailedToWriteToDevice:
-        return "Write failure";
-    case dmosFailedToResetInterface:
-        return "Reset interface failure";
-    case dmosFailedToResetSw:
-        return "SW reset failure";
-    case dmosFailedToAllocatePmc:
-        return "Allocate PMC failure";
-    case dmosFailedToDeallocatePmc:
-        return "Deallocate PMC failure";
-    case dmosFailedToCreatePmcFile:
-        return "Create PMC file failure";
-    case dmosFailedToSendWmi:
-        return "Send WMI failure";
-    case dmosFail:
-        return "Operation failure";
-    case dmosSilentDevice:
-        return "Device is in silent mode";
-    default:
-        return "DeviceManagerOperationStatus is unknown ";
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::GetDevices(set<string>& devicesNames)
-{
-    devicesNames.clear();
-    m_connectedDevicesMutex.lock();
-    for (auto& device : m_devices)
-    {
-        devicesNames.insert(device.first);
-    }
-    m_connectedDevicesMutex.unlock();
-    return dmosSuccess;
-}
-
-std::shared_ptr<Device> DeviceManager::GetDeviceByName(const std::string& deviceName)
-{
-    m_connectedDevicesMutex.lock();
-    for (auto& device : m_devices)
-    {
-        if (deviceName == device.first)
-        {
-            m_connectedDevicesMutex.unlock();
-            return device.second;
-        }
-    }
-    m_connectedDevicesMutex.unlock();
-    return nullptr;
-}
-
-DeviceManagerOperationStatus DeviceManager::OpenInterface(const string& deviceName)
-{
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosSuccess;
-    }
-    m_connectedDevicesMutex.unlock();
-    return dmosNoSuchConnectedDevice;
-}
-
-DeviceManagerOperationStatus DeviceManager::CloseInterface(const string& deviceName)
-{
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosSuccess;
-    }
-    m_connectedDevicesMutex.unlock();
-    return dmosNoSuchConnectedDevice;
-}
-
-DeviceManagerOperationStatus DeviceManager::Read(const string& deviceName, DWORD address, DWORD& value)
-{
-    if (IsDeviceSilent(deviceName))
-    {
-        return dmosSilentDevice;
-    }
-
-    if ((0 == address) || (0 != address % 4) || (0xFFFFFFFF == address))
-    {
-        return dmosInvalidAddress;
-    }
-
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->GetDriver()->Read(address, value);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            value = Utils::REGISTER_DEFAULT_VALUE;
-            status = dmosFailedToReadFromDevice;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        value = Utils::REGISTER_DEFAULT_VALUE;
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::Write(const string& deviceName, DWORD address, DWORD value)
-{
-    if (IsDeviceSilent(deviceName))
-    {
-        return dmosSilentDevice;
-    }
-
-    if ((0 == address) || (0 != address % 4) || (0xFFFFFFFF == address))
-    {
-        return dmosInvalidAddress;
-    }
-
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->GetDriver()->Write(address, value);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            status = dmosFailedToWriteToDevice;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::ReadBlock(const string& deviceName, DWORD address, DWORD blockSize, vector<DWORD>& values)
-{
-    if (IsDeviceSilent(deviceName))
-    {
-        return dmosSilentDevice;
-    }
-
-    if ((0 == address) || (0 != address % 4) || (0xFFFFFFFF == address))
-    {
-        return dmosInvalidAddress;
-    }
-
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->GetDriver()->ReadBlock(address, blockSize, values);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            vector<DWORD> defaultValues(blockSize, Utils::REGISTER_DEFAULT_VALUE);
-            status = dmosFailedToReadFromDevice;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        vector<DWORD> defaultValues(blockSize, Utils::REGISTER_DEFAULT_VALUE);
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::WriteBlock(const string& deviceName, DWORD address, const vector<DWORD>& values)
-{
-    if (IsDeviceSilent(deviceName))
-    {
-        return dmosSilentDevice;
-    }
-
-    if ((0 == address) || (0 != address % 4) || (0xFFFFFFFF == address))
-    {
-        return dmosInvalidAddress;
-    }
-
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->GetDriver()->WriteBlock(address, values);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            status = dmosFailedToWriteToDevice;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::InterfaceReset(const string& deviceName)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        m_devices[deviceName]->GetDriver()->Reset(); // TODO - we need to separate between SW reset and interface reset
-        status = dmosSuccess;
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::SwReset(const string& deviceName)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = false; //  m_devices[deviceName]->GetDriver()->Reset(); // TODO
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            status = dmosFailedToResetSw;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::SetDriverMode(const string& deviceName, int newMode, int& oldMode)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->GetDriver()->SetDriverMode(newMode, oldMode);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            status = dmosFailedToResetSw;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::DriverControl(const string& deviceName, uint32_t Id, const void *inBuf, uint32_t inBufSize, void *outBuf, uint32_t outBufSize)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->GetDriver()->DriverControl(Id, inBuf, inBufSize, outBuf, outBufSize);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            status = dmosFailedToReadFromDevice;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::AllocPmc(const string& deviceName, unsigned descSize, unsigned descNum, string& errorMsg)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-
-        bool success = m_devices[deviceName]->GetDriver()->AllocPmc(descSize, descNum, errorMsg);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            LOG_ERROR << "Failed to allocate PMC ring: " << errorMsg << std::endl;
-            status = dmosFailedToAllocatePmc;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        errorMsg = "No device found";
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::DeallocPmc(const string& deviceName, std::string& outMessage)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-
-        bool success = m_devices[deviceName]->GetDriver()->DeallocPmc(outMessage);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            LOG_ERROR << "Failed to de-allocate PMC ring: " << outMessage << std::endl;
-            status = dmosFailedToDeallocatePmc;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::CreatePmcFile(const string& deviceName, unsigned refNumber, std::string& outMessage)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->GetDriver()->CreatePmcFile(refNumber, outMessage);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            status = dmosFailedToCreatePmcFile;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::FindPmcFile(const string& deviceName, unsigned refNumber, std::string& outMessage)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->GetDriver()->FindPmcFile(refNumber, outMessage);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            status = dmosFailedToCreatePmcFile;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-DeviceManagerOperationStatus DeviceManager::SendWmi(const string& deviceName, DWORD command, const vector<DWORD>& payload)
-{
-    if (IsDeviceSilent(deviceName))
-    {
-        return dmosSilentDevice;
-    }
-
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        m_devices[deviceName]->m_mutex.lock();
-        m_connectedDevicesMutex.unlock();
-        bool success = m_devices[deviceName]->SendWmi(command, payload);
-        if (success)
-        {
-            status = dmosSuccess;
-        }
-        else
-        {
-            status = dmosFailedToSendWmi;
-        }
-        m_devices[deviceName]->m_mutex.unlock();
-        return status;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        return dmosNoSuchConnectedDevice;
-    }
-}
-
-void DeviceManager::CreateDevice(const string& deviceName)
-{
-    m_connectedDevicesMutex.lock();
-    shared_ptr<Device> device(new Device(deviceName));
-    device->Init();
-    m_devices.insert(make_pair(deviceName, device));
-    m_connectedDevicesMutex.unlock();
-
-    if (device->GetIsAlive())
-    {
-        // Notify that new device discovered, also relevant for case of FW update
-        Host::GetHost().PushEvent(NewDeviceDiscoveredEvent(deviceName, device->GetFwVersion(), device->GetFwTimestamp()));
-    }
-    else
-    {
-        // Delete unresponsive device, lock is acquired inside
-        // Note: Can happen if device becomes unresponsive after enumeration
-        DeleteDevice(deviceName);
-        LOG_INFO << "Created unresponsive device '" << deviceName << "', removing..." << endl;
-    }
-}
-
-void DeviceManager::DeleteDevice(const string& deviceName)
-{
-    m_connectedDevicesMutex.lock();
-    // make sure that no client is using this object
-    m_devices[deviceName]->m_mutex.lock();
-    m_devices[deviceName]->Fini();
-    // no need that the mutex will be still locked since new clients have to get m_connectedDevicesMutex before they try to get m_mutex
-    m_devices[deviceName]->m_mutex.unlock();
-    m_devices.erase(deviceName);
-    m_connectedDevicesMutex.unlock();
-}
-
-void DeviceManager::UpdateConnectedDevices()
-{
-    vector<string> devicesForRemove;
-    // Delete unresponsive devices
-    m_connectedDevicesMutex.lock();
-    for (auto& connectedDevice : m_devices)
-    {
-        if (connectedDevice.second->GetSilenceMode()) //GetSilenceMode returns true if the device is silent the skip th update
-        {
-            continue;
-        }
-
-        connectedDevice.second->m_mutex.lock();
-        if (!connectedDevice.second->GetDriver()->IsValid())
-        {
-            devicesForRemove.push_back(connectedDevice.first);
-        }
-        connectedDevice.second->m_mutex.unlock();
-    }
-    m_connectedDevicesMutex.unlock();
-
-    for (auto& device : devicesForRemove)
-    {
-        DeleteDevice(device);
-    }
-
-    devicesForRemove.clear();
-
-    set<string> currentlyConnectedDevices = AccessLayer::GetDrivers();
-
-    // delete devices that arn't connected anymore according to enumeration
-    for (auto& connectedDevice : m_devices)
-    {
-        if (connectedDevice.second->GetSilenceMode()) //GetSilenceMode retunrs true if the device is silent the skip th update
-        {
-            continue;
-        }
-
-        if (0 == currentlyConnectedDevices.count(connectedDevice.first))
-        {
-            devicesForRemove.push_back(connectedDevice.first);
-        }
-    }
-    for (auto& device : devicesForRemove)
-    {
-        DeleteDevice(device);
-    }
-
-    // add new connected devices
-    vector<string> newDevices;
-    m_connectedDevicesMutex.lock();
-    for (auto& currentlyConnectedDevice : currentlyConnectedDevices)
-    {
-        if (0 == m_devices.count(currentlyConnectedDevice))
-        {
-            newDevices.push_back(currentlyConnectedDevice);
-        }
-    }
-    m_connectedDevicesMutex.unlock();
-
-    for (auto& device : newDevices)
-    {
-        CreateDevice(device);
-    }
-}
-
-void DeviceManager::PeriodicTasks(std::promise<void>& eventsTCPServerReadyPromise)
-{
-    // wait for events TCP server readiness before running the main loop
-    auto status = eventsTCPServerReadyPromise.get_future().wait_for(std::chrono::seconds(5));
-    if (status == std::future_status::timeout)
-    {
-        LOG_ERROR << "DeviceManager: Events TCP Server did not become ready before timeout duration has passed";
-    }
-
-    while (!m_terminate)
-    {
-        UpdateConnectedDevices();
-
-        // get local copy of m_devices not to hold the lock
-        m_connectedDevicesMutex.lock();
-        auto devices = m_devices;
-        m_connectedDevicesMutex.unlock();
-
-        for (auto& device : devices)
-        {
-            if (device.second->GetSilenceMode()) //GetSilenceMode retunrs true if the device is silent the skip the periodic task
-            {
-                continue;
-            }
-
-            std::vector<unique_ptr<HostManagerEventBase>> events = device.second->Poll();
-            for (const auto& event : events)
-            {
-                Host::GetHost().PushEvent(*event.get());
-            }
-        }
-        this_thread::sleep_for(std::chrono::milliseconds(m_deviceManagerRestDurationMs));
-    }
-}
-
-bool DeviceManager::IsDeviceSilent(const string& deviceName)
-{
-    bool isSilent = false;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) <= 0)
-    {
-        m_connectedDevicesMutex.unlock();
-        return isSilent;
-    }
-
-    if ((NULL == m_devices[deviceName].get()) || (!m_devices[deviceName]->IsValid()))
-    {
-        LOG_ERROR << "Invalid device pointer in IsDeviceSilent (NULL)" << endl;
-        m_connectedDevicesMutex.unlock();
-        return isSilent;
-    }
-
-    m_devices[deviceName]->m_mutex.lock();
-    m_connectedDevicesMutex.unlock();
-
-    isSilent = m_devices[deviceName]->GetSilenceMode();
-
-    m_devices[deviceName]->m_mutex.unlock();
-
-    return isSilent;
-}
-
-bool DeviceManager::GetDeviceStatus(vector<DeviceData>& devicesData)
-{
-    // Lock the devices
-    lock_guard<mutex> lock(m_connectedDevicesMutex);
-
-    auto devices = m_devices;
-
-    for (auto& device : devices)
-    {
-        // Lock the specific device
-        lock_guard<mutex> lock(device.second->m_mutex);
-
-        // Create device data
-        DeviceData deviceData;
-
-        // Extract FW version
-        deviceData.m_fwVersion = device.second->GetFwVersion();
-
-        DWORD value = Utils::REGISTER_DEFAULT_VALUE;
-
-        // Read FW assert code
-        device.second->GetDriver()->Read(FW_ASSERT_REG, value);
-        deviceData.m_fwAssert = value;
-
-        // Read uCode assert code
-        device.second->GetDriver()->Read(UCODE_ASSERT_REG, value);
-        deviceData.m_uCodeAssert = value;
-
-        // Read FW association state
-        device.second->GetDriver()->Read(FW_ASSOCIATION_REG, value);
-        deviceData.m_associated = (value == FW_ASSOCIATED_VALUE);
-
-        // Read MCS value
-        device.second->GetDriver()->Read(MCS_REG, value);
-        deviceData.m_mcs = value;
-
-        // Get FW compilation timestamp
-        deviceData.m_compilationTime = device.second->GetFwTimestamp();
-
-        // Get Device name
-        deviceData.m_deviceName = device.second->GetDeviceName();
-
-        // Get baseband name & RF type
-        // BB type is stored in 2 lower bytes of device type register
-        // RF type is stored in 2 upper bytes of device type register
-        device.second->GetDriver()->Read(DEVICE_TYPE_REG, value);
-        const auto basebandTypeIter = m_basebandTypeToString.find(value & 0xFFFF);
-        deviceData.m_hwType = basebandTypeIter != m_basebandTypeToString.cend() ? basebandTypeIter->second : std::string("UNKNOWN");
-        const auto rfTypeIter = m_rfTypeToString.find((value & 0xFFFF0000) >> 16);
-        deviceData.m_rfType = rfTypeIter != m_rfTypeToString.cend() ? rfTypeIter->second : sc_noRfStr;
-
-        // Get FW mode
-        device.second->GetDriver()->Read(FW_MODE_REG, value);
-        deviceData.m_mode = (value == 0) ? "Operational" : "WMI Only";
-
-        // Get boot loader version
-        device.second->GetDriver()->Read(BOOT_LOADER_VERSION_REG, value);
-        std::ostringstream oss;
-        oss << value;
-        deviceData.m_bootloaderVersion = oss.str();
-
-        // Get channel number
-        device.second->GetDriver()->Read(CHANNEL_REG, value);
-        int Channel = 0;
-        switch (value)
-        {
-        case 0x64FCACE:
-            Channel = 1;
-            break;
-        case 0x68BA2E9:
-            Channel = 2;
-            break;
-        case 0x6C77B03:
-            Channel = 3;
-            break;
-        default:
-            Channel = 0;
-        }
-        deviceData.m_channel = Channel;
-
-        // Get board file version
-        device.second->GetDriver()->Read(BOARDFILE_REG, value);
-        const auto boardfileTypeIter = m_boardfileTypeToString.find((value & 0xFFF000) >> 12);
-        deviceData.m_boardFile = boardfileTypeIter != m_boardfileTypeToString.cend() ? boardfileTypeIter->second : std::string("UNDEFINED");
-
-        DWORD rfConnected = 0;
-        DWORD rfEnabled = 0;
-        device.second->GetDriver()->Read(RF_CONNECTED_REG, rfConnected);
-        device.second->GetDriver()->Read(RF_ENABLED_REG, rfEnabled);
-        rfEnabled = rfEnabled >> 8;
-
-        // Get RF state of each RF
-        for (int rfIndex = 0; rfIndex < MAX_RF_NUMBER; rfIndex++)
-        {
-            int rfState = 0;
-
-            if (rfConnected & (1 << rfIndex))
-            {
-                rfState = 1;
-            }
-
-            if (rfEnabled & (1 << rfIndex))
-            {
-                rfState = 2;
-            }
-
-            // TODO extract RF state for each RF
-            deviceData.m_rf.insert(deviceData.m_rf.end(), rfState);
-        }
-
-        ////////// Get fixed registers values //////////////////////////
-        RegisterData registerData;
-
-        // uCode Rx on fixed reg
-        device.second->GetDriver()->Read(UCODE_RX_ON_REG, value);
-        DWORD UcRxonhexVal16 = value && 0xFFFF;
-        string UcRxon;
-        switch (UcRxonhexVal16)
-        {
-        case 0:
-            UcRxon = "RX_OFF";
-            break;
-        case 1:
-            UcRxon = "RX_ONLY";
-            break;
-        case 2:
-            UcRxon = "RX_ON";
-            break;
-        default:
-            UcRxon = "Unrecognized";
-        }
-        registerData.m_name = "uCodeRxOn";
-        registerData.m_value = UcRxon;
-        deviceData.m_fixedRegisters.insert(deviceData.m_fixedRegisters.end(), registerData);
-
-        // BF Sequence fixed reg
-        device.second->GetDriver()->Read(BF_SEQ_REG, value);
-        oss.str("");
-        oss << value;
-        registerData.m_name = "BF_Seq";
-        registerData.m_value = oss.str();
-        deviceData.m_fixedRegisters.insert(deviceData.m_fixedRegisters.end(), registerData);
-
-        // BF Trigger fixed reg
-        device.second->GetDriver()->Read(BF_TRIG_REG, value);
-        string BF_TRIG = "";
-        switch (value)
-        {
-        case 1:
-            BF_TRIG = "MCS1_TH_FAILURE";
-            break;
-        case 2:
-            BF_TRIG = "MCS1_NO_BACK";
-            break;
-        case 4:
-            BF_TRIG = "NO_CTS_IN_TXOP";
-            break;
-        case 8:
-            BF_TRIG = "MAX_BCK_FAIL_TXOP";
-            break;
-        case 16:
-            BF_TRIG = "FW_TRIGGER ";
-            break;
-        case 32:
-            BF_TRIG = "MAX_BCK_FAIL_ION_KEEP_ALIVE";
-            break;
-        default:
-            BF_TRIG = "UNDEFINED";
-        }
-        registerData.m_name = "BF_Trig";
-        registerData.m_value = BF_TRIG;
-        deviceData.m_fixedRegisters.insert(deviceData.m_fixedRegisters.end(), registerData);
-
-        // Get NAV fixed reg
-        device.second->GetDriver()->Read(NAV_REG, value);
-        registerData.m_name = "NAV";
-        oss.str("");
-        oss << value;
-        registerData.m_value = oss.str();
-        deviceData.m_fixedRegisters.insert(deviceData.m_fixedRegisters.end(), registerData);
-
-        // Get TX Goodput fixed reg
-        device.second->GetDriver()->Read(TX_GP_REG, value);
-        string TX_GP = "NO_LINK";
-        if (value != 0)
-        {
-            oss.str("");
-            oss << value;
-            TX_GP = oss.str();
-        }
-        registerData.m_name = "TX_GP";
-        registerData.m_value = TX_GP;
-        deviceData.m_fixedRegisters.insert(deviceData.m_fixedRegisters.end(), registerData);
-
-        // Get RX Goodput fixed reg
-        device.second->GetDriver()->Read(RX_GP_REG, value);
-        string RX_GP = "NO_LINK";
-        if (value != 0)
-        {
-            oss.str("");
-            oss << value;
-            TX_GP = oss.str();
-        }
-        registerData.m_name = "RX_GP";
-        registerData.m_value = RX_GP;
-        deviceData.m_fixedRegisters.insert(deviceData.m_fixedRegisters.end(), registerData);
-
-        ////////////// Fixed registers end /////////////////////////
-
-        ////////////// Custom registers ////////////////////////////
-        for (auto& reg : device.second->GetCustomRegisters())
-        {
-            registerData.m_name = reg.first;
-            device.second->GetDriver()->Read(reg.second, value);
-            oss.str("");
-            oss << value;
-            registerData.m_value = oss.str();
-            deviceData.m_customRegisters.insert(deviceData.m_customRegisters.end(), registerData);
-        }
-
-        ////////////// Custom registers end ////////////////////////
-
-        ////////////// Temperatures ////////////////////////////////
-        // Baseband
-        device.second->GetDriver()->Read(BASEBAND_TEMPERATURE_REG, value);
-        float temperature = (float)value / 1000;
-        oss.str("");
-        oss.precision(2);
-        oss << fixed << temperature;
-        deviceData.m_hwTemp = oss.str();
-
-        // RF
-        if (deviceData.m_rfType != sc_noRfStr)
-        {
-            device.second->GetDriver()->Read(RF_TEMPERATURE_REG, value);
-            temperature = (float)value / 1000;
-            oss.str("");
-            oss.precision(2);
-            oss << fixed << temperature;
-            deviceData.m_rfTemp = oss.str();
-        }
-        else // no RF, temperature value is not relevant
-        {
-            deviceData.m_rfTemp = "";
-        }
-        ////////////// Temperatures end ///////////////////////////
-
-        // Add the device to the devices list
-        devicesData.insert(devicesData.end(), deviceData);
-    }
-
-    return true;
-}
-
-bool DeviceManager::AddRegister(const string& deviceName, const string& registerName, int address)
-{
-    lock_guard<mutex> lock(m_connectedDevicesMutex);
-
-    if (m_devices.count(deviceName) <= 0)
-    {
-        return false;
-    }
-
-    if ((NULL == m_devices[deviceName].get()) || (!m_devices[deviceName]->AddCustomRegister(registerName, address)))
-    {
-        LOG_ERROR << "Trying to add an already existing custom register name" << endl;
-        return false;
-    }
-
-    return true;
-}
-
-bool DeviceManager::RemoveRegister(const string& deviceName, const string& registerName)
-{
-    lock_guard<mutex> lock(m_connectedDevicesMutex);
-
-    if (m_devices.count(deviceName) <= 0)
-    {
-        return false;
-    }
-
-    if ((NULL == m_devices[deviceName].get()) || (!m_devices[deviceName]->RemoveCustomRegister(registerName)))
-    {
-        LOG_ERROR << "Trying to remove a non-existing custom register name" << endl;
-        return false;
-    }
-
-    return true;
-}
-
-DeviceManagerOperationStatus DeviceManager::SetDeviceSilentMode(const string& deviceName, bool silentMode)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        lock_guard<mutex> lock(m_devices[deviceName]->m_mutex);
-        m_connectedDevicesMutex.unlock();
-        m_devices[deviceName]->SetSilenceMode(silentMode);
-        status = dmosSuccess;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        status = dmosNoSuchConnectedDevice;
-    }
-
-    return status;
-}
-
-
-DeviceManagerOperationStatus DeviceManager::GetDeviceSilentMode(const string& deviceName, bool& silentMode)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        lock_guard<mutex> lock(m_devices[deviceName]->m_mutex);
-        m_connectedDevicesMutex.unlock();
-        silentMode = m_devices[deviceName]->GetSilenceMode();
-        status = dmosSuccess;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        status = dmosNoSuchConnectedDevice;
-    }
-
-    return status;
-}
-
-
-// Log functions
-bool DeviceManager::GetLogCollectionMode() const
-{
-    return m_collectLogs;
-}
-
-void DeviceManager::SetLogCollectionMode(bool collectLogs)
-{
-    m_collectLogs = collectLogs;
-
-    // Start/Stop log collector for all devices
-    m_connectedDevicesMutex.lock();
-    for (auto& connectedDevice : m_devices)
-    {
-        connectedDevice.second->m_mutex.lock();
-
-        if (collectLogs == false)
-        {
-            connectedDevice.second->StopLogCollector();
-        }
-        else
-        {
-            connectedDevice.second->StartLogCollector();
-        }
-
-        connectedDevice.second->m_mutex.unlock();
-    }
-    m_connectedDevicesMutex.unlock();
-}
-
-bool DeviceManager::SetLogCollectionConfiguration(const vector<string>& deviceNames, const vector<string>& cpuTypeNames, const string& parameter, const string& value, string& errorMessage)
-{
-    bool success = true;
-    errorMessage = "";
-    stringstream errorMessageSs;
-    for (auto& deviceName : deviceNames)
-    {
-        shared_ptr<Device> d = GetDeviceByName(deviceName);
-        if (nullptr == d)
-        {
-            success = false;
-            errorMessageSs << "device name " << deviceName << " doesn't exist; ";
-            continue;
-        }
-
-        for (auto& cpuTypeName : cpuTypeNames)
-        {
-            auto found = STRING_TO_CPU_TYPE.find(cpuTypeName);
-            if (STRING_TO_CPU_TYPE.end() == found)
-            {
-                success = false;
-                errorMessageSs << "no such cpu named " << cpuTypeName << ". Can be only FW/UCODE; ";
-                continue;
-            }
-            log_collector::LogCollector* pLogCollector = d->GetLogCollector(found->second);
-            if (nullptr == pLogCollector)
-            {
-                success = false;
-                errorMessageSs << "device " << deviceName << " has no active tracer for " << cpuTypeName << "; ";
-                continue;
-            }
-            pLogCollector->SetConfigurationParamerter(parameter, value);
-        }
-    }
-    errorMessageSs << endl;
-    errorMessage = errorMessageSs.str();
-    return success;
-}
-
-string DeviceManager::GetLogCollectionConfiguration(const vector<string>& deviceNames, const vector<string>& cpuTypeNames, string parameter)
-{
-    stringstream res;
-    bool success;
-    for (auto& deviceName : deviceNames)
-    {
-        shared_ptr<Device> d = GetDeviceByName(deviceName);
-        if (nullptr == d)
-        {
-            res << "device name " << deviceName << " doesn't exist; ";
-            continue;
-        }
-
-        for (auto& cpuTypeName : cpuTypeNames)
-        {
-            auto found = STRING_TO_CPU_TYPE.find(cpuTypeName);
-            if (STRING_TO_CPU_TYPE.end() == found)
-            {
-                res << "no such cpu named " << cpuTypeName << ". Can be only FW/UCODE; ";
-                continue;
-            }
-            log_collector::LogCollector* pLogCollector = d->GetLogCollector(found->second);
-            if (nullptr == pLogCollector)
-            {
-                res << "device " << deviceName << " has no active tracer for " << cpuTypeName << "; ";
-                continue;
-            }
-
-            res << "device-" << deviceName << "-cpu-" << cpuTypeName << "-parameter-" << parameter << "=" << pLogCollector->GetConfigurationParameterValue(parameter, success) << ";"; // TODO - create constants for "=" and ";"
-        }
-    }
-    res << endl;
-    return res.str();
-}
-
-string DeviceManager::DumpLogCollectionConfiguration(const vector<string>& deviceNames, const vector<string>& cpuTypeNames)
-{
-    stringstream res;
-    for (auto& deviceName : deviceNames)
-    {
-        shared_ptr<Device> d = GetDeviceByName(deviceName);
-        if (nullptr == d)
-        {
-            res << "device name " << deviceName << " doesn't exist; ";
-            continue;
-        }
-
-        for (auto& cpuTypeName : cpuTypeNames)
-        {
-            auto found = STRING_TO_CPU_TYPE.find(cpuTypeName);
-            if (STRING_TO_CPU_TYPE.end() == found)
-            {
-                res << "no such cpu named " << cpuTypeName << ". Can be only FW/UCODE; ";
-                continue;
-            }
-            log_collector::LogCollector* pLogCollector = d->GetLogCollector(found->second);
-            if (nullptr == pLogCollector)
-            {
-                res << "device " << deviceName << " has no active tracer for " << cpuTypeName << "; ";
-                continue;
-            }
-
-            res << "device-" << deviceName << "-cpu-" << cpuTypeName << ":" << pLogCollector->GetConfigurationDump() << ";";  // TODO - create constants for "=" and ";"
-        }
-    }
-    res << endl;
-    return res.str();
-}
-
-DeviceManagerOperationStatus DeviceManager::GetDeviceCapabilities(const string& deviceName, DWORD& capabilities)
-{
-    DeviceManagerOperationStatus status;
-    m_connectedDevicesMutex.lock();
-    if (m_devices.count(deviceName) > 0)
-    {
-        lock_guard<mutex> lock(m_devices[deviceName]->m_mutex);
-        m_connectedDevicesMutex.unlock();
-        capabilities = m_devices[deviceName]->GetCapabilities();
-        status = dmosSuccess;
-    }
-    else
-    {
-        m_connectedDevicesMutex.unlock();
-        status = dmosNoSuchConnectedDevice;
-    }
-
-    return status;
-}
diff --git a/debug-tools/host_manager_11ad/DeviceManager.h b/debug-tools/host_manager_11ad/DeviceManager.h
deleted file mode 100644
index 6bddfdf..0000000
--- a/debug-tools/host_manager_11ad/DeviceManager.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _DEVICEMANAGER_H_
-#define _DEVICEMANAGER_H_
-
-#include <string>
-#include <set>
-#include <unordered_map>
-#include <thread>
-#include <future>
-#include <atomic>
-
-#include "HostDefinitions.h"
-#include "Device.h"
-#include "CommandsExecutor.h"
-
-enum DeviceManagerOperationStatus
-{
-    dmosSuccess,
-    dmosNoSuchConnectedDevice, // the given device name is not part of m_conncectedDevices
-    dmosFailedToReadFromDevice,
-    dmosFailedToWriteToDevice,
-    dmosFailedToResetInterface,
-    dmosFailedToResetSw,
-    dmosFailedToAllocatePmc,
-    dmosFailedToDeallocatePmc,
-    dmosFailedToCreatePmcFile,
-    dmosFailedToSendWmi,
-    dmosInvalidAddress,
-    dmosFail, // general failure. try to avoid using it
-    dmosSilentDevice
-};
-
-class DeviceManager
-{
-public:
-    DeviceManager(std::promise<void>& eventsTCPServerReadyPromise);
-    ~DeviceManager();
-    string GetDeviceManagerOperationStatusString(DeviceManagerOperationStatus status);
-
-    DeviceManagerOperationStatus GetDevices(std::set<std::string>& devicesNames);
-    DeviceManagerOperationStatus Read(const std::string& deviceName, DWORD address, DWORD& value);
-    DeviceManagerOperationStatus Write(const std::string& deviceName, DWORD address, DWORD value);
-    DeviceManagerOperationStatus ReadBlock(const std::string& deviceName, DWORD address, DWORD blockSize, vector<DWORD>& values);
-    DeviceManagerOperationStatus WriteBlock(const std::string& deviceName, DWORD address, const vector<DWORD>& values);
-    DeviceManagerOperationStatus InterfaceReset(const std::string& deviceName);
-    DeviceManagerOperationStatus SwReset(const std::string& deviceName);
-
-    DeviceManagerOperationStatus AllocPmc(const std::string& deviceName, unsigned descSize, unsigned descNum, std::string& errorMsg);
-    DeviceManagerOperationStatus DeallocPmc(const std::string& deviceName, std::string& outMessage);
-    DeviceManagerOperationStatus CreatePmcFile(const std::string& deviceName, unsigned refNumber, std::string& outMessage);
-    DeviceManagerOperationStatus FindPmcFile(const std::string& deviceName, unsigned refNumber, std::string& outMessage);
-
-    DeviceManagerOperationStatus SendWmi(const std::string& deviceName, DWORD command, const std::vector<DWORD>& payload);
-    DeviceManagerOperationStatus OpenInterface(const std::string& deviceName); // for backward compatibility
-    DeviceManagerOperationStatus CloseInterface(const std::string& deviceName);
-    DeviceManagerOperationStatus SetDriverMode(const std::string& deviceName, int newMode, int& oldMode);
-    DeviceManagerOperationStatus DriverControl(const std::string& deviceName, uint32_t Id, const void *inBuf, uint32_t inBufSize, void *outBuf, uint32_t outBufSize);
-    DeviceManagerOperationStatus GetDeviceSilentMode(const std::string& deviceName, bool& silentMode);
-    DeviceManagerOperationStatus SetDeviceSilentMode(const std::string& deviceName, bool silentMode);
-    DeviceManagerOperationStatus GetDeviceCapabilities(const std::string& deviceName, DWORD& capabilities);
-
-    // Host Status Update
-    bool GetDeviceStatus(std::vector<DeviceData>& devicesData);
-
-    bool AddRegister(const std::string& deviceName, const std::string& registerName, int address);
-    bool RemoveRegister(const std::string& deviceName, const std::string& registerName);
-
-    // Log collection
-    bool GetLogCollectionMode() const;
-    void SetLogCollectionMode(bool collectLogs);
-    bool SetLogCollectionConfiguration(const vector<string>& deviceNames, const vector<string>& cpuTypeNames, const string& parameter, const string& value, string& errorMessage);
-    string GetLogCollectionConfiguration(const vector<string>& deviceNames, const vector<string>& cpuTypeNames, string parameter);
-    string DumpLogCollectionConfiguration(const vector<string>& deviceNames, const vector<string>& cpuTypeNames);
-
-private:
-    void PeriodicTasks(std::promise<void>& eventsTCPServerReadyPromise);
-    void UpdateConnectedDevices();
-    void CreateDevice(const std::string& deviceName);
-    void DeleteDevice(const std::string& deviceName);
-    bool IsDeviceSilent(const std::string& deviceName);
-    std::shared_ptr<Device> GetDeviceByName(const std::string& deviceName);
-
-    std::unordered_map<std::string, std::shared_ptr<Device>> m_devices; // map from unique string (unique inside a host) to a connected device
-    unsigned const m_deviceManagerRestDurationMs;
-    std::thread m_deviceManager;
-    std::mutex m_connectedDevicesMutex;
-    std::atomic<bool> m_terminate;
-
-    // Collect logs flag
-    bool m_collectLogs;
-
-    const static std::unordered_map<int, std::string> m_rfTypeToString;
-    const static std::unordered_map<int, std::string> m_basebandTypeToString;
-    const static std::unordered_map<int, std::string> m_boardfileTypeToString;
-};
-
-#endif // !_DEVICEMANAGER_H_
diff --git a/debug-tools/host_manager_11ad/EventsDefinitions.h b/debug-tools/host_manager_11ad/EventsDefinitions.h
deleted file mode 100644
index a9e7c81..0000000
--- a/debug-tools/host_manager_11ad/EventsDefinitions.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-#ifndef _11AD_EVENTS_DEFINITIONS_H_
-#define _11AD_EVENTS_DEFINITIONS_H_
-
-#include <sstream>
-#include <ostream>
-#include <string>
-#include <set>
-#include "Utils.h"
-#include "HostDefinitions.h"
-#include "HostManagerDefinitions.h"
-#include "LogCollectorDefinitions.h"
-#include "JsonSerializeHelper.h"
-
-//=== Base class for all events to be pushed to DMTools
-class HostManagerEventBase
-{
-public:
-    explicit HostManagerEventBase(const std::string& deviceName) :
-        m_timestampLocal(std::move(Utils::GetCurrentLocalTimeString())),
-        m_deviceName(deviceName)
-    {}
-
-    virtual ~HostManagerEventBase() {}
-
-    // Serialization entry point
-    void ToJson(std::ostream& os) const
-    {
-        JsonSerializeHelper jsh(os);
-        jsh.Serialize("__type", GetTypeName());
-        jsh.Serialize("TimestampLocal", m_timestampLocal);
-        jsh.Serialize("DeviceName", m_deviceName);
-        ToJsonInternal(jsh);
-    }
-
-private:
-    std::string m_timestampLocal;    // creation time
-    std::string m_deviceName;
-
-    // enforce descendants to implement it and so make the class abstract
-    virtual const char* GetTypeName(void) const = 0;
-    virtual void ToJsonInternal(JsonSerializeHelper& jsh) const = 0;
-};
-
-// =================================================================================== //
-// NewDeviceDiscoveredEvent
-
-// FW version struct with serialization support
-class SerializableFwVersion final : public FwVersion, public JsonSerializable
-{
-public:
-    explicit SerializableFwVersion(const FwVersion& rhs) : FwVersion(rhs) {}
-
-    void ToJson(ostream& os) const override
-    {
-        JsonSerializeHelper jsh(os);
-        jsh.Serialize("Major", m_major);
-        jsh.Serialize("Minor", m_minor);
-        jsh.Serialize("SubMinor", m_subMinor);
-        jsh.Serialize("Build", m_build);
-    }
-};
-
-// FW compilation timestamp with serialization support
-class SerializableFwTimestamp final : public FwTimestamp, public JsonSerializable
-{
-public:
-    explicit SerializableFwTimestamp(const FwTimestamp& rhs) : FwTimestamp(rhs) {}
-
-    void ToJson(ostream& os) const override
-    {
-        JsonSerializeHelper jsh(os);
-        jsh.Serialize("Hour", m_hour);
-        jsh.Serialize("Min", m_min);
-        jsh.Serialize("Sec", m_sec);
-        jsh.Serialize("Day", m_day);
-        jsh.Serialize("Month", m_month);
-        jsh.Serialize("Year", m_year);
-    }
-};
-
-// Event to be sent upon new device discovery or device FW change
-class NewDeviceDiscoveredEvent final : public HostManagerEventBase
-{
-public:
-    NewDeviceDiscoveredEvent(const std::string& deviceName, const FwVersion& fwVersion, const FwTimestamp& fwTimestamp) :
-        HostManagerEventBase(deviceName),
-        m_fwVersion(fwVersion),
-        m_fwTimestamp(fwTimestamp)
-    {}
-
-private:
-    SerializableFwVersion m_fwVersion;
-    SerializableFwTimestamp m_fwTimestamp;
-
-    const char* GetTypeName() const override
-    {
-        return "NewDeviceDiscoveredEvent:#DmTools.Actors";
-    }
-
-    void ToJsonInternal(JsonSerializeHelper& jsh) const override
-    {
-        jsh.SerializeComposite("FwVersion", m_fwVersion);
-        jsh.SerializeComposite("FwTimestamp", m_fwTimestamp);
-    }
-};
-
-// =================================================================================== //
-// ClientConnectedEvent
-
-class ClientConnectedEvent final : public HostManagerEventBase
-{
-public:
-    /*
-    newClientIPSet - a set of already connected users
-    newClient - the client that was connected or diconnected
-    connected - true if newClient was connected and false if was disconnected
-    */
-    ClientConnectedEvent(const std::set<std::string> & newClientIPSet, const std::string & newClient) :
-        HostManagerEventBase(""),
-        m_ExistingClientIPSet(newClientIPSet),
-        m_newClient(newClient)
-    {}
-
-private:
-    const std::set<std::string> m_ExistingClientIPSet;
-    const std::string m_newClient;
-    bool m_connected;
-
-    const char* GetTypeName() const override
-    {
-        return "ClientConnectedEvent:#DmTools.Actors";
-    }
-
-    void ToJsonInternal(JsonSerializeHelper& jsh) const override
-    {
-        jsh.Serialize("NewConnectedUser", m_newClient);
-        jsh.SerializeStringArray("ExistingConnectedUsers", m_ExistingClientIPSet);
-    }
-};
-
-class ClientDisconnectedEvent final : public HostManagerEventBase
-{
-public:
-    /*
-    newClientIPSet - a set of already connected users
-    newClient - the client that was diconnected
-    */
-    ClientDisconnectedEvent(const std::set<std::string> & newClientIPSet, const std::string & newClient) :
-        HostManagerEventBase(""),
-        m_ExistingClientIPSet(newClientIPSet),
-        m_newClient(newClient)
-    {}
-
-private:
-    const std::set<std::string> m_ExistingClientIPSet;
-    const std::string & m_newClient;
-    bool m_connected;
-
-    const char* GetTypeName() const override
-    {
-        return "ClientDisconnectedEvent:#DmTools.Actors";
-    }
-
-    void ToJsonInternal(JsonSerializeHelper& jsh) const override
-    {
-        jsh.Serialize("DisconnectedUser", m_newClient);
-        jsh.SerializeStringArray("ExistingConnectedUsers", m_ExistingClientIPSet);
-    }
-};
-
-//********************************** New Log Lines event **********************************************//
-class SerializableLogLineParams final : public JsonSerializable
-{
-public:
-    explicit SerializableLogLineParams(const std::vector<unsigned> & logLineParams) : m_logLineParams(logLineParams) {}
-
-private:
-    std::vector<unsigned> m_logLineParams;
-
-    void ToJson(ostream& os) const override
-    {
-        JsonSerializeHelper jsh(os);
-        int i = 0;
-        for (auto param : m_logLineParams)
-        {
-            i++;
-            std::stringstream os;
-            os << "Parameter" << i;
-            jsh.Serialize(os.str().c_str(), param);
-        }
-    }
-};
-
-class SerializableLogLine final : public log_collector::RawLogLine, public JsonSerializable
-{
-public:
-    explicit SerializableLogLine(RawLogLine logLine) : RawLogLine(logLine) {}
-
-private:
-
-    void ToJson(ostream& os) const override
-    {
-        JsonSerializeHelper jsh(os);
-        jsh.Serialize("Module", m_module);
-        jsh.Serialize("Level", m_level);
-        jsh.Serialize("StringOffset", m_strOffset);
-        jsh.Serialize("Signature", m_signature);
-        jsh.Serialize("IsString", m_isString);
-        jsh.Serialize("NumberOfParameters", m_params.size());
-        jsh.SerializeStringArray("Parameters", m_params);
-        jsh.Serialize("MLLR", m_missingLogsReason);
-        jsh.Serialize("NOMLLS", m_numOfMissingLogDwords);
-    }
-};
-
-class SerializableLogLinesList final : public JsonSerializable
-{
-public:
-    explicit SerializableLogLinesList(const std::vector<log_collector::RawLogLine> & logLines)
-    {
-        m_logLines.reserve(logLines.size());
-        for (const auto& logLine : logLines)
-        {
-            m_logLines.push_back(SerializableLogLine(logLine));
-        }
-    }
-
-private:
-    std::vector<SerializableLogLine> m_logLines;
-
-    void ToJson(ostream& os) const override
-    {
-        JsonSerializeHelper jsh(os);
-        int i = 0;
-        for (const SerializableLogLine & logLine : m_logLines)
-        {
-            i++;
-            std::stringstream os;
-            os << "LogLine" << i;
-            jsh.SerializeComposite(os.str().c_str(), logLine);
-        }
-    }
-};
-
-class NewLogsEvent final : public HostManagerEventBase
-{
-public:
-    NewLogsEvent(const std::string& deviceName, const CpuType& cpuType, const std::vector<log_collector::RawLogLine>& logLines) :
-        HostManagerEventBase(deviceName),
-        m_cpuType(cpuType)
-    {
-        m_logLines.reserve(logLines.size());
-        for (const auto& logLine : logLines)
-        {
-            m_logLines.emplace_back(new SerializableLogLine(logLine));
-        }
-    }
-
-private:
-    CpuType m_cpuType;
-    std::vector<std::unique_ptr<JsonSerializable>> m_logLines;
-
-    const char* GetTypeName() const override
-    {
-        return "NewLogsEvent:#DmTools.Actors";
-    }
-
-    void ToJsonInternal(JsonSerializeHelper& jsh) const override
-    {
-        jsh.Serialize("TracerType", CPU_TYPE_TO_STRING[m_cpuType]);
-        jsh.SerializeCompositeArray("LogLines", m_logLines);
-    }
-};
-//********************************** END - New Log Lines event **********************************************//
-
-// =================================================================================== //
-// DriverEvent
-
-// Event to be sent upon recieval of driver event
-class DriverEvent final : public HostManagerEventBase
-{
-public:
-    DriverEvent(const std::string& deviceName,
-        int driverEventType,
-        unsigned driverEventId,
-        unsigned listenId,
-        unsigned bufferLength,
-        const unsigned char* binaryData) :
-            HostManagerEventBase(deviceName),
-            m_driverEventType(driverEventType),
-            m_driverEventId(driverEventId),
-            m_listenId(listenId),
-            m_bufferLength(bufferLength),
-            m_binaryData(binaryData)
-    {}
-
-private:
-    const int m_driverEventType;
-    const unsigned m_driverEventId;
-    const unsigned m_listenId;
-    const unsigned m_bufferLength;
-    const unsigned char* m_binaryData;
-
-    const char* GetTypeName() const override
-    {
-        return "DriverEvent:#DmTools.Actors";
-    }
-
-    void ToJsonInternal(JsonSerializeHelper& jsh) const override
-    {
-        jsh.Serialize("DriverEventType", m_driverEventType);
-        jsh.Serialize("DriverEventId", m_driverEventId);
-        jsh.Serialize("ListenId", m_listenId);
-        jsh.Serialize("BinaryDataBase64", JsonSerializeHelper::Base64Encode(m_binaryData, m_bufferLength)); // bufferLength = 0 if buffer is empty
-    }
-};
-
-// =================================================================================== //
-
-#endif // _11AD_EVENTS_DEFINITIONS_H_
diff --git a/debug-tools/host_manager_11ad/EventsTcpServer.cpp b/debug-tools/host_manager_11ad/EventsTcpServer.cpp
deleted file mode 100644
index dc89d97..0000000
--- a/debug-tools/host_manager_11ad/EventsTcpServer.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "EventsTcpServer.h"
-#include "Host.h"
-
-EventsTcpServer::EventsTcpServer(unsigned int eventsTcpPort)
-    :m_port(eventsTcpPort), m_pSocket(new TcpNetworkInterfaces::NetworkInterface()), m_running(true)
-{
-}
-
-void EventsTcpServer::Start()
-{
-    //LOG_INFO << "Starting events TCP server on port " << m_port << endl;
-    m_pSocket->Bind(m_port);
-    m_pSocket->Listen();
-
-    //Infinite loop because it has to wait for clients to connect to it forever, there's no reason to stop it
-    //unless there is a problem.
-    while (m_running)
-    {
-        try
-        {
-            TcpNetworkInterfaces::NetworkInterface newClient = m_pSocket->Accept();
-            //LOG_INFO << "Adding a new client to the Events TCP Server: " << newClient.getPeerName() << endl;
-            //using unique_lock promises that in case of exception the mutex is unlocked:
-            lock_guard<mutex> clientsVectorLock(m_clientsVectorMutex);
-            m_clientsVector.push_back(newClient);
-        }
-        catch (exception e)
-        {
-            LOG_ERROR << "Couldn't start a new connection with a new client on events TCP server" << e.what() << endl;
-        }
-    }
-}
-
-bool EventsTcpServer::SendToAllConnectedClients(const string& message)
-{
-    try
-    {
-        //using lock_guard promises that in case of exception the mutex is unlocked:
-        lock_guard<mutex> clientsVectorLock(m_clientsVectorMutex); //locks the mutex because the for loop iterates on clientsVector
-        for (auto client = m_clientsVector.begin(); client != m_clientsVector.end(); )
-        {
-            try
-            {
-                int bytesSent = client->SendString(message);
-                if (bytesSent == 0)
-                { //it means the client had disconnected, remove the client from the clients list
-                    LOG_WARNING << "Client: " << (*client).GetPeerName() << " has disconnected, removing from the clients list" << endl;
-                    client = m_clientsVector.erase(client);
-                }
-                else
-                {
-                    ++client;
-                }
-            }
-            catch (exception e)
-            {
-                string peerName = "Unknown client";
-                if (client != m_clientsVector.end())
-                {
-                    peerName = (*client).GetPeerName();
-                }
-                LOG_WARNING << "Couldn't send the event to the client: " << peerName << " " << e.what() << endl;
-
-            }
-        }
-    }
-    catch (exception e)
-    {
-        LOG_WARNING << "Couldn't send the event to all the clients" << e.what() << endl;
-        return false;
-    }
-
-    return true;
-}
-
-void EventsTcpServer::Stop()
-{
-    LOG_INFO << "Stopping the events TCP server" << endl;
-    m_pSocket->Close(); //type 2 -> Acts like the close(), shutting down both input and output
-    m_pSocket.reset();
-
-    m_running = false;
-}
diff --git a/debug-tools/host_manager_11ad/EventsTcpServer.h b/debug-tools/host_manager_11ad/EventsTcpServer.h
deleted file mode 100644
index f567b2c..0000000
--- a/debug-tools/host_manager_11ad/EventsTcpServer.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _EVENTSTCPSERVER_H_
-#define _EVENTSTCPSERVER_H_
-
-#include "TcpNetworkInterface.h"
-#include <memory>
-#include <mutex>
-#include "HostDefinitions.h"
-#include "CommandsHandler.h"
-
-/*
- *TODO - add a function to the events TCP server: when some client connects to the host server, the host server informs every client
- *(include the one that just connected) that another client had connected to the host
- */
-
-/*
-* Events TCP server is a asynchronous server that broadcasts events that come from the device or the host to all connected clients.
-* If a client wants to get events he has to connect this server (separately from the Commands TCP server).
-* This server doesn't get any messages from clients.
-*/
-class EventsTcpServer
-{
-public:
-    /*
-    * Events TCP server constructor gets the port to start in. It also initializes new Socket object.
-    */
-    EventsTcpServer(unsigned int eventsTcpPort);
-
-    /*
-    * Start the events TCP server at the given port (given in the constructor).
-    * For each new client that is connecting to the server, it adds it to a clients list.
-    */
-    void Start();
-
-    /*
-    * Send an event to all registered clients (clients that exist in the list).
-    * If the connection is lost, remove the client from the list (it is the client's responsibility
-    * to renew the connection with this server).
-    */
-    bool SendToAllConnectedClients(const string& message);
-    /*
-    * Stop the events TCP server by doing some clean ups for the sockets.
-    */
-    void Stop();
-
-private:
-    unsigned int m_port; //The port in which the events TCP server is working on
-    shared_ptr<TcpNetworkInterfaces::NetworkInterface> m_pSocket;
-    // clientsVector is a vector that keeps all the clients that are connected to the server and want to get events from the device or the host
-    vector<TcpNetworkInterfaces::NetworkInterface> m_clientsVector;
-    mutex m_clientsVectorMutex; //Two different (or more) threads can access the clients vector - a mutex is needed
-
-    bool m_running;
-};
-
-
-
-#endif // !_EVENTSTCPSERVER_H_
diff --git a/debug-tools/host_manager_11ad/FileReader.cpp b/debug-tools/host_manager_11ad/FileReader.cpp
deleted file mode 100644
index d2a99a4..0000000
--- a/debug-tools/host_manager_11ad/FileReader.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "FileReader.h"
-#include "DebugLogger.h"
-
-#include <cstring>
-#include <cerrno>
-#include <stdio.h>
-
-// *************************************************************************************************
-
-FileReader::FileReader(const char* pFileName)
-    : m_FileName(pFileName ? pFileName : "")
-    , m_pFile(NULL)
-    , m_FileSize(0)
-    , m_ReadTillNow(0)
-    , m_IsCompleted(false)
-    , m_IsError(false)
-{
-    if (NULL == pFileName)
-    {
-        LOG_ERROR << "Invalid file reader created - No file name provided" << std::endl;
-        return;
-    }
-
-    LOG_VERBOSE << "Opening file reader for: " << m_FileName << std::endl;
-    m_pFile = fopen(pFileName, "rb");
-
-    if (NULL == m_pFile)
-    {
-        int lastErrno = errno;
-        LOG_ERROR << "Error opening file."
-                  << " Name: " << pFileName
-                  << " Error: " << lastErrno
-                  << " Message: " << strerror(lastErrno)
-                  << std::endl;
-        return;
-    }
-
-    fseek(m_pFile, 0, SEEK_END);
-    m_FileSize = ftell(m_pFile);
-    rewind(m_pFile);
-}
-
-// *************************************************************************************************
-
-FileReader::~FileReader()
-{
-    if (m_pFile)
-    {
-        LOG_VERBOSE << "Closing the file: " << m_FileName << std::endl;
-        fclose(m_pFile);
-        m_pFile = NULL;
-    }
-}
-
-// *************************************************************************************************
-
-bool FileReader::CanReadFromFile(char* pBuf, size_t availableSpace)
-{
-    if (!pBuf)
-    {
-        LOG_ERROR << "Cannot read from file " << m_FileName << ": " << "No buffer is provided" << std::endl;
-        return false;
-    }
-
-    if (0 == availableSpace)
-    {
-        LOG_ERROR << "Cannot read from file " << m_FileName << ": " << "No buffer space is provided" << std::endl;
-        return false;
-    }
-
-    if (NULL == m_pFile)
-    {
-        LOG_ERROR << "Cannot read from file " << m_FileName << ": " << "No file handle is available" << std::endl;
-        return false;
-    }
-
-    if (m_IsCompleted)
-    {
-        LOG_ERROR << "Unexpected read from file " << m_FileName << ": " << "EoF is reached" << std::endl;
-        return false;
-    }
-
-    if (m_IsError)
-    {
-        LOG_ERROR << "Unexpected read from file " << m_FileName << ": " << "Error occured" << std::endl;
-        return false;
-    }
-
-    return true;
-
-}
-
-// *************************************************************************************************
-
-size_t FileReader::ReadChunk(char* pBuf, size_t availableSpace)
-{
-    LOG_VERBOSE << "Reading a chunk."
-        << " File Name: " << m_FileName
-        << " File Size: " << m_FileSize << "B"
-        << " Read till now: " << m_ReadTillNow << "B"
-        << " Buffer: " << availableSpace << "B"
-        << " Completed: " << BoolStr(m_IsCompleted)
-        << " Error: " << BoolStr(m_IsError)
-        << std::endl;
-
-    if (false == CanReadFromFile(pBuf, availableSpace))
-    {
-        LOG_ERROR << "Cannot read from file: " << m_FileName << " Check previous errors/status" << std::endl;
-        m_IsError = true;
-        return 0;
-    }
-
-    // Read up to availableSpace. Reading less means either EoF is reached or read error occured
-    size_t readBytes = fread(pBuf, 1, availableSpace, m_pFile);
-    m_ReadTillNow += readBytes;
-
-    if (feof(m_pFile))
-    {
-        LOG_VERBOSE << "EoF reached" << std::endl;
-        m_IsCompleted = true;
-    }
-
-    if (ferror(m_pFile))
-    {
-        int lastErrno = errno;
-        m_IsError = true;
-        LOG_ERROR << "Cannot read file"
-                  << " Name: " << m_FileName
-                  << " Error: " << lastErrno
-                  << " Message:" << strerror(lastErrno)
-                  << std::endl;
-    }
-
-    LOG_VERBOSE << "Got a chunk."
-                << " File Name: " << m_FileName
-                << " File Size: " << m_FileSize << "B"
-                << " Read till now: " << m_ReadTillNow << "B"
-                << " Buffer: " << availableSpace << "B"
-                << " Completed: " << BoolStr(m_IsCompleted)
-                << " Error: " << BoolStr(m_IsError)
-                << std::endl;
-
-    return readBytes;
-
-}
diff --git a/debug-tools/host_manager_11ad/FileReader.h b/debug-tools/host_manager_11ad/FileReader.h
deleted file mode 100644
index 2a54cc9..0000000
--- a/debug-tools/host_manager_11ad/FileReader.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _FILE_READER_H_
-#define _FILE_READER_H_
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string>
-
-// *************************************************************************************************
-
-// Reads a file from the file system and exports its content to a buffer provided by the caller.
-// If the file is larger than a provide bugffer, it is delivered by chunks of the buffer size.
-// The last chunk may occupy less than the whole buffer. It's a caller's responsibility to allocate
-// the buffer and call the FileReader API untill the file is fully exported.
-
-class FileReader
-{
-public:
-
-    explicit FileReader(const char* pFileName);
-    ~FileReader();
-
-    size_t ReadChunk(char* pBuf, size_t availableSpace);
-
-    bool IsCompleted() const { return m_ReadTillNow == m_FileSize; }
-    bool IsError() const { return m_IsError; }
-
-    size_t ReadTillNow() const { return m_ReadTillNow; }
-    size_t GetFileSize() const { return m_FileSize; }
-
-private:
-
-    bool CanReadFromFile(char* pBuf, size_t availableSpace);
-
-    const std::string m_FileName;        // File name - cached for tracing
-    FILE* m_pFile;                       // File Handler - open for read
-    size_t m_FileSize;                   // File Size in bytes
-    size_t m_ReadTillNow;                // Bytes read till now
-    bool m_IsCompleted;                  // Set to true when OEF is reached
-    bool m_IsError;                      // Error flag
-
-};
-
-
-#endif    // _FILE_READER_H_
diff --git a/debug-tools/host_manager_11ad/FileSystemOsAbstraction.cpp b/debug-tools/host_manager_11ad/FileSystemOsAbstraction.cpp
deleted file mode 100644
index 6cd3bd6..0000000
--- a/debug-tools/host_manager_11ad/FileSystemOsAbstraction.cpp
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef __linux
-#include <sys/ioctl.h> // for struct ifreq
-#include <net/if.h> // for struct ifreq
-#include <arpa/inet.h> // for the declaration of inet_ntoa
-#include <netinet/in.h> // for struct sockaddr_in
-#include <stdlib.h>
-#include <string.h>
-#include <cerrno>
-#include <sys/stat.h> //added for config- template path
-#include <unistd.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <stdio.h>
-
-#elif _WINDOWS
-#include <windows.h>
-#include <KnownFolders.h>
-#include <ShlObj.h>
-#include <Shlwapi.h>
-#include <comutil.h> //for _bstr_t (used in the string conversion)
-#pragma comment(lib, "comsuppw")
-
-#else
-#include <dirent.h>
-#endif
-
-#ifdef __ANDROID__
-#include <sys/stat.h> //added for config- template path
-#include <unistd.h> //added for config- template path
-#include <sys/types.h>
-#endif
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include "DebugLogger.h"
-#include "FileSystemOsAbstraction.h"
-
-const std::string FileSystemOsAbstraction::LOCAL_HOST_IP = "127.0.0.1";
-
-bool FileSystemOsAbstraction::FindEthernetInterface(struct ifreq& ifr, int& fd)
-{
-#ifdef __linux
-    fd = socket(AF_INET, SOCK_DGRAM, 0);
-    if (fd < 0)
-    {
-        LOG_WARNING << "Failed to get host's IP address and broadcast IP address" << std::endl;
-        return false;
-    }
-
-    for (int i = 0; i < 100; i++)
-    {
-        snprintf(ifr.ifr_name, IFNAMSIZ - 1, "eth%d", i);
-
-        if (ioctl(fd, SIOCGIFADDR, &ifr) >= 0)
-        {
-            return true;
-        }
-    }
-#endif
-    return false;
-}
-
-HostIps FileSystemOsAbstraction::GetHostIps()
-{
-#ifdef __linux
-    HostIps hostIps;
-    int fd;
-    struct ifreq ifr;
-
-    ifr.ifr_addr.sa_family = AF_INET; // IP4V
-
-                                      // Get IP address according to OS
-    if (FindEthernetInterface(ifr, fd))
-    {
-        LOG_INFO << "Linux OS" << std::endl;
-    }
-    else
-    {
-        snprintf(ifr.ifr_name, IFNAMSIZ - 1, "br-lan");
-        if (ioctl(fd, SIOCGIFADDR, &ifr) >= 0)
-        {
-            LOG_INFO << "OpenWRT OS" << std::endl;
-        }
-        else
-        {
-            // Probably Android OS
-            LOG_INFO << "Android OS (no external IP Adress)" << std::endl;
-            hostIps.m_ip = FileSystemOsAbstraction::LOCAL_HOST_IP;
-            hostIps.m_broadcastIp = FileSystemOsAbstraction::LOCAL_HOST_IP;
-            return hostIps;
-        }
-    }
-
-    hostIps.m_ip = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
-
-    if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0)
-    {
-        LOG_WARNING << "Failed to get broadcast IP" << std::endl;
-        return hostIps;
-    }
-    hostIps.m_broadcastIp = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
-    LOG_DEBUG << "Host's IP address is " << hostIps.m_ip << std::endl;
-    LOG_DEBUG << "Broadcast IP address is " << hostIps.m_broadcastIp << std::endl;
-
-    close(fd);
-    return hostIps;
-#else
-    HostIps empty;
-    empty.m_broadcastIp = "10.18.172.155";
-    return empty;
-#endif
-}
-
-bool FileSystemOsAbstraction::ReadFile(string fileName, string& data)
-{
-    ifstream fd(fileName.c_str());
-    if (!fd.good()) // file doesn't exist
-    {
-        data = "";
-        return false;
-    }
-
-    fd.open(fileName.c_str());
-    stringstream content;
-    content << fd.rdbuf();
-    fd.close();
-    data = content.str();
-    return true;
-}
-
-bool FileSystemOsAbstraction::WriteFile(const string& fileName, const string& content)
-{
-    std::ofstream fd(fileName.c_str());
-    if (!fd.is_open())
-    {
-        LOG_WARNING << "Failed to open file: " << fileName << std::endl;
-        return false;
-    }
-    fd << content;
-    if (fd.bad())
-    {
-        LOG_WARNING << "Failed to write to file: " << fileName << std::endl;
-        fd.close();
-        return false;
-    }
-    fd.close();
-    return true;
-}
-
-bool FileExist(const std::string& Name)
-{
-#ifdef _WINDOWS
-    struct _stat buf;
-    int Result = _stat(Name.c_str(), &buf);
-#else
-    struct stat buf;
-    int Result = stat(Name.c_str(), &buf);
-#endif
-    return Result == 0;
-}
-
-
-
-string FileSystemOsAbstraction::GetConfigurationFilesLocation()
-{
-    stringstream path;
-
-    //should check __ANDROID__ first since __LINUX flag also set in Android
-#ifdef __ANDROID__
-    std::string t_path = "/data/vendor/wifi/host_manager_11ad/";
-    if (!FileExist(t_path))
-    {
-        path << "/data/host_manager_11ad/";
-    }
-    else
-    {
-        path << t_path;
-    }
-#elif __linux
-    return "/etc/host_manager_11ad/";
-#elif _WINDOWS //windows
-    LPWSTR lpwstrPath = NULL;
-    // Get the ProgramData folder path of windows
-    HRESULT result = SHGetKnownFolderPath(FOLDERID_ProgramData, 0, NULL, &lpwstrPath);
-    if (SUCCEEDED(result))
-    {
-        // Convert the path to string
-        std::wstring wpath(lpwstrPath);
-        std::string strPath = std::string(wpath.cbegin(), wpath.cend());
-        CoTaskMemFree(lpwstrPath);
-        path << strPath << "\\Wilocity\\host_manager_11ad\\";
-    }
-#else //OS3
-    return "/etc/host_manager_11ad/";
-#endif // __linux
-    return path.str();
-}
-
-std::string FileSystemOsAbstraction::GetTemplateFilesLocation()
-{
-    stringstream path;
-
-    //should check __ANDROID__ first since __LINUX flag also set in Android
-
-
-#ifdef  __ANDROID__
-    std::string t_path = "/vendor/etc/wifi/host_manager_11ad/";
-    if (!FileExist(t_path))
-    {
-        path << "/data/host_manager_11ad/";
-    }
-    else
-    {
-        path << t_path;
-    }
-
-#elif __linux
-    return "/etc/host_manager_11ad/";
-#elif _WINDOWS
-    path << "..\\OnTargetUI\\";
-#else //OS3
-    return "/etc/host_manager_11ad/";
-#endif // __linux
-    return path.str();
-}
-
-string FileSystemOsAbstraction::GetDirectoriesDilimeter()
-{
-#ifndef _WINDOWS
-    return "/";
-#else
-    return "\\";
-#endif
-}
-
-bool FileSystemOsAbstraction::ReadHostOsAlias(string& alias)
-{
-#ifdef __linux
-    if (!ReadFile("/etc/hostname", alias))
-    {
-        alias = "";
-        return false;
-    }
-    return true;
-#else
-    alias = "";
-    return false;
-#endif // __linux
-}
-
-bool FileSystemOsAbstraction::DoesFolderExist(string path)
-{
-#ifndef _WINDOWS
-    DIR* pDir = opendir(path.c_str());
-    if (pDir != NULL)
-    {
-        (void)closedir(pDir);
-        return true;
-    }
-    return false;
-#else
-    DWORD fileAttributes = GetFileAttributesA(path.c_str());
-    if (INVALID_FILE_ATTRIBUTES == fileAttributes) // no such path
-    {
-        return false;
-    }
-    if (fileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-    {
-        return true;   // given path is a directory
-    }
-    return false;    // given path isn't a directory
-#endif
-}
-
-bool FileSystemOsAbstraction::IsFileExists(string path)
-{
-    ifstream f(path.c_str());
-    return f.good();
-}
-
-bool FileSystemOsAbstraction::CreateFolder(string path)
-{
-#ifndef _WINDOWS
-    system(("mkdir " + path).c_str());
-    return true;
-#else
-    std::wstring wpath = std::wstring(path.cbegin(), path.cend());
-    return CreateDirectory(wpath.c_str(), nullptr) == TRUE;
-#endif
-}
-
-bool FileSystemOsAbstraction::MoveFileToNewLocation(string oldFileLocation, string newFileLocation)
-{
-#ifndef _WINDOWS
-    system(("mv " + oldFileLocation + " " + newFileLocation).c_str());
-    return true;
-#else
-    std::wstring wOldPath = std::wstring(oldFileLocation.cbegin(), oldFileLocation.cend());
-    std::wstring wNewPath = std::wstring(newFileLocation.cbegin(), newFileLocation.cend());
-    return MoveFile(wOldPath.c_str(), wNewPath.c_str()) == TRUE;
-#endif
-}
\ No newline at end of file
diff --git a/debug-tools/host_manager_11ad/FileSystemOsAbstraction.h b/debug-tools/host_manager_11ad/FileSystemOsAbstraction.h
deleted file mode 100644
index 5e4eb55..0000000
--- a/debug-tools/host_manager_11ad/FileSystemOsAbstraction.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _FILESYSTEMOSABSTRACTION_H_
-#define _FILESYSTEMOSABSTRACTION_H_
-
-#include <string>
-#include <memory>
-#include "HostDefinitions.h"
-
-class FileSystemOsAbstraction
-{
-public:
-
-    /*
-    GetHostIps
-    Returns host's personal IP and broadcast IP
-    @param: none
-    @return: HostIps - host's personal IP and broadcast IP
-    */
-    static HostIps GetHostIps();
-
-    /*
-    ReadFile
-    Gets a file name and reads its context.
-    @param: fileName - full file name
-    @return: file's content
-    */
-    static bool ReadFile(std::string fileName, std::string& data);
-
-    /*
-    WriteFile
-    Gets a file name and the required content, and write the content to the file (overrides the old content if exists)
-    @param: fileName - full file name
-    @param: content - the new file's content
-    @return: true for successful write operation, false otherwise
-    */
-    static bool WriteFile(const std::string& fileName, const std::string& content);
-
-    /*
-    GetConfigurationFilesLocation
-    Returns the host directory location for configuration files
-    @param: none
-    @return: string - host directory location for configuration files
-    */
-    static std::string GetConfigurationFilesLocation();
-
-    /*
-    GetTemplateFilesLocation
-    The directory in which all the extra files of host_manger would be in
-    @param: none
-    @return: string - directory in which all the extra files of host_manger would be in
-    */
-    static std::string GetTemplateFilesLocation();
-
-    /*
-    ReadHostOsAlias
-    Returns the host's alias as defined in persistency
-    @param: a reference to a string that will be updated with the host's alias
-    @return: bool - status - true for successful operation, false otherwise
-    */
-    static bool ReadHostOsAlias(std::string& alias);
-
-    static bool DoesFolderExist(std::string path);
-
-    static bool CreateFolder(std::string path);
-
-    static bool MoveFileToNewLocation(std::string oldFileLocation, std::string newFileLocation);
-
-    static std::string GetDirectoriesDilimeter();
-
-    static bool IsFileExists(std::string path);
-
-    static const std::string LOCAL_HOST_IP; // default IP address
-
-private:
-    static bool FindEthernetInterface(struct ifreq& ifr, int& fd);
-
-};
-
-#endif
\ No newline at end of file
diff --git a/debug-tools/host_manager_11ad/Host.cpp b/debug-tools/host_manager_11ad/Host.cpp
deleted file mode 100644
index 9e16594..0000000
--- a/debug-tools/host_manager_11ad/Host.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "Host.h"
-#include "DebugLogger.h"
-#include <iostream>
-#include <thread>
-#include <functional> //Included for the "ref" in events TCP server thread
-#include "Utils.h"
-
-using namespace std;
-
-// The private singleton Cntr
-// Note: the promise is defined before device manager field
-Host::Host() : m_deviceManager(m_eventsTCPServerReadyPromise), m_MenuDisplayOn(false)
-{}
-
-void Host::StartHost(unsigned int commandsTcpPort, unsigned int eventsTcpPort, unsigned int udpPortIn, unsigned int udpPortOut, unsigned int httpPort)
-{
-    m_pCommandsTcpServer.reset(new CommandsTcpServer(commandsTcpPort, *this));
-
-    if (!m_pCommandsTcpServer)
-    { //m_pCommandsTcpServer is NULL, couldn't set Socket
-        LOG_ERROR << "Couldn't set new socket for the commands TCP server" << endl;
-        throw "Couldn't set new socket for the commands TCP server";
-    }
-    thread threadCommandsTcpServer;
-    try
-    {
-        LOG_INFO << "Starting commands TCP server on port " << commandsTcpPort << endl;
-        //threadCommandsTcpServer = thread(&CommandsTcpServer::Start, m_pCommandsTcpServer);
-        threadCommandsTcpServer = thread(&CommandsTcpServer::Start, m_pCommandsTcpServer.get());
-    }
-    catch (exception e)
-    {
-        LOG_ERROR << "Couldn't start commands TCP server" << endl;
-        throw "Couldn't start commands TCP server";
-    }
-
-    m_pEventsTcpServer.reset(new EventsTcpServer(eventsTcpPort));
-
-    if (!m_pEventsTcpServer)
-    { //m_pEventsTcpServer is NULL, couldn't set Socket
-        LOG_ERROR << "Couldn't set new socket for the events TCP server" << endl;
-        throw "Couldn't set new socket for the events TCP server";
-    }
-    m_eventsTCPServerReadyPromise.set_value(); // notify device manager - OK to push events
-
-    thread threadEventsTcpServer;
-    try
-    {
-        LOG_INFO << "Starting events TCP server on port " << eventsTcpPort << endl;
-        threadEventsTcpServer = thread(&EventsTcpServer::Start, m_pEventsTcpServer.get());
-    }
-    catch (exception e)
-    {
-        LOG_ERROR << "Couldn't start events TCP server" << endl;
-        throw "Couldn't start commands TCP server";
-    }
-
-    m_pUdpServer.reset(new UdpServer(udpPortIn, udpPortOut, *this));
-    if (!m_pUdpServer)
-    { //m_pUdpServer is NULL, couldn't set Socket
-        LOG_ERROR << "Couldn't set new socket for the UDP server" << endl;
-        throw "Couldn't set new socket for the UDP server";
-    }
-
-    thread threadUdpServer;
-    try
-    {
-        LOG_INFO << "Starting UDP server at port in: " << udpPortIn << ", and port out: " << udpPortOut << endl;
-        threadUdpServer = thread(&UdpServer::StartServer, m_pUdpServer);
-    }
-    catch (exception e)
-    {
-        LOG_ERROR << "Couldn't start UDP server thread" << e.what() << endl;
-        throw "Couldn't start UDP server thread";
-    }
-
-    // If user requested to display menu & user hasn't exited the menu
-    while (m_MenuDisplayOn)
-    {
-        DisplayMenu();
-    }
-
-    threadCommandsTcpServer.join();
-    threadEventsTcpServer.join();
-    threadUdpServer.join();
-}
-
-void Host::StopHost()
-{
-    m_pCommandsTcpServer->Stop();
-    m_pEventsTcpServer->Stop();
-    m_pUdpServer->Stop();
-}
-
-// Push the given event through Events TCP Server
-void Host::PushEvent(const HostManagerEventBase& event) const
-{
-    if (!m_pEventsTcpServer)
-    {    // shouldn't happen
-        LOG_ERROR << "Host::PushEvent: Events TCP Server is not ready!" << endl;
-        return;
-    }
-
-    std::stringstream os;
-    event.ToJson(os);
-    m_pEventsTcpServer->SendToAllConnectedClients(os.str());
-}
-
-// Push the given event through Events TCP Server to a specific client
-void Host::SetMenuDisplay(bool menuDisplayOn)
-{
-    m_MenuDisplayOn = menuDisplayOn;
-}
-
-// Retrieve host data
-bool Host::GetHostUpdate(HostData& data)
-{
-    // Extract host IP
-    data.m_hostIP = m_hostInfo.GetIps().m_ip;
-
-    // Extract host_manager version
-    data.m_hostManagerVersion = m_hostInfo.GetVersion();
-
-    // Extract host Alias
-    data.m_hostAlias = m_hostInfo.GetAlias();
-
-    // Update devices status
-    if (!GetDeviceManager().GetDeviceStatus(data.m_devices))
-    {
-        return false;
-    }
-
-    return true;
-}
-
-// Display host_manager_11ad menu
-void Host::DisplayMenu()
-{
-    // Clear the console screen
-#ifdef _WINDOWS
-    system("cls");
-#else
-    system("clear");
-#endif
-
-    int userInput;
-
-    string logCollectionAction = "Start";
-    if (GetDeviceManager().GetLogCollectionMode() == true)
-    {
-        logCollectionAction = "Stop";
-    }
-
-    // Display user menu options
-    cout << "Please enter select the number of the requested operation:" << endl;
-    cout << "    (1) " << logCollectionAction << " FW/uCode Log Collection" << endl;
-    cout << "    (2) " << " Exit" << endl;
-    cin >> userInput;
-
-    switch (userInput)
-    {
-    case 1:
-        // Toggle the log collection status
-        GetDeviceManager().SetLogCollectionMode(!GetDeviceManager().GetLogCollectionMode());
-        break;
-    case 2:
-        StopHost();
-        m_MenuDisplayOn = false;
-        break;
-    default:
-        break;
-    }
-}
diff --git a/debug-tools/host_manager_11ad/Host.h b/debug-tools/host_manager_11ad/Host.h
deleted file mode 100644
index 8fab28d..0000000
--- a/debug-tools/host_manager_11ad/Host.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _HOST_H_
-#define _HOST_H_
-
-#include <memory>
-#include <future>
-#include "EventsDefinitions.h"
-#include "CommandsTcpServer.h"
-#include "EventsTcpServer.h"
-#include "CommandsHandler.h"
-#include "UdpServer.h"
-#include "HostInfo.h"
-#include "DeviceManager.h"
-
-/*
- * Host is a class that holds the TCP and UDP server.
- * It also holds the Device Manager.
- */
-class Host
-{
-public:
-
-    /*
-    * Host is s singletone due to HandleOsSignals - signal is a global function that can't get a pointer to the host as an argument
-    */
-    static Host& GetHost()
-    {
-        static Host host;
-        return host;
-    }
-
-    /*
-     * StratHost starts each one of the servers it holds
-     */
-    void StartHost(unsigned int commandsTcpPort, unsigned int eventsTcpPort, unsigned int udpPortIn, unsigned int udpPortOut, unsigned int httpPort);
-
-    /*
-     * StopHost stops each one of the servers it holds
-     */
-    void StopHost();
-
-    HostInfo& GetHostInfo() { return m_hostInfo; }
-    bool GetHostUpdate(HostData& data);
-
-    DeviceManager& GetDeviceManager() { return m_deviceManager;  }
-
-    // Push the given event through Events TCP Server
-    void PushEvent(const HostManagerEventBase& event) const;
-
-    // Decide whether to show host_manager menu
-    void SetMenuDisplay(bool menuDisplayOn);
-
-    // delete copy Cnstr and assignment operator
-    // keep public for better error message
-    // no move members will be declared implicitly
-    Host(const Host&) = delete;
-    Host& operator=(const Host&) = delete;
-
-private:
-    std::shared_ptr<CommandsTcpServer> m_pCommandsTcpServer;
-    std::shared_ptr<EventsTcpServer> m_pEventsTcpServer;
-    std::shared_ptr<UdpServer> m_pUdpServer;
-    HostInfo m_hostInfo;
-    std::promise<void> m_eventsTCPServerReadyPromise;    // sync. of device manager with events TCP server creation
-    DeviceManager m_deviceManager;                        // note: it should be defined after the promise passsed to its Cnstr
-    bool m_MenuDisplayOn;
-
-    // define Cnstr to be private, part of Singleton pattern
-    Host();
-
-    // Menu display function
-    void DisplayMenu();
-};
-
-
-#endif // ! _HOST_H_
diff --git a/debug-tools/host_manager_11ad/HostDefinitions.h b/debug-tools/host_manager_11ad/HostDefinitions.h
deleted file mode 100644
index 8cc55c3..0000000
--- a/debug-tools/host_manager_11ad/HostDefinitions.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _DEFINITIONS_H_
-#define _DEFINITIONS_H_
-
-#include <map>
-#include <string>
-#include <cstdint>
-#include <tuple>
-#include "Utils.h"
-
-// FW Defines
-#define MAX_RF_NUMBER 8
-
-
-#define FW_ASSERT_REG 0x91F020
-#define UCODE_ASSERT_REG 0x91F028
-#define FW_ASSOCIATION_REG 0x880A44
-#define FW_ASSOCIATED_VALUE 0x6
-#define MCS_REG 0x880A60
-#define DEVICE_TYPE_REG 0x880A8C
-#define FW_MODE_REG 0x880A34
-#define BOOT_LOADER_VERSION_REG 0x880A0C
-#define CHANNEL_REG 0x883020
-#define BOARDFILE_REG 0x880014
-
-#define UCODE_RX_ON_REG 0x9405BE
-#define BF_SEQ_REG 0x941374
-#define BF_TRIG_REG 0x941380
-#define NAV_REG 0x940490
-#define TX_GP_REG 0x880A58
-#define RX_GP_REG 0x880A5C
-
-#define RF_CONNECTED_REG 0x889488
-#define RF_ENABLED_REG 0x889488
-
-#define BASEBAND_TEMPERATURE_REG 0x91c808
-#define RF_TEMPERATURE_REG 0x91c80c
-
-// *************************************************************************************************
-/*
- * The reply data may be generated in several ways, the data is expected to be obtained according to this type
- */
-enum REPLY_TYPE
-{
-    REPLY_TYPE_NONE,
-    REPLY_TYPE_BUFFER,
-    REPLY_TYPE_FILE,
-    REPLY_TYPE_WAIT_BINARY,
-    REPLY_TYPE_BINARY
-};
-
-// *************************************************************************************************
-/*
- * A response to the client, through the servers
- */
-struct ResponseMessage
-{
-    ResponseMessage() :
-        type(REPLY_TYPE_NONE),
-        length(0U),
-        binaryMessage(nullptr),
-        inputBufSize(0U)
-    {}
-
-    std::string message;
-    REPLY_TYPE type;
-    size_t length;
-    uint8_t* binaryMessage;
-    vector<string> internalParsedMessage;
-    unsigned inputBufSize;
-};
-
-// *************************************************************************************************
-/* A response to the user in CLI mode
-*/
-struct Status
-{
-    Status() :
-        m_success(true),
-        m_message("") {}
-
-    Status(bool success, std::string message) :
-        m_success(success),
-        m_message(message) {}
-
-    bool m_success;
-    std::string m_message;
-};
-
-// *************************************************************************************************
-/*
- * ConnectionStatus indicates whether to close a connection with a client or not.
- */
-enum ConnectionStatus
-{
-    CLOSE_CONNECTION,
-    KEEP_CONNECTION_ALIVE
-};
-
-// **************************** Events Structures and Enum Types **************************************
-/*
- * Define an event struct which would be sent as Json string.
- * NOTE that the __exactly__ same struct is defined in the side that gets this struct.
- */
-
-struct FwVersion
-{
-    DWORD m_major;
-    DWORD m_minor;
-    DWORD m_subMinor;
-    DWORD m_build;
-
-    FwVersion() :
-        m_major(0), m_minor(0), m_subMinor(0), m_build(0)
-    {}
-
-    bool operator==(const FwVersion& rhs) const
-    {
-        return std::tie(m_major, m_minor, m_subMinor, m_build) == std::tie(rhs.m_major, rhs.m_minor, rhs.m_subMinor, rhs.m_build);
-    }
-};
-
-struct FwTimestamp
-{
-    FwTimestamp() :
-        m_hour(0), m_min(0), m_sec(0), m_day(0), m_month(0), m_year(0)
-    {}
-
-    DWORD m_hour;
-    DWORD m_min;
-    DWORD m_sec;
-    DWORD m_day;
-    DWORD m_month;
-    DWORD m_year;
-
-    bool operator==(const FwTimestamp& rhs) const
-    {
-        return std::tie(m_hour, m_min, m_sec, m_day, m_month, m_year) == std::tie(rhs.m_hour, rhs.m_min, rhs.m_sec, rhs.m_day, rhs.m_month, rhs.m_year);
-    }
-};
-
-//enum DRIVER_MODE
-//{
-//    IOCTL_WBE_MODE,
-//    IOCTL_WIFI_STA_MODE,
-//    IOCTL_WIFI_SOFTAP_MODE,
-//    IOCTL_CONCURRENT_MODE,    // This mode is for a full concurrent implementation  (not required mode switch between WBE/WIFI/SOFTAP)
-//    IOCTL_SAFE_MODE,          // A safe mode required for driver for protected flows like upgrade and crash dump...
-//};
-
-// *************************************************************************************************
-
-#define MAX_REGS_LEN    (256* 1024)    // Max registers to read/write at once //TODO - is it needed? maybe read until line terminator?
-
-// Max buffer size for a command and a reply. We should consider the longest command/data sequence to fit in a buffer.
-// rb reading 1024 (MAX_REGS_LEN) registers: rb HHHHHHHH HHHH 1024*(0xHHHHHHHH) = 17 + 1024*10 = 10257 bytes
-// wb writing 1024 (MAX_REGS_LEN) hex values: wb HHHHHHHH "1024*HH" = 14+1024*2 = 2062 bytes
-#define MAX_INPUT_BUF (11*MAX_REGS_LEN) //TODO - is it needed? maybe read until line terminator?
-
-// *************************************************************************************************
-
-struct HostIps
-{
-    HostIps() :
-        m_ip(""),
-        m_broadcastIp("")
-    {}
-
-    std::string m_ip; // host's IP address
-    std::string m_broadcastIp; // host's broadcast IP address (derivated by subnet mask)
-};
-
-// *************************************************************************************************
-
-enum ServerType
-{
-    stTcp,
-    stUdp
-};
-
-const int SECOND_IN_MILLISECONDS = 1000;
-
-#endif // !_DEFINITIONS_H_
diff --git a/debug-tools/host_manager_11ad/HostInfo.cpp b/debug-tools/host_manager_11ad/HostInfo.cpp
deleted file mode 100644
index e68e65a..0000000
--- a/debug-tools/host_manager_11ad/HostInfo.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <iostream>
-#include "HostInfo.h"
-#include "DebugLogger.h"
-#include "FileSystemOsAbstraction.h"
-#include "VersionInfo.h"
-
-// Version display is constructed using defines from VersionInfo.h which is updated automatically or manually during release
-// Note: cannot use Windows specific GetFileVersionInfo to extract the version
-const string HostInfo::s_version = TOOL_VERSION_STR;
-
-HostInfo::HostInfo() :
-    m_alias(""),
-    m_persistencyPath(FileSystemOsAbstraction::GetConfigurationFilesLocation()),
-    m_aliasFileName(FileSystemOsAbstraction::GetDirectoriesDilimeter() + "host_alias"),
-    m_oldHostAliasFile(GetOldPersistencyLocation() + "host_manager_11ad_host_info"),
-    m_isAliasFileChanged(false),
-    m_capabilitiesMask(0)
-{
-    SetHostCapabilities();
-    LoadHostInfo();
-}
-
-const string HostInfo::GetOldPersistencyLocation()
-{
-#ifdef __linux
-    return "/etc/";
-#elif __OS3__
-    return "/tmp/";
-#else
-    return "C:\\Temp\\"; // TODO: change
-#endif // __linux
-}
-
-const HostIps& HostInfo::GetIps()
-{
-    return m_ips;
-}
-
-string HostInfo::GetAlias()
-{
-    if (m_isAliasFileChanged)
-    {
-        UpdateAliasFromFile();
-    }
-    return m_alias;
-}
-
-bool HostInfo::SaveAliasToFile(const string& newAlias)
-{
-    lock_guard<mutex> lock(m_persistencyLock);
-    if (!FileSystemOsAbstraction::WriteFile(m_persistencyPath + m_aliasFileName, newAlias))
-    {
-        LOG_WARNING << "Failed to write new alias to configuration file " << m_persistencyPath << m_aliasFileName << endl;
-        return false;
-    }
-    m_isAliasFileChanged = true;
-    return true;
-}
-
-bool HostInfo::UpdateAliasFromFile()
-{
-    lock_guard<mutex> lock(m_persistencyLock);
-    if (!FileSystemOsAbstraction::ReadFile(m_persistencyPath + m_aliasFileName, m_alias))
-    {
-        LOG_WARNING << "Failed to write new alias to configuration file " << m_persistencyPath << m_aliasFileName << endl;
-        return false;
-    }
-    m_isAliasFileChanged = false;
-    return true;
-}
-
-set<string> HostInfo::GetConnectedUsers() const
-{
-    lock_guard<mutex> lock(m_connectedUsersLock);
-    return m_connectedUsers;
-}
-
-void HostInfo::AddNewConnectedUser(const string& user)
-{
-    lock_guard<mutex> lock(m_connectedUsersLock);
-    m_connectedUsers.insert(user);
-}
-
-void HostInfo::RemoveConnectedUser(const string& user)
-{
-    lock_guard<mutex> lock(m_connectedUsersLock);
-    m_connectedUsers.erase(user);
-}
-
-void HostInfo::SetHostCapabilities()
-{
-    //SetCapability(COLLECTING_LOGS, true); // TODO - reenable
-}
-
-void HostInfo::SetCapability(CAPABILITIES capability, bool isTrue)
-{
-    const DWORD mask = (DWORD)1 << capability;
-    m_capabilitiesMask = isTrue ? m_capabilitiesMask | mask : m_capabilitiesMask & ~mask;
-}
-
-bool HostInfo::IsCapabilitySet(CAPABILITIES capability) const
-{
-    return (m_capabilitiesMask & (DWORD)1 << capability) != (DWORD)0;
-}
-
-void HostInfo::LoadHostInfo()
-{
-    m_ips = FileSystemOsAbstraction::GetHostIps();
-
-    // create host manager directory if doesn't exist
-    bool res = FileSystemOsAbstraction::DoesFolderExist(m_persistencyPath);
-    if (!res)
-    {
-        res = FileSystemOsAbstraction::CreateFolder(m_persistencyPath);
-        if (!res)
-        {
-            LOG_WARNING << "Failed to create " << m_persistencyPath << " directory" << endl;
-            return;
-        }
-        // backward compatibility - copy the alias that the user already given to its new place
-        if (FileSystemOsAbstraction::IsFileExists(m_oldHostAliasFile)
-            && !FileSystemOsAbstraction::MoveFileToNewLocation(m_oldHostAliasFile, m_persistencyPath + m_aliasFileName))
-        {
-            LOG_WARNING << "Failed to move " << m_oldHostAliasFile << " file to new location " << m_persistencyPath + m_aliasFileName << endl;
-            return;
-        }
-    }
-
-    res = FileSystemOsAbstraction::ReadFile(m_persistencyPath + m_aliasFileName, m_alias);
-    if (!res) // file doesn't exist
-    {
-        res = FileSystemOsAbstraction::ReadHostOsAlias(m_alias);
-        if (!res)
-        {
-            LOG_WARNING << "Failed to read OS host name" << endl;
-            m_alias = "";
-        }
-        res = FileSystemOsAbstraction::WriteFile(m_persistencyPath + m_aliasFileName, m_alias);
-        if (!res)
-        {
-            LOG_WARNING << "Failed to write host alias to persistency" << endl;
-        }
-    }
-}
diff --git a/debug-tools/host_manager_11ad/HostInfo.h b/debug-tools/host_manager_11ad/HostInfo.h
deleted file mode 100644
index 5e4df75..0000000
--- a/debug-tools/host_manager_11ad/HostInfo.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _HOSTINFO_H_
-#define _HOSTINFO_H_
-
-#include <string>
-#include <memory>
-#include <atomic>
-#include <mutex>
-#include <set>
-
-#include "HostDefinitions.h"
-
-using namespace std;
-
-class HostInfo
-{
-
-public:
-
-    /*
-    HostInfo
-    Initializes all hostInfo members (ips and alias)
-    */
-    HostInfo();
-
-    /*
-    GetIps
-    Returns host's Ips (private and broadcast)
-    @param: none
-    @return: host's ips
-    */
-    const HostIps& GetIps();
-
-    /*
-    GetHostAlias
-    Returns host's alias (if one was given by the user)
-    @param: none
-    @return: host's alias if exists, otherwise empty string
-    */
-    string GetAlias();
-
-    /*
-    SaveAliasToFile
-    Gets a new alias for the host and saves it to a configuration file.
-    This function is called from CommandsTcpServer only. It turns on a flag so that the UDP server (that is on a different thread) will check for the new alias
-    @param: string - the new alias
-    @return: bool - operation status - true for success, false otherwise
-    */
-    bool SaveAliasToFile(const string& newAlias);
-
-    /*
-    UpdateAliasFromFile
-    Updates the m_alias member with the host's alias from 11ad's persistency
-    @param: none
-    @return: bool - operation status - true for success, false otherwise
-    */
-    bool UpdateAliasFromFile();
-
-    /*
-    GetConnectedUsers
-    Returns a set of all the users that are connected to this host
-    @param: none
-    @return: set<string> of all connected users
-    */
-    set<string> GetConnectedUsers() const;
-
-    /*
-    AddNewConnectedUser
-    Adds a user to the connected user's list
-    @param: string - a new user (currently the user's DmTools's IP. TODO: change to the user's personal host's name or user's DmTools username)
-    @return: none
-    */
-    void AddNewConnectedUser(const string& user);
-
-    /*
-    RemoveConnectedUser
-    Removes a user from the connected user's list
-    @param: string - a user (currently the user's DmTools's IP. TODO: change to the user's personal host's name or user's DmTools username)
-    @return: none
-    */
-    void RemoveConnectedUser(const string& user);
-
-    static string GetVersion() { return s_version; }
-
-    /*
-    GetHostCapabilities
-    Get the capabilities of the host
-    @param: none
-    @return: bit mask of the capabilities
-    */
-    DWORD GetHostCapabilities() const { return m_capabilitiesMask; }
-
-private:
-    HostIps m_ips; // host's network details // assumption: each host has only one IP address for ethernet interfaces
-    string m_alias; // host's alias (given by user)
-    const string m_persistencyPath; // host server's files location
-    const string m_aliasFileName; // host's alias file
-    const string m_oldHostAliasFile; // old location of the host alias
-    set<string> m_connectedUsers; // list of users IPs that have a connection to the commandsTcpServer // TODO: change to the user's personal host's name or user's DmTools username
-    const static string s_version; // host_manager_11ad version
-    atomic<bool> m_isAliasFileChanged; // when turned on indicates that m_alias contains stale information, so we need to update it from persistency
-    mutable mutex m_persistencyLock; // only one thread is allowed to change persistency at a time
-    mutable mutex m_connectedUsersLock;
-
-    // Capabilities:
-    DWORD m_capabilitiesMask;
-
-    // Enumeration of Host capabilities
-    // Note: This is a contract with DmTools, the order is important!
-    enum CAPABILITIES : DWORD
-    {
-        COLLECTING_LOGS // capability of host manager to collect logs by itself and send them to DmTools
-    };
-
-    void SetHostCapabilities();
-    void SetCapability(CAPABILITIES capability, bool isTrue);
-    bool IsCapabilitySet(CAPABILITIES capability) const;
-
-    // load host's info from persistency and ioctls
-    void LoadHostInfo();
-
-    // For backward compatibility (should be removed in next releases)
-    const string GetOldPersistencyLocation();
-};
-
-
-#endif
\ No newline at end of file
diff --git a/debug-tools/host_manager_11ad/HostManagerDefinitions.h b/debug-tools/host_manager_11ad/HostManagerDefinitions.h
deleted file mode 100644
index c76e399..0000000
--- a/debug-tools/host_manager_11ad/HostManagerDefinitions.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _HOST_MANAGER_DEFINITIONS_H
-#define _HOST_MANAGER_DEFINTSIONS_H
-#pragma once
-
-#include <map>
-
-typedef enum BasebandTypeEnum
-{
-    BASEBAND_TYPE_NONE,
-    BASEBAND_TYPE_SPARROW,   // added here to keep backward compatibility. some tools assume MARLON == 2, we don't brake this assumption
-    BASEBAND_TYPE_MARLON,
-    BASEBAND_TYPE_TALYN,
-    BASEBAND_TYPE_LAST
-} BasebandType;
-
-enum CpuType
-{
-    CPU_TYPE_FW,
-    CPU_TYPE_UCODE
-};
-
-static std::map<CpuType, std::string> CPU_TYPE_TO_STRING = { { CPU_TYPE_FW, "FW" },{ CPU_TYPE_UCODE, "UCODE" } };
-static std::map<std::string, CpuType> STRING_TO_CPU_TYPE = { {"FW", CPU_TYPE_FW}, {"UCODE", CPU_TYPE_UCODE} };
-
-#endif // !_HOST_MANAGER_DEFINITIONS_H
diff --git a/debug-tools/host_manager_11ad/JsonSerializeHelper.cpp b/debug-tools/host_manager_11ad/JsonSerializeHelper.cpp
deleted file mode 100644
index 962564b..0000000
--- a/debug-tools/host_manager_11ad/JsonSerializeHelper.cpp
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <array>
-#include "JsonSerializeHelper.h"
-
-JsonSerializeHelper::JsonSerializeHelper(std::ostream& os) : m_os(os)
-{
-    StartSerialization();
-}
-
-JsonSerializeHelper::~JsonSerializeHelper()
-{
-    FinishSerialization();
-}
-
-void JsonSerializeHelper::Serialize(const char* key, const std::string& value)
-{
-    Serialize(key, value.c_str());
-}
-
-void JsonSerializeHelper::Serialize(const char* key, const char* value)
-{
-    // last comma is overriden during Finish
-    m_os << R"_(")_" << key << R"_(":")_" << value << R"_(",)_";
-}
-
-void JsonSerializeHelper::Serialize(const char* key, const unsigned long long value)
-{
-    // last comma is overriden during Finish
-    m_os << R"_(")_" << key << R"_(":)_" << value << ",";
-}
-
-// Serialization service for composite member that implements the JsonSerializable interface
-void JsonSerializeHelper::SerializeComposite(const char* key, const JsonSerializable& value)
-{
-    // last comma is overriden during Finish
-    m_os << R"_(")_" << key << R"_(":)_";
-    value.ToJson(m_os);
-    m_os << ",";
-}
-
-void JsonSerializeHelper::SerializeCompositeArray(const char* key, const std::vector<std::unique_ptr<JsonSerializable>>& values)
-{
-    m_os << R"_(")_" << key << R"_(":[)_";
-
-    bool first = true;
-    for (auto & val : values)
-    {
-        if (!first) {
-            m_os << ",";
-        }
-        first = false;
-        if (val)
-        {
-            val->ToJson(m_os);
-        }
-        else
-        {
-            LOG_ERROR << "Got uninitialized vector. key is " << key << std::endl;
-        }
-    }
-    m_os << "],";
-}
-
-// Encode given binary array as Base64 string
-std::string JsonSerializeHelper::Base64Encode(const std::vector<unsigned char>& binaryData)
-{
-    return Base64Encode(binaryData.data(), binaryData.size());
-}
-
-std::string JsonSerializeHelper::Base64Encode(const unsigned char binaryData[], unsigned length)
-{
-    static const std::string base64Vocabulary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-    std::string result;
-    if (length == 0U)
-    {
-        return result;
-    }
-
-    // reserve room for the result (next higher multiple of 3, div by 3, mult by 4)
-    unsigned mod3 = length % 3;
-    result.reserve((length + (mod3 ? 3 - mod3 : 0)) * 4 / 3);
-
-    int val1 = 0, val2 = -6;
-    for (unsigned i = 0U; i < length; ++i)
-    {
-        val1 = (val1 << 8) + static_cast<int>(binaryData[i]);
-        val2 += 8;
-        while (val2 >= 0)
-        {
-            result.push_back(base64Vocabulary[(val1 >> val2) & 0x3F]);
-            val2 -= 6;
-        }
-    }
-
-    if (val2 > -6)
-    {
-        result.push_back(base64Vocabulary[((val1 << 8) >> (val2 + 8)) & 0x3F]);
-    }
-
-    while (result.size() % 4)
-    {
-        result.push_back('=');
-    }
-
-    return result;
-}
-
- bool JsonSerializeHelper::Base64Decode(const std::string& base64Data, std::vector<unsigned char>& binaryData)
-{
-    static const unsigned char lookup[] =
-    {
-        62,  255, 62,  255, 63,  52,  53, 54, 55, 56, 57, 58, 59, 60, 61, 255,
-        255, 0,   255, 255, 255, 255, 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-        10,  11,  12,  13,  14,  15,  16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
-        255, 255, 255, 255, 63,  255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
-        36,  37,  38,  39,  40,  41,  42, 43, 44, 45, 46, 47, 48, 49, 50, 51
-    };
-
-    binaryData.clear();
-    if (base64Data.empty())
-    {
-        return false;
-    }
-    binaryData.reserve(base64Data.size() * 3 / 4);
-
-    int val1 = 0, val2 = -8;
-    for (auto c : base64Data)
-    {
-        if (c < '+' || c > 'z')
-        {
-            break;
-        }
-
-        int mappedVal = static_cast<int>(lookup[c - '+']);
-        if (mappedVal >= 64)
-        {
-            break;
-        }
-
-        val1 = (val1 << 6) + mappedVal;
-        val2 += 6;
-
-        if (val2 >= 0)
-        {
-            binaryData.push_back(char((val1 >> val2) & 0xFF));
-            val2 -= 8;
-        }
-    }
-
-    return true;
-}
diff --git a/debug-tools/host_manager_11ad/JsonSerializeHelper.h b/debug-tools/host_manager_11ad/JsonSerializeHelper.h
deleted file mode 100644
index def1343..0000000
--- a/debug-tools/host_manager_11ad/JsonSerializeHelper.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-#ifndef _11AD_JSON_SERIALIZE_HELPER_H_
-#define _11AD_JSON_SERIALIZE_HELPER_H_
-
-#include <ostream>
-#include <string>
-#include <vector>
-#include <memory>
-#include "DebugLogger.h"
-
-// Interface for composite types to be used as part of event payload
-class JsonSerializable
-{
-public:
-    virtual void ToJson(std::ostream& os) const = 0;
-    virtual ~JsonSerializable() {}
-};
-
-
-// Helper class implementing the serialization services in Json format
-class JsonSerializeHelper final
-{
-public:
-    explicit JsonSerializeHelper(std::ostream& os);
-
-    ~JsonSerializeHelper();
-
-    void Serialize(const char* key, const std::string& value);
-
-    void Serialize(const char* key, const char* value);
-
-    void Serialize(const char* key, const unsigned long long value);
-
-    // Serialization service for composite member that implements the JsonSerializable interface
-    void SerializeComposite(const char* key, const JsonSerializable& value);
-
-    void SerializeCompositeArray(const char* key, const std::vector<std::unique_ptr<JsonSerializable>>& values);
-
-    // Type of template can be any iterable container
-    template<class T>
-    void SerializeStringArray(const char* key, const T& values)
-    {
-        m_os << R"_(")_" << key << R"_(":[)_";
-
-        bool first = true;
-        for (auto & val : values)
-        {
-            if (!first) {
-                m_os << ",";
-            }
-            first = false;
-            m_os << R"_(")_" << val << R"_(")_";
-        }
-        m_os << "],";
-    }
-
-    // Encode given binary array as Base64 string
-    static std::string Base64Encode(const std::vector<unsigned char>& binaryData);
-    static std::string Base64Encode(const unsigned char binaryData[], unsigned length);
-
-    // Decode the string given in Base64 format
-    static bool Base64Decode(const std::string& base64Data, std::vector<unsigned char>& binaryData);
-
-private:
-    std::ostream& m_os;
-
-    void StartSerialization()
-    {
-        m_os << "{";
-    }
-
-    void  FinishSerialization()
-    {
-        m_os.seekp(-1, m_os.cur); // override the last comma
-        m_os << "}";
-    }
-};
-
-#endif // _11AD_JSON_SERIALIZE_HELPER_H_
diff --git a/debug-tools/host_manager_11ad/LogCollector.cpp b/debug-tools/host_manager_11ad/LogCollector.cpp
deleted file mode 100644
index ac57fe5..0000000
--- a/debug-tools/host_manager_11ad/LogCollector.cpp
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <locale> // std::tolower
-#include <sstream>
-
-#include "LogCollector.h"
-#include "Device.h"
-
-namespace log_collector
-{
-
-    LogCollector::LogCollector(Device* device, CpuType tracerType) :
-        m_device(device),
-        m_deviceName(device->GetDeviceName()),
-        m_tracerType(tracerType),
-        m_continueCollectingLogs(false),
-        m_initialized(false),
-        m_ongoingRecording(false)
-    {
-        m_lastPollingTimestamp = std::chrono::system_clock::now();
-        stringstream ss;
-        ss << endl << "host_manager_11ad error: " << CPU_TYPE_TO_STRING[m_tracerType] << " log tracer error in device " << m_deviceName << " - ";
-        m_logErrorMessagePrefix = ss.str();
-    }
-
-    bool LogCollector::ReadConfigFile()
-    {
-        // check exsitence of file
-        string configFileName = FileSystemOsAbstraction::GetConfigurationFilesLocation() + m_configFileName;
-        if (!FileSystemOsAbstraction::DoesFolderExist(configFileName)) // later - check user location
-        {
-            LOG_INFO << "No log recording configuration file, using the default configuration" << endl;
-            return false;
-        }
-
-        // read file
-        try
-        {
-            m_configuration.ResetValue();
-            ifstream fd(configFileName.c_str());
-            string line;
-            while (std::getline(fd, line))
-            {
-                if (!ParseConfigLine(line))
-                {
-                    LOG_ERROR << "Failed to parse config file " << m_configFileName << ", problematic line: " << line << "\n. Use the defulat configuration" << endl;
-                }
-            }
-            return true;
-
-        }
-        catch (...)
-        {
-            m_configuration.ResetValue();
-            LOG_ERROR << "Got exception while trying to open config file " << configFileName << endl;
-            return false;
-        }
-
-        LOG_INFO << "Log recording configuration file was taken from " << configFileName << endl;
-        return true;
-    }
-
-    bool LogCollector::ParseConfigLine(string line)
-    {
-        LOG_VERBOSE << "configuration line = << " << line << endl;
-
-        // Skip comments
-        if (line.find("//") == 0)
-        {
-            return true;
-        }
-
-        std::size_t found = line.find(configuration_parameter_value_delimiter);
-        if (std::string::npos != found)
-        {
-            return SetConfigurationParamerter(line.substr(0, found), line.substr(found + 1));
-        }
-        return true; // skipping this line
-    }
-
-    Status LogCollector::PrepareLogCollection()
-    {
-        if (!m_continueCollectingLogs)
-        {
-            return Status(true, "");
-        }
-
-        // initialize members
-        m_rptr = 0;
-        m_lastWptr = 0;
-        m_currentOutputFileSize = 0;
-        m_logAddress = 0;
-
-        // setting configuration
-        ReadConfigFile();
-
-        // set log buffer header
-        m_logHeader.reset(new log_table_header());
-        if (!SetModuleVerbosity())
-        {
-            stringstream ss;
-            ss << "Failed to set " << CPU_TYPE_TO_STRING[m_tracerType] << " log verbosity level for device " << m_deviceName << endl;
-            return Status(false, ss.str());
-        }
-
-        // Allocate log buffer
-        m_log_buf = malloc(log_size(fw_log_buf_entries));
-        if (!m_log_buf)
-        {
-            stringstream ss;
-            ss << "Unable to allocate log buffer " << log_size(fw_log_buf_entries) << " bytes";
-            LOG_ERROR << ss.str() << endl;
-            return Status(false, ss.str());
-        }
-
-        m_initialized = true;
-        LOG_DEBUG << "Log collector prepareation was successfully finished" << endl;
-        Status s(true, "");
-        return s;
-    }
-
-    Status LogCollector::GetNextLogs(std::vector<RawLogLine>& rawLogLines)
-    {
-        if (!m_initialized)
-        {
-            stringstream ss;
-            ss << CPU_TYPE_TO_STRING[m_tracerType] << " log tracer of device " << m_deviceName << " isn't initialized! Can't collect logs" << endl;
-            //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " tracer isn't initialized" << endl;
-            return Status(false, ss.str());
-        }
-
-        // handle creation/closure of output file if needed (if applicable)
-
-        // Don't collect logs
-        if (!m_ongoingRecording && !m_continueCollectingLogs)
-        {
-            return move(Status());
-            //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " no request for logs" << endl;
-        }
-
-        // Asked to stop log collection
-        if (m_ongoingRecording && !m_continueCollectingLogs)
-        {
-            return FinishLogCollection();
-        }
-
-        // Asked to start log collection
-        else if (!m_ongoingRecording && m_continueCollectingLogs)
-        {
-            m_currentOutputFileSize = 0;
-            if (m_configuration.m_recordToFile && !CreateNewOutputFile())
-            {
-                //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " failed to create output file" << endl;
-                return move(Status(false, "failed to create a new output file"));
-            }
-
-            m_ongoingRecording = true;
-        }
-
-        // Collect logs and split output file if required
-        else if (m_ongoingRecording)
-        {
-            if (m_currentOutputFileSize > m_configuration.m_fileFragmentSize)
-            {
-                m_currentOutputFileSize = 0;
-                CloseOutputFile();
-                if (m_configuration.m_recordToFile && !CreateNewOutputFile())
-                {
-                    //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " failed to create output file" << endl;
-                    return move(Status(false, "failed to create a new output file"));
-                }
-            }
-        }
-
-        // Read log buffer
-        if (ReadLogWritePointer(m_log_buf))
-        {
-            //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " there are new log lines" << endl;
-            m_currentOutputFileSize += ParseLog(m_log_buf, fw_log_buf_entries, rawLogLines);
-            LOG_DEBUG << "Current File Size = " << m_currentOutputFileSize << endl;
-        }
-        // else flow is still valid and happens when the interface isn't up yet
-
-        m_lastPollingTimestamp = chrono::system_clock::now();
-        return move(Status());
-    }
-
-    Status LogCollector::FinishLogCollection()
-    {
-        m_ongoingRecording = false;
-        CloseOutputFile();
-        m_currentOutputFileSize = 0;
-        m_initialized = false;
-        return move(Status());
-    }
-
-    bool LogCollector::CollectionIsNeeded()
-    {
-        return IsInitialized() && (m_configuration.m_pollingIntervalMs < (chrono::system_clock::now() - m_lastPollingTimestamp));
-    }
-
-    int LogCollector::ParseLog(void* log_buf, size_t log_buf_entries, std::vector<RawLogLine>& rawLogLines)
-    {
-        int sizeAdded = 0;
-
-        // Prepare a header pointing to log buffer top
-        struct log_table_header *h = (struct log_table_header*)log_buf; // h contains all the log buffer (including the log buffer header)
-
-        u32 wptr = h->write_ptr;
-        //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " wptr == " << wptr << ", rptr == " << m_rptr << endl;
-
-        if (wptr == m_rptr)
-        {
-            //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " nothing to read" << endl;
-            // Nothing to read.
-            return 0;
-        }
-
-        {
-            stringstream ss;
-            ss << Utils::GetCurrentLocalTimeXml() << "<Content>";
-            WriteToOutputFile(ss);
-        }
-
-        if (wptr < m_rptr)
-        {
-            // previously was just retun 0
-            {
-                //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " wptr < m_rptr => read more lines than were created" << endl;
-                stringstream ss;
-                ss << m_logErrorMessagePrefix << "device is restarting" << endl; // read more lines than were created
-                WriteToOutputFile(ss);
-            }
-            rawLogLines.push_back(RawLogLine(RPTR_LARGER_THAN_WPTR, 0u));
-            return 0;
-        }
-
-        // Re-Read the entire buffer
-        ReadLogBuffer(log_buf, log_size(fw_log_buf_entries));
-        // Update the write pointer
-        wptr = h->write_ptr;
-
-        //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " new re-read of wptr == " << wptr << ", rptr == " << m_rptr << ", log buf size == " << log_buf_entries << endl;
-
-        if (wptr >= log_buf_entries + m_rptr)
-        {
-            // overflow; try to parse last wrap
-            {
-                stringstream ss;
-                ss << m_logErrorMessagePrefix << "found buffer overrun - missed " << wptr - m_rptr << " DWORDS" << endl; // DWORD == uint32
-                WriteToOutputFile(ss);
-            }
-            rawLogLines.push_back(RawLogLine(BUFFER_OVERRUN, (unsigned)(wptr - m_rptr - log_buf_entries))); // condition assures that the value is non-negative integer
-            m_rptr = wptr - log_buf_entries;
-        }
-
-        LOG_DEBUG << "  wptr = " << wptr << ", rptr = " << m_rptr << endl;
-
-        for (; wptr > m_rptr && (wptr != m_lastWptr); m_rptr++)
-        {
-            LOG_DEBUG << "wptr = " << wptr << ", rptr = " << m_rptr << endl;
-
-            int i;
-            u32 p[3] = { 0 }; // parameters array (each log line can have at most three parameters
-            union log_event *evt = &h->evt[m_rptr % log_buf_entries]; // h->evt is the log line payload.
-
-            if (evt->hdr.signature != 5)
-            {
-                {
-                    stringstream ss;
-                    ss << m_logErrorMessagePrefix << "got corrupted entry" << endl;
-                    WriteToOutputFile(ss);
-                }
-                rawLogLines.push_back(RawLogLine(INVALID_SIGNATURE, 1));
-                continue;
-            }
-            if (evt->hdr.parameters_num > 3)
-            {
-                LOG_DEBUG << "Parameter Num = " << evt->hdr.parameters_num << endl;
-                continue;
-            }
-
-            vector<unsigned> params;
-            for (i = 0; i < evt->hdr.parameters_num; i++)
-            {
-                p[i] = h->evt[(m_rptr + i + 1) % log_buf_entries].param;
-                params.push_back(p[i]);
-            }
-            /*DebugPrint("%d,%s,%d:", evt->hdr.module,
-            levels[evt->hdr.level],
-            evt->hdr.strring_offset);
-
-            DebugPrint("%d,%d,%d\n",
-            (p[0]),
-            (p[1]),
-            (p[2]));*/
-
-            {
-                stringstream ss;
-                ss << evt->hdr.module << "," << levels[evt->hdr.level] << "," << evt->hdr.strring_offset << ":" << p[0] << "," << p[1] << "," << p[2] << "\n";
-                WriteToOutputFile(ss);
-            }
-
-            RawLogLine line = RawLogLine(evt->hdr.module, evt->hdr.level, evt->hdr.signature, evt->hdr.strring_offset, evt->hdr.is_string, params);
-
-            // Gather new line for event
-            rawLogLines.push_back(line);
-
-            // (paramters) (verbosity type) (delimiters)
-            sizeAdded += (5 * sizeof(int)) + (1 * sizeof(char)) + (4 * sizeof(char));
-
-            m_rptr += evt->hdr.parameters_num;
-        }
-
-        m_lastWptr = wptr;
-
-        {
-            stringstream ss;
-            ss << "</Content></Log_Content>";
-            WriteToOutputFile(ss);
-        }
-
-        fflush(stdout);
-        return sizeAdded;
-    }
-
-
-
-    Status LogCollector::StopCollectingLogs()
-    {
-        m_continueCollectingLogs = false;
-        return move(Status());
-    }
-
-    Status LogCollector::StartCollectingLogs()
-    {
-        m_continueCollectingLogs = true;
-        return move(Status());
-    }
-
-    string LogCollector::GetNextOutputFileFullName()
-    {
-        std::stringstream ss;
-        ss << FileSystemOsAbstraction::GetConfigurationFilesLocation() << m_deviceName << "_" << CPU_TYPE_TO_STRING[m_tracerType] << "_" << time(0) << "_" << m_configuration.m_logFileSuffix << ".log";
-        return ss.str();
-    }
-
-    bool LogCollector::CreateNewOutputFile()
-    {
-        string fullFileName = GetNextOutputFileFullName();
-        LOG_INFO << "Creating output file: " << fullFileName << endl;
-
-        m_outputFile.open(fullFileName.c_str());
-
-        if (m_outputFile.fail())
-        {
-            LOG_ERROR << "Error opening output file: " << fullFileName << " Error: " << strerror(errno) << endl;
-            return false;
-        }
-
-        std::ostringstream headerBuilder;
-
-        const FwVersion fwVersion = m_device->GetFwVersion();
-        const FwTimestamp fwTs = m_device->GetFwTimestamp();
-
-        headerBuilder << "<LogFile>"
-            << "<FW_Ver>"
-            << "<Major>" << fwVersion.m_major << "</Major>"
-            << "<Minor>" << fwVersion.m_minor << "</Minor>"
-            << "<Sub>" << fwVersion.m_subMinor << "</Sub>"
-            << "<Build>" << fwVersion.m_build << "</Build>"
-            << "</FW_Ver>"
-            << "<Compilation_Time>"
-            << "<Hour>" << fwTs.m_hour << "</Hour>"
-            << "<Minute>" << fwTs.m_min << "</Minute>"
-            << "<Second>" << fwTs.m_sec << "</Second>"
-            << "<Day>" << fwTs.m_day << "</Day>"
-            << "<Month>" << fwTs.m_month << "</Month>"
-            << "<Year>" << fwTs.m_year << "</Year>"
-            << "</Compilation_Time>"
-            << "<Logs>";
-
-        m_outputFile << headerBuilder.str();
-        return true;
-    }
-
-    void LogCollector::CloseOutputFile()
-    {
-        if (m_outputFile.is_open())
-        {
-            m_outputFile << "</Logs></LogFile>";
-            m_outputFile.close();
-            LOG_INFO << "Output file closed" << endl;
-        }
-    }
-
-    void LogCollector::WriteToOutputFile(const stringstream& logLine)
-    {
-        if (m_configuration.m_recordToFile && m_outputFile.is_open())
-        {
-            m_outputFile << logLine.str();
-        }
-    }
-
-    bool LogCollector::SetModuleVerbosity()
-    {
-        // Update FW & uCode log addresses
-        if (!m_logAddress)
-        {
-            ComputeLogStartAddress();
-        }
-
-        //LOG_INFO << "Log buffer start address is 0x" << hex << m_logAddress << endl;
-
-        // Write verbosity to the device
-        for (int i = 0; i < NUM_MODULES; ++i)
-        {
-            m_logHeader->module_level_enable[i] = m_configuration.m_modulesVerbosity[i];
-        }
-        if (!m_device->GetDriver()->WriteBlock(m_logAddress + sizeof(m_logHeader->write_ptr), sizeof(m_logHeader->module_level_enable), (char*)m_logHeader->module_level_enable))
-        {
-            LOG_ERROR << "Failed to write module verbosity structure for " << CPU_TYPE_TO_STRING[m_tracerType] << "(address 0x" << hex << m_logAddress + sizeof(m_logHeader->write_ptr) << ", data " << ((char*)m_logHeader->module_level_enable) << ", size " << sizeof(m_logHeader->module_level_enable) << ")" << endl;
-            return false;
-        }
-        else
-        {
-            LOG_DEBUG << "Module verbosity for " << CPU_TYPE_TO_STRING[m_tracerType] << "was set to " << CPU_TYPE_TO_STRING[m_tracerType] << GetModuleVerbosityConfigurationValue() << endl;
-        }
-        return true;
-    }
-
-    bool LogCollector::ReadLogWritePointer(void* logBuffer)
-    {
-        // Update FW & uCode log addresses
-        if (!m_logAddress)
-        {
-            //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " try to set log address" << endl;
-            ComputeLogStartAddress();
-        }
-
-        // Read the write pointer
-        DWORD writePointer = 0;
-        if (m_logAddress && !m_device->GetDriver()->Read(m_logAddress, writePointer))
-        {
-            //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " failed to read wptr" << endl;
-            return false;
-        }
-
-        // Set the write pointer to the buffer
-        memcpy(logBuffer, &writePointer, sizeof(writePointer));
-        //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " new wptr is " << writePointer << endl;
-        return true;
-    }
-
-    bool LogCollector::ReadLogBuffer(void* logBuffer, size_t size)
-    {
-        // Update FW & uCode log addresses
-        if (!m_logAddress)
-        {
-            ComputeLogStartAddress();
-        }
-
-        if (!m_logAddress)
-        {
-            //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " log address isn't set" << endl;
-        }
-
-        // Read the actual log
-        if (m_logAddress && !m_device->GetDriver()->ReadBlock(m_logAddress, size, (char*)logBuffer))
-        {
-            //cout << __FUNCTION__ << "," << __LINE__ << ": " << CPU_TYPE_TO_STRING[m_configuration.m_logType] << " failed to read buffer" << endl;
-            return false;
-        }
-        return true;
-    }
-
-    bool LogCollector::ComputeLogStartAddress()
-    {
-        // retrieve BB type (for getting ahb start address)
-        BasebandType bb = BASEBAND_TYPE_NONE;
-        bb = m_device->GetBasebandType();
-
-        // get ahb start address
-        unsigned ahb_start_address;
-        if (CPU_TYPE_FW == m_tracerType)
-        {
-            auto it = baseband_to_peripheral_memory_start_address_ahb.find(bb);
-            if (baseband_to_peripheral_memory_start_address_ahb.end() == it)
-            {
-                LOG_ERROR << CPU_TYPE_TO_STRING[m_tracerType] << "Log collector doesn't support baseband type (type code is " << bb << ")" << endl;
-                return false;
-            }
-            ahb_start_address = it->second;
-        }
-        else
-        {
-            auto it = baseband_to_ucode_dccm_start_address_ahb.find(bb);
-            if (baseband_to_ucode_dccm_start_address_ahb.end() == it)
-            {
-                LOG_ERROR << CPU_TYPE_TO_STRING[m_tracerType] << "Log collector doesn't support baseband type (type code is " << bb << ")" << endl;
-                return false;
-            }
-            ahb_start_address = it->second;
-        }
-
-        // get linker start address
-        unsigned linker_start_address;
-        if (CPU_TYPE_FW == m_tracerType)
-        {
-            auto it = baseband_to_peripheral_memory_start_address_linker.find(bb);
-            if (baseband_to_peripheral_memory_start_address_linker.end() == it)
-            {
-                LOG_ERROR << CPU_TYPE_TO_STRING[m_tracerType] << "Log collector doesn't support baseband type (type code is " << bb << ")" << endl;
-                return false;
-            }
-            linker_start_address = it->second;
-        }
-        else
-        {
-            auto it = baseband_to_ucode_dccm_start_address_linker.find(bb);
-            if (baseband_to_ucode_dccm_start_address_linker.end() == it)
-            {
-                LOG_ERROR << CPU_TYPE_TO_STRING[m_tracerType] << "Log collector doesn't support baseband type (type code is " << bb << ")" << endl;
-                return false;
-            }
-            linker_start_address = it->second;
-        }
-
-        // calculate the difference between the buffer start address as dirver exposes it to the buffer start address as fw/ucode exposes it
-        unsigned ahbToLinkerDelta = ahb_start_address - linker_start_address;
-
-        // retrieve fw/ucode offset from peripheral_memory_start_linker_address
-        DWORD addressToReadLogOffset = logTracerTypeToLogOffsetAddress[m_tracerType];
-        DWORD logOffset = 0;
-        if (!m_device->GetDriver()->Read(addressToReadLogOffset, logOffset))
-        {
-            LOG_ERROR << "Log collector failed to read log offset address" << endl;
-            return false;
-        }
-
-        // calculate first address of fw/ucode log buffer
-        m_logAddress = ahbToLinkerDelta + logOffset;
-        return true;
-    }
-
-    void LogCollector::ParseModuelLevel(string moduleString)
-    {
-        for (int i = 0; i < NUM_MODULES; i++)
-        {
-            if (moduleString.find(module_names[i]) == 0)
-            {
-                // + 1 for '='
-                string levels = moduleString.substr(module_names[i].size() + 1);
-
-                if (levels.find("V") != string::npos)
-                {
-                    m_configuration.m_modulesVerbosity[i].verbose_level_enable = 1;
-                }
-                if (levels.find("I") != string::npos)
-                {
-                    m_configuration.m_modulesVerbosity[i].info_level_enable = 1;
-                }
-                if (levels.find("E") != string::npos)
-                {
-                    m_configuration.m_modulesVerbosity[i].error_level_enable = 1;
-                }
-                if (levels.find("W") != string::npos)
-                {
-                    m_configuration.m_modulesVerbosity[i].warn_level_enable = 1;
-                }
-            }
-        }
-    }
-
-    string LogCollector::GetModuleVerbosityConfigurationValue()
-    {
-        stringstream ss;
-        for (int i = 0; i < NUM_MODULES; i++)
-        {
-            ss << module_names[i] << configuration_parameter_value_delimiter;
-            if (m_configuration.m_modulesVerbosity[i].verbose_level_enable)
-            {
-                ss << "V";
-            }
-            if (m_configuration.m_modulesVerbosity[i].info_level_enable)
-            {
-                ss << "I";
-            }
-            if (m_configuration.m_modulesVerbosity[i].error_level_enable)
-            {
-                ss << "E";
-            }
-            if (m_configuration.m_modulesVerbosity[i].warn_level_enable)
-            {
-                ss << "W";
-            }
-            ss << configuration_modules_delimiter;
-        }
-        return ss.str();
-    }
-
-    bool LogCollector::SetConfigurationParamerter(const string& parameter, const string& value)
-    {
-        try
-        {
-            if (log_collector::polling_interval == parameter)
-            {
-                m_configuration.m_pollingIntervalMs = chrono::milliseconds(atoi(value.c_str()));
-                LOG_DEBUG << "Polling Interval was set to " << m_configuration.m_pollingIntervalMs.count() << " ms" << endl;
-            }
-            else if (log_collector::result_file_suffix == parameter)
-            {
-                m_configuration.m_logFileSuffix = value;
-                LOG_DEBUG << "Result path = " << m_configuration.m_logFileSuffix << endl;
-            }
-            else if (log_collector::module_level_prefix == parameter)
-            {
-                ParseModuelLevel(value);
-            }
-            else if (log_collector::record_to_file == parameter)
-            {
-                m_configuration.m_recordToFile = (value == true_str);
-                LOG_DEBUG << "Record to file is set to " << (m_configuration.m_recordToFile ? true_str : false_str) << endl;
-            }
-            else if (log_collector::log_fragment_size == parameter)
-            {
-                m_configuration.m_fileFragmentSize = atoi(value.c_str()) * 1024 * 1024;
-                LOG_DEBUG << "File fragment size is " << m_configuration.m_fileFragmentSize << endl;
-            }
-            else
-            {
-                LOG_WARNING << "No such configuration parameter" << endl;
-            }
-            return true;
-        }
-        catch (...)
-        {
-            LOG_ERROR << "Got exception while trying to set a value to parameter " + parameter << endl;
-            return false;
-        }
-
-    }
-
-    string LogCollector::GetConfigurationParameterValue(const string& parameter, bool& success)
-    {
-        success = true;
-        if (log_collector::polling_interval == parameter)
-        {
-            stringstream ss;
-            ss << m_configuration.m_pollingIntervalMs.count();
-            return ss.str();
-        }
-        else if (log_collector::result_file_suffix == parameter)
-        {
-            return m_configuration.m_logFileSuffix;
-        }
-        else if (log_collector::module_level_prefix == parameter)
-        {
-            return GetModuleVerbosityConfigurationValue();
-        }
-        else if (log_collector::record_to_file == parameter)
-        {
-            return (m_configuration.m_recordToFile? true_str : false_str);
-        }
-        else if (log_collector::log_fragment_size == parameter)
-        {
-            stringstream ss;
-            ss << m_configuration.m_fileFragmentSize;
-            return ss.str();
-        }
-        else
-        {
-            success = false;
-            return "No such configuration parameter";
-        }
-    }
-
-    string LogCollector::GetConfigurationDump()
-    {
-        bool success;
-        stringstream ss;
-        ss << polling_interval << GetConfigurationParameterValue(polling_interval, success);
-        ss << record_to_file << GetConfigurationParameterValue(record_to_file, success);
-        ss << log_fragment_size << GetConfigurationParameterValue(log_fragment_size, success);
-        ss << result_file_suffix << GetConfigurationParameterValue(result_file_suffix, success);
-        ss << module_level_prefix << GetConfigurationParameterValue(module_level_prefix, success);
-        return ss.str();
-    }
-
-}
-
diff --git a/debug-tools/host_manager_11ad/LogCollector.h b/debug-tools/host_manager_11ad/LogCollector.h
deleted file mode 100644
index 6d3aed9..0000000
--- a/debug-tools/host_manager_11ad/LogCollector.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _LOG_COLLECTOR_H
-#define _LOG_COLLECTOR_H
-#pragma once
-
-#include <chrono>
-
-#include "LogCollectorDefinitions.h"
-#include "LogCollectorConfiguration.h"
-#include "OsHandler.h"
-
-class Device;
-
-namespace log_collector
-{
-
-    class LogCollector
-    {
-    public:
-        // initialize a new instance of log collector with a refernce to the device its belongs to
-        LogCollector(Device* device, CpuType tracerType);
-
-        ~LogCollector() { if (!m_log_buf) free(m_log_buf); }
-
-        /*
-        * raise a flag for stop collecting logs
-        */
-        Status StopCollectingLogs();
-        Status StartCollectingLogs();
-        /******************** end of APIs for offline use (DmTools doesn't request for logs) *************/
-
-        /******************** APIs for online use (DmTools sends requests) ******************************/
-        /*
-        * Perform all required operations before collecting logs considering the given configuration, including "cleaning" the buffer (distibute the obsolete logs)
-        * @param: configuration for this collection session
-        * @return: operation status
-        */
-        Status PrepareLogCollection();
-
-        bool CollectionIsNeeded();
-
-        bool IsInitialized() const { return m_initialized; }
-
-        /*
-        * distribute next logs chunck (without log lines that were already read)
-        */
-        Status GetNextLogs(std::vector<RawLogLine>& rawLogLines);
-
-        /*
-        * Perform all required operations after collecting logs (e.g. close the log file if applicable)
-        */
-        Status FinishLogCollection();
-
-        bool SetConfigurationParamerter(const string& parameter, const string& value);
-        string GetConfigurationParameterValue(const string& parameter, bool& success);
-        string GetConfigurationDump();
-
-        /******************** end of APIs for online use (DmTools sends requests) ***********************/
-
-    private:
-        // returns the size of logs buffer in fw/ucode
-        size_t log_size(size_t entry_num) { return sizeof(struct log_table_header) + entry_num * 4; }
-
-        bool ComputeLogStartAddress();
-
-        // configurations
-        bool SetModuleVerbosity();
-        void ParseModuelLevel(string moduleString);
-        string GetModuleVerbosityConfigurationValue();
-        bool ReadConfigFile();
-        bool ParseConfigLine(string line);
-
-        // OS agnostic read log function
-        bool ReadLogBuffer(void* logBuffer, size_t size);
-        bool ReadLogWritePointer(void* logBuffer);
-
-        int ParseLog(void* log_buf, size_t log_buf_entries, std::vector<RawLogLine>& rawLogLines);
-
-        // output file methods
-        string GetNextOutputFileFullName();
-        bool CreateNewOutputFile();
-        void CloseOutputFile();
-        void WriteToOutputFile(const stringstream& logLine);
-
-        //****************** attributes ******************/
-
-        // log collector's context
-        LogCollectorConfiguration m_configuration;
-        Device* m_device;
-        string m_deviceName;
-        CpuType m_tracerType;
-        string m_logErrorMessagePrefix;
-
-        // managing collection
-        bool m_continueCollectingLogs;
-        std::chrono::system_clock::time_point m_lastPollingTimestamp;
-        bool m_initialized;
-        bool m_ongoingRecording;
-
-        // output file
-        ofstream m_outputFile;
-        long m_currentOutputFileSize = 0;
-
-        // log buffer members
-        unique_ptr<log_table_header> m_logHeader; // content of log buffer header
-        int m_logAddress; // log buffer start address
-        void* m_log_buf; // log buffer content
-        u32 m_rptr; // last read address
-        u32 m_lastWptr; // last write ptr address (used for detecting buffer overflow)
-                        //****************** end of attributes ************/
-    };
-
-}
-
-#endif // !_LOG_COLLECTOR_H
-
-
diff --git a/debug-tools/host_manager_11ad/LogCollectorConfiguration.h b/debug-tools/host_manager_11ad/LogCollectorConfiguration.h
deleted file mode 100644
index bba1d47..0000000
--- a/debug-tools/host_manager_11ad/LogCollectorConfiguration.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _LOG_COLLECTOR_CONFIGURATION_H
-#define _LOG_COLLECTOR_CONFIGURATION_H
-#pragma once
-
-#include <chrono>
-#include <string>
-#include <map>
-#include <algorithm>
-#include <string>
-#include "FileSystemOsAbstraction.h"
-#include "LogCollectorDefinitions.h"
-using namespace std;
-
-namespace log_collector
-{
-    struct LogCollectorConfiguration
-    {
-    public:
-
-        void ResetValue()
-        {
-            m_pollingIntervalMs = chrono::milliseconds(100);
-            m_recordToFile = false;
-            m_fileFragmentSize = MAX_FILE_FRAGMENT_SIZE;
-            m_logFileSuffix = "";
-            m_logType = CPU_TYPE_FW;
-            for (auto& module : m_modulesVerbosity)
-            {
-                module.verbose_level_enable = 0;
-                module.info_level_enable = 1;
-                module.error_level_enable = 1;
-                module.warn_level_enable = 1;
-                module.reserved0 = 0;
-            }
-        }
-
-        LogCollectorConfiguration()
-        {
-            ResetValue();
-        }
-
-        std::chrono::milliseconds m_pollingIntervalMs; // interval between two consecutive log polling in milliseconsd
-        bool m_recordToFile;
-        int m_fileFragmentSize;
-        string m_logFileSuffix;
-        CpuType m_logType;
-        module_level_enable m_modulesVerbosity[NUM_MODULES];
-    };
-}
-#endif // ! _LOG_COLLECTOR_CONFIGURATION_H
-
-
diff --git a/debug-tools/host_manager_11ad/LogCollectorDefinitions.h b/debug-tools/host_manager_11ad/LogCollectorDefinitions.h
deleted file mode 100644
index 8d7a742..0000000
--- a/debug-tools/host_manager_11ad/LogCollectorDefinitions.h
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef LOG_COLLECTOR_DEFINITIONS
-#define LOG_COLLECTOR_DEFINITIONS
-
-#pragma once
-
-#ifndef _WINDOWS    // Linux
-#include <unistd.h>
-#include <getopt.h>
-#include <err.h>
-#else                // Windows
-#include <windows.h>
-#endif  //#ifdef _WINDOWS
-
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <stdarg.h>
-#include <ctime>
-#include <map>
-#include <vector>
-
-#include "HostManagerDefinitions.h"
-
-namespace log_collector
-{
-    //#pragma region type definitions
-
-    enum MODULES
-    {
-        SYSTEM,
-        DRIVERS,
-        MAC_MON,
-        HOST_CMD,
-        PHY_MON,
-        INFRA,
-        CALIBS,
-        TXRX,
-        RAD_MGR,
-        SCAN,
-        MLME,
-        L2_MGR,
-        DISC,
-        MGMT_SRV,
-        SEC_PSM,
-        WBE_MNGR,
-        NUM_MODULES,
-    };
-
-    enum LogCollectorStatus
-    {
-        lcSuccess,
-        lcFailedToCreateNewFile,
-        lcFailedToAllocateLogBuffer,
-        lcInvalidDevice,
-        lcInvalidDriver,
-        lcFailedToReadBuffer
-    };
-
-    typedef uint32_t u32;
-    typedef int32_t s32;
-    typedef unsigned int uint;
-
-#ifdef _WINDOWS
-    struct module_level_enable { /* Little Endian */
-        char error_level_enable : 1;
-        char warn_level_enable : 1;
-        char info_level_enable : 1;
-        char verbose_level_enable : 1;
-        char reserved0 : 4;
-
-        module_level_enable& operator=(const module_level_enable& other)
-        {
-            if (this == &other)
-            {
-                return *this;
-            }
-            error_level_enable = other.error_level_enable;
-            warn_level_enable = other.warn_level_enable;
-            info_level_enable = other.info_level_enable;
-            verbose_level_enable = other.verbose_level_enable;
-            reserved0 = other.reserved0;
-            return *this;
-        }
-    };
-    struct log_trace_header { /* Little Endian */
-        uint strring_offset : 20;
-        uint module : 4; /* module that outputs the trace */
-        uint level : 2;
-        uint parameters_num : 2; /* [0..3] */
-        uint is_string : 1; /* indicate if the printf uses %s */
-        uint signature : 3; /* should be 5 (2'101) in valid header */
-    };
-#else
-    struct module_level_enable { /* Little Endian */
-        uint error_level_enable : 1;
-        uint warn_level_enable : 1;
-        uint info_level_enable : 1;
-        uint verbose_level_enable : 1;
-        uint reserved0 : 4;
-
-        module_level_enable& operator=(const module_level_enable& other)
-        {
-            if (this == &other)
-            {
-                return *this;
-            }
-            error_level_enable = other.error_level_enable;
-            warn_level_enable = other.warn_level_enable;
-            info_level_enable = other.info_level_enable;
-            verbose_level_enable = other.verbose_level_enable;
-            reserved0 = other.reserved0;
-            return *this;
-        }
-
-    } __attribute__((packed));
-
-    struct log_trace_header { /* Little Endian */
-                              /* the offset of the trace string in the strings sections */
-        uint strring_offset : 20;
-        uint module : 4; /* module that outputs the trace */
-                         /*    0 - Error
-                         1- WARN
-                         2 - INFO
-                         3 - VERBOSE */
-        uint level : 2;
-        uint parameters_num : 2; /* [0..3] */
-        uint is_string : 1; /* indicate if the printf uses %s */
-        uint signature : 3; /* should be 5 (2'101) in valid header */
-    } __attribute__((packed));
-#endif
-
-    union log_event {
-        struct log_trace_header hdr;
-        u32 param;
-    };
-
-    struct log_table_header {
-        u32 write_ptr; /* incremented by trace producer every write */
-        struct module_level_enable module_level_enable[NUM_MODULES];
-        union log_event evt[0];
-    };
-
-    enum {
-        str_mask = 0xFFFFF,
-    };
-
-    enum missing_log_lines_reason {
-        NO_MISSED_LOGS = 0,
-        RPTR_LARGER_THAN_WPTR,
-        BUFFER_OVERRUN,
-        INVALID_SIGNATURE
-    };
-
-    struct RawLogLine
-    {
-        RawLogLine(unsigned module, unsigned level, unsigned signature, unsigned strOffset, unsigned isString, const std::vector<unsigned>& params) :
-            m_strOffset(strOffset),
-            m_module(module),
-            m_level(level),
-            m_params(params),
-            m_isString(isString),
-            m_signature(signature),
-            m_numOfMissingLogDwords(0),
-            m_missingLogsReason(NO_MISSED_LOGS)
-        {}
-
-        RawLogLine(missing_log_lines_reason missingLogLinesReason, unsigned numOfMissingLogLines) :
-            m_strOffset(0),
-            m_module(0),
-            m_level(0),
-            m_isString(0),
-            m_signature(0),
-            m_numOfMissingLogDwords(numOfMissingLogLines),
-            m_missingLogsReason(missingLogLinesReason)
-        {}
-
-        unsigned m_strOffset;
-        unsigned m_module;
-        unsigned m_level;
-        std::vector<unsigned> m_params;
-        unsigned m_isString;
-        unsigned m_signature;
-        unsigned m_numOfMissingLogDwords;
-        missing_log_lines_reason m_missingLogsReason;
-    };
-
-    //#pragma endregion
-
-    //#pragma region constants
-
-    // 50 MB file size
-    const int MAX_FILE_FRAGMENT_SIZE = 1024 * 1024 * 50;
-
-    // RGFs containing log buffer addresses
-    // FW log address
-    const int REG_FW_USAGE_1 = 0x880004;
-    // uCode log address
-    const int REG_FW_USAGE_2 = 0x880008;
-
-    // Firmware version RGFs
-    const int FW_VERSION_MAJOR = 0x880a2c;
-    const int FW_VERSION_MINOR = 0x880a30;
-    const int FW_VERSION_SUB = 0x880a34;
-    const int FW_VERSION_BUILD = 0x880a38;
-
-    // Firmware Compilation Time RGFs
-    const int FW_COMP_TIME_HOUR = 0x880a14;
-    const int FW_COMP_TIME_MINUTE = 0x880a18;
-    const int FW_COMP_TIME_SECOND = 0x880a1c;
-    const int FW_COMP_TIME_DAY = 0x880a20;
-    const int FW_COMP_TIME_MONTH = 0x880a24;
-    const int FW_COMP_TIME_YEAR = 0x880a28;
-
-    // Log buffer offsets
-    // FW log address offset
-    //const int peripheral_memory_start_linker_address = 0x840000;
-    // uCode log address offset
-    //const int ucode_dccm = 0x800000;
-    //const int UCODE_LOG_ADDRESS_OFFSET = 0;
-
-    // Entries in the fw log buf
-    const size_t fw_log_buf_entries = 0x1000 / 4;
-
-    const std::string module_names[NUM_MODULES] = { "SYSTEM", "DRIVERS", "MAC_MON", "HOST_CMD", "PHY_MON", "INFRA", "CALIBS", "TXRX", "RAD_MGR", "SCAN", "MLME", "L2_MGR", "DISC", "MGMT_SRV", "SEC_PSM", "WBE_MNGR" };
-    const char *const levels[] = { "E", "W", "I", "V" };
-    const std::string VIEW = "VIEW";
-    static std::map<BasebandType, unsigned> baseband_to_peripheral_memory_start_address_linker = { { BASEBAND_TYPE_SPARROW, 0x840000 },{ BASEBAND_TYPE_TALYN, 0x840000 } };
-    static std::map<BasebandType, unsigned> baseband_to_peripheral_memory_start_address_ahb = { { BASEBAND_TYPE_SPARROW, 0x908000 },{ BASEBAND_TYPE_TALYN, 0xA20000 } };
-    static std::map<BasebandType, unsigned> baseband_to_ucode_dccm_start_address_linker = { { BASEBAND_TYPE_SPARROW, 0x800000 },{ BASEBAND_TYPE_TALYN, 0x800000 } };
-    static std::map<BasebandType, unsigned> baseband_to_ucode_dccm_start_address_ahb = { { BASEBAND_TYPE_SPARROW, 0x940000 },{ BASEBAND_TYPE_TALYN, 0xA78000 } };
-    static std::map<CpuType, int> logTracerTypeToLogOffsetAddress = { { CPU_TYPE_FW, REG_FW_USAGE_1 },{ CPU_TYPE_UCODE, REG_FW_USAGE_2 } };
-
-    // Config file filename
-#ifdef _WINDOWS
-    const char* const DEFAULT_CONFIG_FILE_NAME = "wigig_logcollector.ini";
-#else
-    const char* const DEFAULT_CONFIG_FILE_NAME = "/etc/wigig_logcollector.ini";
-#endif
-
-    //#pragma endregion
-
-    // configuration definitions
-    const std::string polling_interval = "polling_interval_ms=";
-    const std::string result_file_suffix = "result_file_suffix=";
-    const std::string module_level_prefix = "MODULE_LEVEL_";
-    const std::string record_to_file = "record_to_file=";
-    const std::string log_fragment_size = "log_fragment_size=";
-
-    const std::string m_configFileName = "LogConfig.txt";
-    const std::string true_str = "TRUE";
-    const std::string false_str = "FALSE";
-    const std::string configuration_parameter_value_delimiter = "=";
-    const std::string configuration_modules_delimiter = ",";
-}
-
-#endif // !LOG_COLLECTOR_DEFINITIONS
-
diff --git a/debug-tools/host_manager_11ad/Makefile b/debug-tools/host_manager_11ad/Makefile
deleted file mode 100644
index 06dd371..0000000
--- a/debug-tools/host_manager_11ad/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
--include $(TOPDIR)/rules.mk
-
-CPPFLAGS := -Wall -g -MMD -std=c++0x -fPIE
-LDFLAGS := -pthread -fPIE -pie
-
-ifneq ($(CONFIG_TARGET_ipq)$(CONFIG_TARGET_ipq806x),)
-is_ipq806x = 1
-endif
-
-ifeq ($(is_ipq806x), 1)
-ifneq ($(strip $(TOOLPREFIX)),)
-CROSS:=$(TOOLPREFIX)
-endif
-endif
-
-CXX := $(CROSS)g++
-
-.DEFAULT_GOAL = all
-PROG = host_manager_11ad
-
-INCLUDE_CFLAGS += \
-	-I .\
-	-I access_layer_11ad \
-	-I access_layer_11ad/Unix \
-
-all: $(PROG)
-
-CPP_FILES = $(shell find . -type f -name '*.cpp')
-OBJ_FILES=  $(CPP_FILES:.cpp=.o)
-
-$(PROG): $(OBJ_FILES) $(LIBS)
-	$(CXX) -o $@ $^ $(LDFLAGS) $(LIBS)
-
-%.o : %.cpp
-	$(CXX) $(CPPFLAGS) $(INCLUDE_CFLAGS) -o $@ -c $<
-
-clean:
-	rm -rf $(PROG)
-	find . -type f \( -name "*.d" -o -name "*.o" -o -name "*~" \) -delete
-
--include $(OBJ_FILES:%.o=%.d)
diff --git a/debug-tools/host_manager_11ad/MessageParser.cpp b/debug-tools/host_manager_11ad/MessageParser.cpp
deleted file mode 100644
index ede3ba1..0000000
--- a/debug-tools/host_manager_11ad/MessageParser.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "MessageParser.h"
-//#include <regex>
-#include <sstream>
-
-// *************************************************************************************************
-
-MessageParser::MessageParser(string message)
-    :m_message(message)
-{
-    char delimeter = '|'; //The new separator in a message is: "|", the old one is " ", keep the old one for backward compatibility
-    if (message.find_first_of(delimeter) == string::npos)
-    { //The new separator is *not* in the message, that means that the message is in the old format
-        delimeter = ' ';
-    }
-    m_splitMessage = m_SplitMessageByDelim(m_message, delimeter);
-}
-
-// *************************************************************************************************
-vector<string> MessageParser::m_SplitMessageByDelim(const string &message, char delim)
-{
-    vector<string> splitMessage;
-    stringstream sstream(message);
-    string word;
-    while (getline(sstream, word, delim))
-    {
-        if (word.empty())
-        { //don't push whitespace
-            continue;
-        }
-        splitMessage.push_back(word);
-    }
-    return splitMessage;
-}
-
-// *************************************************************************************************
-
-string MessageParser::GetCommandFromMessage()
-{
-    return string(m_splitMessage.front());
-
-}
-
-
-// *************************************************************************************************
-
-vector<string> MessageParser::GetArgsFromMessage()
-{
-    vector<string> temp = m_splitMessage;
-    temp.erase(temp.begin());
-    return temp;
-}
-
-// *************************************************************************************************
-
-unsigned int MessageParser::GetNumberOfArgs()
-{
-    return (m_splitMessage.size()-1); //(-1) because the function name is in also in the message
-}
diff --git a/debug-tools/host_manager_11ad/MessageParser.h b/debug-tools/host_manager_11ad/MessageParser.h
deleted file mode 100644
index 07c31b2..0000000
--- a/debug-tools/host_manager_11ad/MessageParser.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _MESSAGEPARSER_H
-#define _MESSAGEPARSER_H
-
-#include <iostream>
-#include "DebugLogger.h"
-#include <vector>
-
-using namespace std;
-
-// *************************************************************************************************
-
-class MessageParser
-{
-public:
-
-    MessageParser(string message);
-
-    /*
-     * Returns the command name from the message. Command name should be the first parameter in the message.
-     */
-    string GetCommandFromMessage();
-
-    vector<string> GetArgsFromMessage();
-
-    unsigned int GetNumberOfArgs();
-
-private:
-    string m_message; //holds the initial message - before was being parsed
-    vector<string> m_splitMessage;
-
-    vector<string> m_SplitMessageByDelim(const string &message, char delim);
-
-};
-
-#endif // !_MESSAGEPARSER_H
diff --git a/debug-tools/host_manager_11ad/OperationStatus.h b/debug-tools/host_manager_11ad/OperationStatus.h
deleted file mode 100644
index 5ca58a2..0000000
--- a/debug-tools/host_manager_11ad/OperationStatus.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _OPERATION_STATUS_H_
-#define _OPERATION_STATUS_H_
-
-#include "DebugLogger.h"
-
-#include <string>
-#include <ostream>
-
-class OperationStatus
-{
-public:
-
-    OperationStatus(bool success, const char* szMsg = NULL)
-        : m_Success(success)
-        , m_Msg(szMsg ? szMsg : "")
-    {
-    }
-
-    OperationStatus(bool success, const std::string& msg)
-        : m_Success(success)
-        , m_Msg(msg)
-    {
-    }
-
-    bool IsSuccess() const { return m_Success; }
-    const std::string& GetMessage() const { return m_Msg; }
-
-private:
-
-    const bool m_Success;
-    const std::string m_Msg;
-};
-
-inline std::ostream& operator<<(std::ostream& os, const OperationStatus& st)
-{
-    return os << "Completed: " << SuccessStr(st.IsSuccess())
-              << " Message: [" << st.GetMessage() << ']';
-}
-
-
-#endif  // _OPERATION_STATUS_H_
diff --git a/debug-tools/host_manager_11ad/OsHandler.cpp b/debug-tools/host_manager_11ad/OsHandler.cpp
deleted file mode 100644
index 4382c84..0000000
--- a/debug-tools/host_manager_11ad/OsHandler.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "OsHandler.h"
-#include <memory>
-#include <iostream> //TODO - maybe to remove
-#ifdef __OS3__
-#include <sys/signal.h>
-#endif
-#include "Host.h"
-using namespace std; //TODO - maybe to remove
-
-#ifndef _WINDOWS
-void sig_quit_handler(int signum)
-{
-    if (signum == SIGQUIT || signum == SIGTSTP)
-    {
-        printf("Exiting host_manager_11ad as per user request\n");
-        Host::GetHost().StopHost();
-        exit(signum);
-    }
-    else if (signum == SIGPIPE)
-    {
-        //printf("Connection lost\n");
-    }
-}
-#endif
-
-// *************************************************************************************************
-
-void OsHandler::HandleOsSignals()
-{
-#ifndef _WINDOWS
-    //LOG_INFO << "Handle linux SIQQUIT signal" << endl;
-    signal(SIGQUIT, sig_quit_handler);
-    signal(SIGPIPE, sig_quit_handler);
-    signal(SIGTSTP, sig_quit_handler);
-#endif
-
-}
-
-// *************************************************************************************************
-
-void OsHandler::OsSleep(int sleep_period)
-{
-#ifdef _WINDOWS
-    Sleep(sleep_period);
-#else
-    usleep(sleep_period * SECOND_IN_MILLISECONDS);
-#endif
-}
-
-//void OsHandler::OsError(const char* error_message, ...)
-//{
-//    va_list argptr;
-//    va_start(argptr, error_message);
-//
-//#ifdef _WINDOWS
-//    vfprintf(stderr, error_message, argptr);
-//
-//    exit(0);
-//#else
-//    vfprintf(stderr, error_message, argptr);
-//
-//    exit(0);
-//#endif
-//
-//    va_end(argptr);
-//}
-
diff --git a/debug-tools/host_manager_11ad/OsHandler.h b/debug-tools/host_manager_11ad/OsHandler.h
deleted file mode 100644
index 04ba702..0000000
--- a/debug-tools/host_manager_11ad/OsHandler.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _OSHANDLER_H_
-#define _OSHANDLER_H_
-
-
-
-// *************************************************************************************************
-
-/*
-* Class handling specific OS implementations
-*/
-class OsHandler
-{
-public:
-
-    /*
-    * Function to handle os signals - mostly relevant for linux os.
-    */
-    void HandleOsSignals();
-
-    /*
-    * OS agnostic sleep function
-    */
-    static void OsSleep(int sleep_period);
-
-    /*
-    * OS agnostic error print function
-    */
-    static void OsError(const char* error_message, ...);
-};
-
-#endif // _OSHANDLER_H_
-
diff --git a/debug-tools/host_manager_11ad/TcpNetworkInterface.cpp b/debug-tools/host_manager_11ad/TcpNetworkInterface.cpp
deleted file mode 100644
index 521d9a5..0000000
--- a/debug-tools/host_manager_11ad/TcpNetworkInterface.cpp
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "TcpNetworkInterface.h"
-#include "DebugLogger.h"
-
-#include <cerrno>
-#include <string.h>
-#include <stdlib.h>
-
-#ifndef _WINDOWS
-#include <netinet/tcp.h>
-#endif
-
-using namespace TcpNetworkInterfaces;
-
-// *************************************************************************************************
-
-NetworkInterface::NetworkInterface()
-{
-#ifdef _WINDOWS
-    WSADATA wsa;
-
-    if (-1 == WSAStartup(MAKEWORD(2, 0), &wsa))
-    {
-        LOG_ERROR << "Cannot initialize network library" << std::endl;
-        exit(1);
-    }
-#endif
-
-    m_fileDescriptor = socket(AF_INET, SOCK_STREAM, 0);
-    if (m_fileDescriptor < 0)
-    {
-        LOG_ERROR << "Cannot create socket file descriptor: " << strerror(errno) << std::endl;
-        exit(1);
-    }
-
-    char optval = 1;
-    setsockopt(m_fileDescriptor, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
-
-    m_localAddress.sin_family = AF_INET;
-    m_bufferSize = 0;
-    m_buffer = NULL;
-}
-
-// *************************************************************************************************
-
-NetworkInterface::NetworkInterface(int fileDescriptor)
-    : m_fileDescriptor(fileDescriptor)
-    , m_buffer(NULL)
-    , m_bufferSize(0)
-{
-
-    UpdatePeerNameInternal();
-}
-
-// Establish Connections
-void NetworkInterface::Bind(int port)
-{
-    m_localAddress.sin_port = htons(port);
-    m_localAddress.sin_addr.s_addr = INADDR_ANY;
-    memset(m_localAddress.sin_zero, '\0', sizeof m_localAddress.sin_zero);
-
-    if (-1 == bind(m_fileDescriptor, (struct sockaddr*)&m_localAddress, sizeof(m_localAddress)))
-    {
-        LOG_ERROR << "Cannot bind listener to port " << port << ": " << strerror(errno) << std::endl;
-        LOG_ERROR << "Please verify if another application instance is running" << std::endl;
-        exit(1);
-    }
-}
-
-// *************************************************************************************************
-
-void NetworkInterface::Listen(int backlog)
-{
-    if (-1 == listen(m_fileDescriptor, backlog))
-    {
-        LOG_ERROR << "Cannot listen to the socket: " << strerror(errno) << std::endl;
-        LOG_ERROR << "Please verify if another application instance is running" << std::endl;
-        exit(1);
-    }
-}
-
-NetworkInterface NetworkInterface::Accept()
-{
-    struct sockaddr_in remoteAddress;
-    socklen_t size = sizeof(remoteAddress);
-
-    int optval = 1;
-    int result = setsockopt(m_fileDescriptor, IPPROTO_TCP, TCP_NODELAY, (char*)&optval, sizeof(int));
-    if (result < 0)
-    {
-        LOG_ERROR << "Cannot accept incoming connection: " << strerror(errno) << std::endl;
-        exit(1);
-    }
-    int fileDescriptor = accept(m_fileDescriptor, (struct sockaddr*)&remoteAddress, &size);
-    if (fileDescriptor <= 0)
-    {
-        LOG_ERROR << "Cannot accept incoming connection: " << strerror(errno) << std::endl;
-        exit(1);
-    }
-    return NetworkInterface(fileDescriptor);
-}
-
-// *************************************************************************************************
-
-bool NetworkInterface::SendString(const std::string& text)
-{
-    LOG_VERBOSE << "Sending text: " << PlainStr(text) << std::endl;
-    return SendBuffer(text.c_str(), text.size());
-}
-
-// *************************************************************************************************
-
-bool NetworkInterface::SendString(const char* szText)
-{
-    return SendBuffer(szText, strlen(szText));
-}
-
-// *************************************************************************************************
-
-bool NetworkInterface::SendBuffer(const char* pBuf, size_t bufSize)
-{
-    size_t sentSize = 0;
-    const char* pCurrent = pBuf;
-
-    while (sentSize < bufSize)
-    {
-        int chunkSize = send(m_fileDescriptor, pCurrent, bufSize - sentSize, 0);
-        if (chunkSize < 0)
-        {
-            LOG_ERROR << "Error sending data."
-                      << " Error: " << strerror(errno)
-                      << " Sent till now (B): " << sentSize
-                      << " To be sent (B): " << sentSize
-                      << std::endl;
-
-            return false;
-        }
-
-        sentSize += chunkSize;
-        pCurrent += chunkSize;
-
-        LOG_VERBOSE << "Sent data chunk."
-                    << " Chunk Size (B): " << chunkSize
-                    << " Sent till now (B): " << sentSize
-                    << " To be sent (B): " << bufSize
-                    << std::endl;
-    }
-
-    LOG_VERBOSE << "Buffer sent successfully."
-                << " Sent (B): " << sentSize
-                << " Buffer Size (B): " << bufSize
-                << std::endl;
-    LOG_ASSERT(sentSize == bufSize);
-
-    return true;
-}
-
-// *************************************************************************************************
-
-const char* NetworkInterface::Receive(int size, int flags)
-{
-    if (m_bufferSize <= size + 1)
-    {
-        m_buffer = (char*)(realloc(m_buffer, sizeof(char) * (size + 1)));
-        if (m_buffer == nullptr)
-        {
-            return nullptr;
-        }
-        m_bufferSize = size;
-    }
-
-    memset(m_buffer, 0, m_bufferSize);
-
-    int bytesReceived = recv(m_fileDescriptor, m_buffer, size, flags);
-    if (-1 == bytesReceived)
-    {
-        LOG_ERROR << "Error while receiving from a TCP socket: " << strerror(errno) << std::endl;
-        return nullptr;
-    }
-    if (0 == bytesReceived)
-    {
-        LOG_INFO << "Connection closed by peer " << m_peerName << std::endl;
-        return nullptr;
-    }
-    m_buffer[bytesReceived] = '\0';
-    return m_buffer;
-}
-
-// *************************************************************************************************
-
-const char* NetworkInterface::BinaryReceive(int size, int flags)
-{
-    if (m_bufferSize <= size)
-    {
-        m_buffer = (char*)(realloc(m_buffer, sizeof(char) * size));
-        if (m_buffer == nullptr)
-        {
-            return nullptr;
-        }
-        m_bufferSize = size;
-    }
-
-    memset(m_buffer, 0, m_bufferSize);
-
-    int bytesReceived = recv(m_fileDescriptor, m_buffer, size, flags);
-    if (-1 == bytesReceived)
-    {
-        LOG_ERROR << "Error while receiving from a TCP socket: " << strerror(errno) << std::endl;
-        return nullptr;
-    }
-    if (0 == bytesReceived)
-    {
-        LOG_INFO << "Connection closed by peer " << m_peerName << std::endl;
-        return nullptr;
-    }
-
-    return m_buffer;
-}
-
-// *************************************************************************************************
-
-// Socket Closing Functions
-void NetworkInterface::Close()
-{
-#ifdef _WINDOWS
-    WSACleanup();
-    closesocket(m_fileDescriptor);
-#elif __linux
-    close(m_fileDescriptor);
-#else
-    shutdown(m_fileDescriptor, SHUT_RDWR);
-#endif
-}
-
-// *************************************************************************************************
-
-void NetworkInterface::Shutdown(int type)
-{
-#ifdef _WINDOWS
-    WSACleanup();
-#endif
-
-    shutdown(m_fileDescriptor, type);
-}
-
-// *************************************************************************************************
-
-void NetworkInterface::UpdatePeerNameInternal()
-{
-    struct sockaddr_in remoteAddress;
-    socklen_t size = sizeof(remoteAddress);
-
-    if (-1 == getpeername(m_fileDescriptor, (struct sockaddr*)&remoteAddress, &size))
-    {
-        LOG_ERROR << "Failure in getpeername" << std::endl;
-        exit(1);
-    }
-
-    m_peerName = inet_ntoa(remoteAddress.sin_addr);
-}
-
-// *************************************************************************************************
-
-const char* NetworkInterface::GetPeerName() const
-{
-    return m_peerName.c_str();
-}
diff --git a/debug-tools/host_manager_11ad/TcpNetworkInterface.h b/debug-tools/host_manager_11ad/TcpNetworkInterface.h
deleted file mode 100644
index b341818..0000000
--- a/debug-tools/host_manager_11ad/TcpNetworkInterface.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _SOCKET_H_
-#define _SOCKET_H_
-
-#ifdef _WINDOWS
-#pragma comment(lib, "Ws2_32.lib")
-#endif
-
-#include <cstdlib>
-#include <cstdio>
-#include <cerrno>
-#include <cstring>
-#include <string>
-
-#ifdef _WINDOWS
-#include <winsock.h>
-#elif __linux
-#include <unistd.h>
-#include <netdb.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/wait.h>
-#else
-#include <sys/socket.h>
-#include <net/route.h>
-#include <net/if.h>
-#include <arpa/inet.h>
-#endif
-
-#ifdef _WINDOWS
-typedef int socklen_t;
-#endif
-
-
-namespace TcpNetworkInterfaces
-{
-    class NetworkInterface
-    {
-    private:
-
-        int m_fileDescriptor;
-        struct sockaddr_in m_localAddress;
-        char* m_buffer;
-        int m_bufferSize;
-        std::string m_peerName;
-
-    public:
-
-        NetworkInterface();
-        explicit NetworkInterface(int sockfd);
-
-        // Establish Connection
-        void Bind(int portNumber);
-        void Listen(int backlog = 5);
-        NetworkInterface Accept();
-
-        // Send and Receive
-        bool SendString(const std::string& text);
-        bool SendString(const char* szText);
-        bool SendBuffer(const char* pBuf, size_t bufSize);
-
-        const char* Receive(int size = 1024, int flags = 0);
-        const char* BinaryReceive(int size, int flags = 0);
-
-        // Terminate Connection
-        void Close();
-        void Shutdown(int type);
-
-        // Addresses
-        const char* GetPeerName() const;
-        void UpdatePeerNameInternal();
-    };
-
-}
-
-#endif // !_NETWORK_INTERFACE_H_
diff --git a/debug-tools/host_manager_11ad/UdpNetworkInterface.cpp b/debug-tools/host_manager_11ad/UdpNetworkInterface.cpp
deleted file mode 100644
index c645b52..0000000
--- a/debug-tools/host_manager_11ad/UdpNetworkInterface.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef __linux
-#include <stdlib.h>
-#include <string.h>
-#include <cerrno>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <stdio.h>
-
-#elif _WINDOWS
-#include <windows.h>
-
-#else
-#include <dirent.h>
-#include <sys/socket.h>
-#include <net/route.h>
-#include <net/if.h>
-#include <arpa/inet.h>
-#endif
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include "DebugLogger.h"
-#include "UdpNetworkInterface.h"
-
-UdpNetworkInterface::UdpNetworkInterface(std::string broadcastIp, int portIn, int portOut)
-{
-    m_portIn = portIn;
-    m_portOut = portOut;
-    m_broadcastIp = broadcastIp;
-#ifndef _WINDOWS
-    // create UDP socket
-    m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-    if (m_socket < 0)
-    {
-        std::string error = "Can't open UDP socket";
-        LOG_WARNING << error << std::endl;
-        throw error;
-    }
-
-    // set broadcast flag on
-    int enabled = 1;
-    if (setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&enabled, sizeof(enabled)) < 0)
-    {
-        std::string error = "Can't set broadcast option for udp socket, error: ";
-        error += strerror(errno);
-
-        LOG_WARNING << error << std::endl;
-        shutdown(m_socket, SHUT_RDWR);
-        throw error;
-    }
-
-    // bind socket to portIn
-    struct sockaddr_in address;
-    address.sin_family = AF_INET;
-    address.sin_addr.s_addr = INADDR_ANY;
-    address.sin_port = htons(m_portIn);
-    if (::bind(m_socket, (struct sockaddr *)&address, sizeof(struct sockaddr_in)) < 0)
-    {
-        std::string error = "Can't bind socket to port, error: ";
-        error += strerror(errno);
-
-        LOG_WARNING << error << std::endl;
-        throw error;
-    }
-#else
-    std::string error = "UDP socket is supported on linux OS only";
-    throw error;
-#endif
-}
-
-int UdpNetworkInterface::Send(std::string message)
-{
-#ifndef _WINDOWS
-    struct sockaddr_in dstAddress;
-    dstAddress.sin_family = AF_INET;
-    inet_pton(AF_INET, m_broadcastIp.c_str(), &dstAddress.sin_addr.s_addr);
-    dstAddress.sin_port = htons(m_portOut);
-    int messageSize = message.length() * sizeof(char);
-    int result = sendto(m_socket, message.c_str(), messageSize, 0, (sockaddr*)&dstAddress, sizeof(dstAddress));
-    LOG_VERBOSE << "INFO : sendto with sock_out=" << m_socket << ", message=" << message << " messageSize=" << messageSize << " returned with " << result << std::endl;
-    if (result < 0)
-    {
-        LOG_WARNING << "ERROR : Cannot send udp broadcast message, error " << ": " << strerror(errno) << std::endl;
-        return 0;
-    }
-    return messageSize;
-#else
-    return 0;
-#endif
-}
-
-const char* UdpNetworkInterface::Receive(int len)
-{
-#ifndef _WINDOWS
-    char* buf = new char[len];
-    if (nullptr == buf)
-    {
-        LOG_ERROR << "Cannot allocate receive buffer for UDP messages" << std::endl;
-        return "";
-    }
-
-    if (recvfrom(m_socket, buf, len, 0, NULL, 0) < 0)
-    {
-        LOG_WARNING << "Can't receive from port " << m_portIn << std::endl;
-        return "";
-    }
-    return buf;
-#else
-    return "";
-#endif
-}
-
-void UdpNetworkInterface::Close()
-{
-#ifndef _WINDOWS
-    shutdown(m_socket, SHUT_RDWR);
-#endif
-}
diff --git a/debug-tools/host_manager_11ad/UdpNetworkInterface.h b/debug-tools/host_manager_11ad/UdpNetworkInterface.h
deleted file mode 100644
index 936fd17..0000000
--- a/debug-tools/host_manager_11ad/UdpNetworkInterface.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _UDPNETWORKINTERFACE_H_
-#define _UDPNETWORKINTERFACE_H_
-
-#include <string>
-
-class UdpNetworkInterface
-{
-public:
-
-    UdpNetworkInterface(std::string broadcastIp, int portIn, int portOut);
-
-    ~UdpNetworkInterface() { Close(); }
-
-    int Send(std::string message);
-
-    const char* Receive(int len);
-
-    void Close();
-
-private:
-
-    int m_portIn;
-    int m_portOut;
-    int m_socket;
-    std::string m_broadcastIp;
-};
-
-#endif
\ No newline at end of file
diff --git a/debug-tools/host_manager_11ad/UdpServer.cpp b/debug-tools/host_manager_11ad/UdpServer.cpp
deleted file mode 100644
index 858f906..0000000
--- a/debug-tools/host_manager_11ad/UdpServer.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "UdpServer.h"
-#include "CommandsHandler.h"
-#include "Host.h"
-
-const int UdpServer::m_maxMessageLength = 1024;
-
-UdpServer::UdpServer(unsigned int udpPortIn, unsigned int udpPortOut, Host& host) :
-    m_udpPortIn(udpPortIn),
-    m_udpPortOut(udpPortOut),
-    m_broadcastIp(host.GetHostInfo().GetIps().m_broadcastIp),
-    m_CommandHandler(stUdp, host)
-{
-    try
-    {
-        m_pSocket.reset(new UdpNetworkInterface(m_broadcastIp, udpPortIn, udpPortOut));
-    }
-    catch (string error)
-    {
-        LOG_WARNING << "Failed to open UDP socket: " << error << endl;
-        m_pSocket.reset();
-    }
-}
-
-void UdpServer::StartServer()
-{
-    if (FileSystemOsAbstraction::LOCAL_HOST_IP == m_broadcastIp)
-    {
-        LOG_WARNING << "Can't start UDP server due to invalid host's IP/ broadcast IP";
-        return;
-    }
-
-    if (m_pSocket)
-    {
-        LOG_DEBUG << "Start UDP server on local port " << m_udpPortIn << std::endl;
-        LOG_DEBUG << "Broadcast messages are sent to port " << m_udpPortOut << std::endl;
-        BlockingReceive();
-    }
-}
-
-void UdpServer::Stop()
-{
-    LOG_INFO << "Stopping the UDP server" << endl;
-    m_pSocket->Close();
-    m_pSocket.reset();
-    m_running = false;
-}
-
-void UdpServer::BlockingReceive()
-{
-    do
-    {
-        const char* incomingMessage = m_pSocket->Receive(m_maxMessageLength);
-        if (nullptr == incomingMessage)
-        {
-            LOG_ERROR << "Got NULL instead of incoming UDP message" << endl;
-            continue;
-        }
-
-        LOG_VERBOSE << "Got Udp message: " << incomingMessage << endl;
-        ResponseMessage referencedResponse;
-        m_CommandHandler.ExecuteCommand(incomingMessage, referencedResponse);
-        if (referencedResponse.length > 0)
-        {
-            LOG_VERBOSE << "Send broadcast message" << endl;
-            SendBroadcastMessage(referencedResponse);
-        }
-
-    } while (m_running);
-}
-
-void UdpServer::SendBroadcastMessage(ResponseMessage responseMessage)
-{
-    m_pSocket->Send(responseMessage.message);
-}
diff --git a/debug-tools/host_manager_11ad/UdpServer.h b/debug-tools/host_manager_11ad/UdpServer.h
deleted file mode 100644
index 7ecd3bf..0000000
--- a/debug-tools/host_manager_11ad/UdpServer.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _UDPSERVER_H_
-#define _UDPSERVER_H_
-
-#include <string>
-#include <thread>
-#include "HostDefinitions.h"
-#include "CommandsHandler.h"
-#include "UdpNetworkInterface.h"
-
-class Host;
-
-class UdpServer
-{
-public:
-    /*
-    UdpServer
-    Creates a UDP socket which receives messages from the network and can response using a broadcast option
-    */
-    UdpServer(unsigned int udpPortIn, unsigned int udpPortOut, Host& host);
-
-    /*
-    StartServer
-    Starts to receive messages, Handles the message and continue to the receive
-    @param: none
-    @return: none
-    */
-    void StartServer();
-
-    /*
-    StopServer
-    Stops receiving messages
-    @param: none
-    @return: none
-    */
-    void Stop();
-
-private:
-    /*
-    BlockingReceive
-    Waits for a UDP message and handles it
-    Assumption: m_pSocket is valid
-    @param: none
-    @return: none
-    */
-    void BlockingReceive();
-
-    /*
-    SendBroadcastMessage
-    Sends a message to all hosts in the subnet
-    Assumption: m_pSocket is valid
-    @param: responseMessage - the message to send
-    @return: none
-    */
-    void SendBroadcastMessage(ResponseMessage responseMessage);
-
-    unsigned int m_udpPortIn; // the local host port
-    unsigned int m_udpPortOut; // the remote host port
-    string m_broadcastIp;
-    unique_ptr<UdpNetworkInterface> m_pSocket;
-    CommandsHandler m_CommandHandler;
-    static const int m_maxMessageLength;
-    bool m_running;
-};
-
-
-#endif // !_UDPSERVER_H_
\ No newline at end of file
diff --git a/debug-tools/host_manager_11ad/Utils.cpp b/debug-tools/host_manager_11ad/Utils.cpp
deleted file mode 100644
index a866a2f..0000000
--- a/debug-tools/host_manager_11ad/Utils.cpp
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "Utils.h"
-#include <sstream>
-#include <iomanip>
-#include <stdexcept>
-#include <cstdlib>
-#include <algorithm>
-#include <fstream>
-
-#if _WINDOWS
-#define localtime_r(_Time, _Tm) localtime_s(_Tm, _Time)
-#endif
-
-using namespace std;
-
-const unsigned int Utils::REGISTER_DEFAULT_VALUE = 0xDEADDEAD;
-
-const string Utils::PCI = "PCI";
-const string Utils::JTAG = "JTAG";
-const string Utils::SERIAL = "SERIAL";
-const string Utils::DUMMY = "DUMMY";
-
-// *************************************************************************************************
-vector<string> Utils::Split(string str, char delimiter)
-{
-    vector<string> splitStr;
-    size_t nextSpacePosition = str.find_first_of(delimiter);
-    while (string::npos != nextSpacePosition)
-    {
-        splitStr.push_back(str.substr(0, nextSpacePosition));
-        str = str.substr(nextSpacePosition + 1);
-        nextSpacePosition = str.find_first_of(delimiter);
-    }
-
-    if ("" != str)
-    {
-        splitStr.push_back(str);
-    }
-    return splitStr;
-    /*
-      vector<string> splitMessage;
-      stringstream sstream(message);
-      string word;
-      while (getline(sstream, word, delim))
-      {
-      if (word.empty())
-      { //don't push whitespace
-      continue;
-      }
-      splitMessage.push_back(word);
-      }
-      return splitMessage;
-    */
-}
-
-// *************************************************************************************************
-Utils::TimeStamp Utils::GetCurrentLocalTime()
-{
-    TimeStamp ts;
-    chrono::system_clock::time_point nowTimePoint = chrono::system_clock::now(); // get current time
-
-    // convert epoch time to struct with year, month, day, hour, minute, second fields
-    time_t now = chrono::system_clock::to_time_t(nowTimePoint);
-    localtime_r(&now, &ts.m_localTime);
-
-    // get milliseconds field
-    const chrono::duration<double> tse = nowTimePoint.time_since_epoch();
-    ts.m_milliseconds = chrono::duration_cast<std::chrono::milliseconds>(tse).count() % 1000;
-    return ts;
-}
-
-
-// *************************************************************************************************
-string Utils::GetCurrentLocalTimeString()
-{
-
-    TimeStamp ts = Utils::GetCurrentLocalTime();
-
-    ostringstream currentTime;
-    currentTime << (1900 + ts.m_localTime.tm_year) << '-'
-                << std::setfill('0') << std::setw(2) << (ts.m_localTime.tm_mon + 1) << '-'
-                << std::setfill('0') << std::setw(2) << ts.m_localTime.tm_mday << ' '
-                << std::setfill('0') << std::setw(2) << ts.m_localTime.tm_hour << ':'
-                << std::setfill('0') << std::setw(2) << ts.m_localTime.tm_min << ':'
-                << std::setfill('0') << std::setw(2) << ts.m_localTime.tm_sec << '.'
-                << std::setfill('0') << std::setw(3) << ts.m_milliseconds;
-
-    string currentTimeStr(currentTime.str());
-    return currentTimeStr;
-}
-
-// *************************************************************************************************
-string Utils::GetCurrentLocalTimeXml()
-{
-    TimeStamp ts = Utils::GetCurrentLocalTime();
-
-    ostringstream timeStampBuilder;
-
-    timeStampBuilder << "<Log_Content>"
-        << "<Sample_Time>"
-        << "<Hour>" << ts.m_localTime.tm_hour << "</Hour>"
-        << "<Minute>" << ts.m_localTime.tm_min << "</Minute>"
-        << "<Second>" << ts.m_localTime.tm_sec << "</Second>"
-        << "<Milliseconds>" << ts.m_milliseconds << "</Milliseconds>"
-        << "<Day>" << ts.m_localTime.tm_mday << "</Day>"
-        << "<Month>" << ts.m_localTime.tm_mon + 1 << "</Month>"
-        << "<Year>" << ts.m_localTime.tm_year + 1900 << "</Year>"
-        << "</Sample_Time>";
-
-    return timeStampBuilder.str();
-}
-
-// *************************************************************************************************
-bool Utils::ConvertHexStringToDword(string str, DWORD& word)
-{
-    if (str.find_first_of("0x") != 0) //The parameter is a hex string (assuming that a string starting with 0x must be hex)
-    {
-        return false;
-    }
-    istringstream s(str);
-    s >> hex >> word;
-    return true;
-}
-
-// *************************************************************************************************
-bool Utils::ConvertHexStringToDwordVector(string str, char delimiter, vector<DWORD>& values)
-{
-    vector<string> strValues = Utils::Split(str, delimiter);
-    values.reserve(strValues.size());
-    for (auto& strValue : strValues)
-    {
-        DWORD word;
-        if (Utils::ConvertHexStringToDword(strValue, word))
-        {
-            values.push_back(word);
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    return true;
-}
-
-// *************************************************************************************************
-bool Utils::ConvertDecimalStringToUnsignedInt(string str, unsigned int& ui)
-{
-    unsigned long l;
-    try
-    {
-        l = strtoul(str.c_str(), nullptr, 10); // 10 for decimal base
-    }
-    catch (...)
-    {
-        return false;
-    }
-
-    ui = l;
-    return true;
-}
-
-
-bool Utils::ConvertStringToBool(string str, bool& boolVal)
-{
-    string lowerStr = str;
-    std::transform(lowerStr.begin(), lowerStr.end(), lowerStr.begin(), ::tolower);
-
-    if (lowerStr.compare("false") == 0)
-    {
-        boolVal = false;
-        return true;
-    }
-    else if (lowerStr.compare("true") == 0)
-    {
-        boolVal = true;
-        return true;
-    }
-    else
-    {
-        return false;
-    }
-}
-
-
-
diff --git a/debug-tools/host_manager_11ad/Utils.h b/debug-tools/host_manager_11ad/Utils.h
deleted file mode 100644
index cc562aa..0000000
--- a/debug-tools/host_manager_11ad/Utils.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _UTILS_H_
-#define _UTILS_H_
-
-#include <vector>
-#include <string>
-#include <chrono>
-
-#ifdef _WINDOWS
-typedef unsigned long DWORD;
-#else
-typedef uint32_t    DWORD;
-#endif
-
-using namespace std;
-
-class Utils
-{
-public:
-
-    static vector<string> Split(string str, char delimiter);
-
-    static string GetCurrentLocalTimeString();
-
-    static string GetCurrentLocalTimeXml();
-
-    static bool ConvertHexStringToDword(string str, DWORD& word);
-
-    static bool ConvertHexStringToDwordVector(string str, char delimiter, vector<DWORD>& values);
-
-    static bool ConvertDecimalStringToUnsignedInt(string str, unsigned int& ui);
-
-    static bool ConvertStringToBool(string str, bool& boolVal);
-
-    const static unsigned int REGISTER_DEFAULT_VALUE;
-
-    const static string PCI;
-    const static string JTAG;
-    const static string SERIAL;
-    const static string DUMMY;
-
-private:
-    struct TimeStamp
-    {
-        tm m_localTime; // year, month, day, hour, minutes, seconds
-        chrono::seconds::rep m_milliseconds;
-    };
-
-    static TimeStamp GetCurrentLocalTime();
-};
-
-#endif // !_UTILS_H_
-
diff --git a/debug-tools/host_manager_11ad/VersionInfo.h b/debug-tools/host_manager_11ad/VersionInfo.h
deleted file mode 100644
index ac3a68d..0000000
--- a/debug-tools/host_manager_11ad/VersionInfo.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*     * Redistributions of source code must retain the above copyright
-*       notice, this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above
-*       copyright notice, this list of conditions and the following
-*       disclaimer in the documentation and/or other materials provided
-*       with the distribution.
-*     * Neither the name of The Linux Foundation nor the names of its
-*       contributors may be used to endorse or promote products derived
-*       from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _VERSION_INFO_H_
-#define _VERSION_INFO_H_
-
-#define STR_HELPER(x) #x
-#define STR(x) STR_HELPER(x)
-
-// The only place for version definition/editing
-#define TOOL_VERSION_MAJOR 1
-#define TOOL_VERSION_MINOR 1
-#define TOOL_VERSION_MAINT 0
-#define TOOL_VERSION_INTERM 6
-
-#define TOOL_VERSION            TOOL_VERSION_MAJOR,TOOL_VERSION_MINOR,TOOL_VERSION_MAINT,TOOL_VERSION_INTERM
-#define TOOL_VERSION_STR        STR(TOOL_VERSION_MAJOR.TOOL_VERSION_MINOR.TOOL_VERSION_MAINT.TOOL_VERSION_INTERM)
-
-#define TOOL_FILE_DESCRIPTION   "Host Manager 11ad"
-#define TOOL_INTERNAL_NAME      "Host Manager 11ad"
-#define TOOL_ORIGINAL_FILE_NAME "host_manager_11ad.exe"
-#define TOOL_PRODUCT_NAME       "Host Manager 11ad"
-
-#endif // _VERSION_INFO_H_
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/AccessLayerAPI.cpp b/debug-tools/host_manager_11ad/access_layer_11ad/AccessLayerAPI.cpp
deleted file mode 100644
index 8b33dd4..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/AccessLayerAPI.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sstream>
-#include "AccessLayerAPI.h"
-#include "DriverFactory.h"
-#include "Utils.h"
-
-using namespace std;
-
-set<string> AccessLayer::GetDrivers()
-{
-    set<string> enumeratedDevices;
-
-    // Enumerate
-
-#ifdef _WINDOWS
-    set<string> pciDevices = WindowsDriverAPI::Enumerate();
-    set<string> jtagDevices = JTagDriver::Enumerate();
-    enumeratedDevices.insert(jtagDevices.begin(), jtagDevices.end());
-    //set<string> serialDevices = SerialDevice::Enumerate();
-    //enumeratedDevices.insert(serialDevices.begin(), serialDevices.end());
-#elif __OS3__
-    set<string> pciDevices = OS3DriverAPI::Enumerate();
-#else
-    set<string> pciDevices = UnixPciDriver::Enumerate();
-#endif
-
-    enumeratedDevices.insert(pciDevices.begin(), pciDevices.end());
-#ifdef _UseTestDevice
-    set<string> testDevices = TestDevice::Enumerate();
-    enumeratedDevices.insert(testDevices.begin(), testDevices.end());
-#endif // _UseTestDevice
-
-    return enumeratedDevices;
-}
-
-unique_ptr<DriverAPI> AccessLayer::OpenDriver(string deviceName)
-{
-    vector<string> tokens = Utils::Split(deviceName, DEVICE_NAME_DELIMITER);
-
-    // Device name consists of exactly 3 elements:
-    // 1. Baseband Type (SPARROW, TALYN...)
-    // 2. Transport Type (PCI, JTAG, Serial...)
-    // 3. Interface name (wMp, wPci, wlan0, wigig0...)
-    if (tokens.size() != 2)
-    {
-        // LOG_MESSAGE_ERROR
-        return NULL;
-    }
-
-    // Transport type
-    unique_ptr<DriverAPI> pDevice;
-
-    if (Utils::PCI == tokens[0])
-    {
-        pDevice = DriverFactory::GetDriver(PCI, tokens[1]);
-    }
-
-#ifdef _WINDOWS
-    if (Utils::JTAG == tokens[0])
-    {
-        pDevice = DriverFactory::GetDriver(JTAG, tokens[1]);
-    }
-
-    if (Utils::SERIAL == tokens[0])
-    {
-        pDevice = DriverFactory::GetDriver(SERIAL, tokens[1]);
-    }
-#endif
-
-#ifdef _UseDummyDevice
-    if (Utils::DUMMY == tokens[0])
-    {
-        pDevice = DriverFactory::GetDriver(DUMMY, tokens[1]);
-    }
-#endif // _UseOnlyTestDevice
-
-    if (NULL != pDevice.get())
-    {
-        if (!pDevice->Open())
-        {
-            LOG_ERROR << ": Failed to open interface" << endl;
-        }
-    }
-    return pDevice;
-}
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/AccessLayerAPI.h b/debug-tools/host_manager_11ad/access_layer_11ad/AccessLayerAPI.h
deleted file mode 100644
index fdfba22..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/AccessLayerAPI.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#ifndef _11AD_ACCESS_LAYER_H_
-#define _11AD_ACCESS_LAYER_H_
-
-
-#include <memory>
-#include <set>
-#include "DriverAPI.h"
-
-class AccessLayer
-{
-public:
-    static set<string> GetDrivers();
-    static unique_ptr<DriverAPI> OpenDriver(string deviceName);
-};
-
-#endif // _11AD_ACCESS_LAYER_H_
\ No newline at end of file
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/Definitions.h b/debug-tools/host_manager_11ad/access_layer_11ad/Definitions.h
deleted file mode 100644
index c324ec7..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/Definitions.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _11AD_ACCESS_LAYER_DEFINITIONS_H_
-#define _11AD_ACCESS_LAYER_DEFINITIONS_H_
-
-#include "../HostManagerDefinitions.h"
-
-#define BAUD_RATE_REGISTER 0x880050
-
-enum DeviceType
-{
-    PCI,
-    JTAG,
-    SERIAL,
-    DUMMY
-};
-
-#define EMPTY_ARRAY_SIZE
-
-#define DEVICE_NAME_DELIMITER '!'
-
-#endif //_11AD_ACCESS_LAYER_DEFINITIONS_H_
\ No newline at end of file
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/DriverAPI.h b/debug-tools/host_manager_11ad/access_layer_11ad/DriverAPI.h
deleted file mode 100644
index 29e536d..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/DriverAPI.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _11AD_DRIVER_API_H_
-#define _11AD_DRIVER_API_H_
-
-#include <string>
-#include <set>
-#include <vector>
-#include <sstream>
-#include <unordered_map>
-
-#include "OperatingSystemConstants.h"
-#include "Definitions.h"
-#include "DebugLogger.h"
-#include "Utils.h"
-
-using namespace std;
-
-class DriverAPI
-{
-public:
-    DriverAPI(string interfaceName): m_interfaceName(interfaceName)
-    {
-    }
-
-    virtual ~DriverAPI() {}
-
-    // Base access functions (to be implemented by specific device)
-    virtual bool Read(DWORD address, DWORD& value) { return false;  }
-    virtual bool ReadBlock(DWORD addr, DWORD blockSize, vector<DWORD>& values) { return false; }
-    virtual bool ReadBlock(DWORD addr, DWORD blockSize, char *arrBlock) { return false;  } // blockSize in bytes
-    virtual bool Write(DWORD address, DWORD value) { return false; }
-    virtual bool WriteBlock(DWORD addr, vector<DWORD> values) { return false; };
-    virtual bool WriteBlock(DWORD address, DWORD blockSize, const char *valuesToWrite) { return false; }
-
-    // PMC functions
-    virtual bool AllocPmc(unsigned descSize, unsigned descNum, std::string& outMessage) { return false; }
-    virtual bool DeallocPmc(std::string& outMessage) { return false; }
-    virtual bool CreatePmcFile(unsigned refNumber, std::string& outMessage) { return false; }
-    virtual bool FindPmcFile(unsigned refNumber, std::string& outMessage) { return false; }
-
-    virtual bool IsOpen(void) { return false; }
-    virtual bool Open() { return false;  }
-    virtual bool ReOpen() { return false; };
-    virtual bool DriverControl(uint32_t Id,
-                               const void *inBuf, uint32_t inBufSize,
-                               void *outBuf, uint32_t outBufSize, DWORD* pLastError = nullptr) { return false; }
-    virtual void Close() {}
-
-    virtual int GetDriverMode(int &currentState) { return false;  }
-    virtual bool SetDriverMode(int newState, int &oldState) { return false;  }
-
-    virtual bool RegisterDriverControlEvents() { return false; }
-
-    virtual void Reset() {}; // interface reset
-
-    const string& GetInterfaceName() const
-    {
-        return m_interfaceName;
-    }
-
-    bool IsValid()
-    {
-        DWORD value;
-        if (!Read(BAUD_RATE_REGISTER, value)) return false;
-        return IsValidInternal();
-    }
-
-protected:
-
-    const string m_interfaceName;
-
-    // Enumeration for commands sent through DriverControl (translating from it to the appropriate command per OS)
-    // Note: It is a contract with DmTools and the Driver, order is important!
-    enum DRIVER_COMMAND
-    {
-        DRIVER_CMD_FW_WMI,
-        DRIVER_CMD_GENERIC_COMMAND,
-        DRIVER_GET_DRIVER_STATISTICS
-    };
-
-    std::unordered_map<DRIVER_COMMAND, uint32_t, hash<int>> m_driverCommandToIoctlMap;
-
-    virtual void InsertDriverCommandsToMap() {}
-
-private:
-
-    virtual bool IsValidInternal() { return true; }
-};
-
-
-#endif //_11AD_DRIVER_API_H_
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/DriverFactory.h b/debug-tools/host_manager_11ad/access_layer_11ad/DriverFactory.h
deleted file mode 100644
index ea84282..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/DriverFactory.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef _DRIVER_FACTORY_
-#define _DRIVER_FACTORY_
-
-#pragma once
-
-#include <memory>
-
-#include "Definitions.h"
-#include "DriverAPI.h"
-#include "DummyDriver.h"
-#ifdef _WINDOWS
-#include "WindowsPciDriver.h"
-#include "JTagDriver.h"
-#include "SerialDriver.h"
-#elif __OS3__
-#include "OS3DriverAPI.h"
-#else
-#include "UnixPciDriver.h"
-#endif // _WINDOWS
-
-class DriverFactory
-{
-public:
-
-    static unique_ptr<DriverAPI> GetDriver(DeviceType deviceType, string interfaceName)
-    {
-        switch (deviceType)
-        {
-#ifdef _WINDOWS
-        case JTAG:
-            return unique_ptr<JTagDriver>(new JTagDriver(interfaceName));
-        case SERIAL:
-            return unique_ptr<SerialDriver>(new SerialDriver(interfaceName));
-#endif // WINDOWS
-        case DUMMY:
-            return unique_ptr<DummyDriver>(new DummyDriver(interfaceName));
-        case PCI:
-#ifdef _WINDOWS
-            return unique_ptr<WindowsDriverAPI>(new WindowsDriverAPI(interfaceName));
-#elif __OS3__
-            return unique_ptr<OS3DriverAPI>(new OS3DriverAPI(interfaceName));
-#else
-            return unique_ptr<UnixPciDriver>(new UnixPciDriver(interfaceName));
-#endif // WINDOWS
-        default:
-            LOG_ERROR << "Got invalid device type. Return an empty driver" << endl;
-            return unique_ptr<DriverAPI>(new DriverAPI(interfaceName));
-        }
-    }
-};
-
-#endif // !_DRIVER_FACTORY_
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/DummyDriver.cpp b/debug-tools/host_manager_11ad/access_layer_11ad/DummyDriver.cpp
deleted file mode 100644
index 71facb0..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/DummyDriver.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sstream>
-#include "DummyDriver.h"
-#include "Utils.h"
-
-//////////////////////////////////////////////////////////////////////////
-// Test Device interface
-
-DummyDriver::DummyDriver(string interfaceName) : DriverAPI(interfaceName)
-{
-    //LOG_MESSAGE_INFO(_T("Create test device access for: %s"), interfaceName.c_str());
-    m_registersAddressToValue.insert(make_pair(0x880050, 0x12345678));
-
-    unsigned baseAddress = 0x880100;
-    unsigned numOfAddresses = 40;
-    unsigned numOfAddressesInRegister = 4;
-    unsigned value = 0x0;
-    for (unsigned i = 0; i < numOfAddresses * numOfAddressesInRegister; i += numOfAddressesInRegister)
-    {
-        m_registersAddressToValue.insert(make_pair(baseAddress + i, value++));
-    }
-}
-
-DummyDriver::~DummyDriver()
-{
-    Close();
-}
-
-// Virtual access functions for device
-bool DummyDriver::Read(DWORD address, DWORD& value)
-{
-    auto registerElement = m_registersAddressToValue.find(address);
-    if (registerElement != m_registersAddressToValue.end())
-    {
-        value = registerElement->second;
-        return true;
-
-    }
-    value = Utils::REGISTER_DEFAULT_VALUE;
-    return false;
-}
-
-bool DummyDriver::ReadBlock(DWORD address, DWORD blockSize, vector<DWORD>& values)
-{
-    auto registerElement = m_registersAddressToValue.find(address);
-    if (registerElement != m_registersAddressToValue.end())
-    {
-        for (DWORD v = 0x0; v < blockSize; ++v)
-        {
-            values.push_back(registerElement->second + v);
-        }
-        return true;
-    }
-    return false;
-}
-
-bool DummyDriver::Write(DWORD address, DWORD value)
-{
-    auto registerElement = m_registersAddressToValue.find(address);
-    if (registerElement != m_registersAddressToValue.end())
-    {
-        registerElement->second = value;
-        return true;
-    }
-    return false;
-}
-
-bool DummyDriver::WriteBlock(DWORD address, vector<DWORD> values)
-{
-    auto registerElement = m_registersAddressToValue.find(address);
-    if (registerElement != m_registersAddressToValue.end())
-    {
-        unsigned i = 0;
-        for (auto v = values.begin(); v != values.end(); ++v)
-        {
-            m_registersAddressToValue[address + i] = *v;
-            ++i;
-        }
-        return true;
-    }
-    return false;
-}
-
-bool DummyDriver::Open()
-{
-    return true;
-}
-
-void DummyDriver::Close()
-{
-    return;
-}
-
-void DummyDriver::InterfaceReset()
-{
-    return;
-}
-
-bool DummyDriver::SwReset()
-{
-    return true;
-}
-
-set<string> DummyDriver::Enumerate()
-{
-    stringstream deviceNameDelimiter;
-    deviceNameDelimiter << DEVICE_NAME_DELIMITER;
-    set<string> discoveredDevices;
-
-    // add first device
-    string deviceName = std::string("TEST") + deviceNameDelimiter.str() + "wTest0";
-    discoveredDevices.insert(deviceName);
-
-    // add second device
-    deviceName = std::string("TEST") + deviceNameDelimiter.str() + "wTest1";
-    discoveredDevices.insert(deviceName);
-
-    return discoveredDevices;
-}
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/DummyDriver.h b/debug-tools/host_manager_11ad/access_layer_11ad/DummyDriver.h
deleted file mode 100644
index 57597cc..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/DummyDriver.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _11AD_DUMMY_DRIVER_H_
-#define _11AD_DUMMY_DRIVER_H_
-
-#include <map>
-#include "DriverAPI.h"
-
-using namespace std;
-
-class DummyDriver : public DriverAPI
-{
-public:
-    DummyDriver(string interfaceName);
-    ~DummyDriver();
-
-    // Device Management
-    bool Open();
-    void Close();
-
-    // Virtual access functions for device
-    bool Read(DWORD address, DWORD& value);
-    bool ReadBlock(DWORD address, DWORD blockSize, vector<DWORD>& values);
-    bool Write(DWORD address, DWORD value);
-    bool WriteBlock(DWORD address, vector<DWORD> values);
-
-    virtual void InterfaceReset();
-    bool SwReset();
-
-    // PMC functions
-    virtual bool AllocPmc(unsigned descSize, unsigned descNum, std::string& outMessage) { return false; };
-    virtual bool DeallocPmc(std::string& outMessage) { return false; };
-    virtual bool CreatePmcFile(unsigned refNumber, std::string& outMessage) { return false; };
-    virtual bool FindPmcFile(unsigned refNumber, std::string& outMessage) { return false; };
-
-    virtual bool ReOpen() { return false; };
-    virtual bool DriverControl(uint32_t Id, const void *inBuf, uint32_t inBufSize, void *outBuf, uint32_t outBufSize, DWORD* pLastError = nullptr) { return false; };
-
-    virtual int GetDriverMode(int &currentState) { return 0; };
-    virtual bool SetDriverMode(int newState, int &oldState) { return false; };
-
-    virtual void Reset() { return; };
-
-    static set<string> Enumerate();
-
-private:
-    map<DWORD, DWORD> m_registersAddressToValue;
-};
-#endif //_11AD_DUMMY_DRIVER_H_
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/OperatingSystemConstants.h b/debug-tools/host_manager_11ad/access_layer_11ad/OperatingSystemConstants.h
deleted file mode 100644
index 3b866b1..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/OperatingSystemConstants.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#ifdef _WINDOWS
-
-#include <windows.h>
-#include <atlbase.h>
-#include <atlstr.h>
-#include <assert.h>
-
-typedef unsigned __int8 u_int8_t;
-typedef unsigned __int16 u_int16_t;
-typedef unsigned __int32 u_int32_t;
-typedef unsigned __int64 u_int64_t;
-#if (defined(_MSC_VER) && (_MSC_VER < 1900))
-//typedef __int8 int8_t;
-#endif
-typedef __int16 int16_t;
-typedef __int32 int32_t;
-typedef __int64 int64_t;
-typedef unsigned __int8 uint8_t;
-typedef unsigned __int16 uint16_t;
-typedef unsigned __int32 uint32_t;
-typedef unsigned __int64 uint64_t;
-
-#define WLCT_OS_ERROR_SUCCESS              ERROR_SUCCESS
-#define WLCT_OS_ERROR_NOT_SUPPORTED        ERROR_NOT_SUPPORTED
-#define WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED ERROR_CALL_NOT_IMPLEMENTED
-#define WLCT_OS_ERROR_GEN_FAILURE          ERROR_GEN_FAILURE
-#define WLCT_OS_ERROR_NOT_ENOUGH_MEMORY    ERROR_NOT_ENOUGH_MEMORY
-#define WLCT_OS_ERROR_NO_SUCH_ENTRY        ERROR_FILE_NOT_FOUND
-#define WLCT_OS_ERROR_OPEN_FAILED          ERROR_OPEN_FAILED
-
-#define WLCT_ASSERT assert
-
-#define __TRY __try
-
-#define __EXCEPT __except
-
-#define sleep_ms Sleep
-
-#define WlctGetLastError GetLastError
-
-#else
-
-#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#include <string>
-
-#define WLCT_ASSERT assert
-
-#define __INLINE   __inline
-
-typedef uint8_t         BYTE;
-typedef uint16_t        WORD;
-typedef uint32_t        DWORD;
-
-typedef unsigned char   UCHAR;
-typedef unsigned int    UINT;
-typedef char            CHAR;
-typedef long            LONG;
-typedef unsigned short  USHORT;
-typedef unsigned long   ULONG;
-typedef ULONG*          ULONG_PTR;
-
-typedef char            TCHAR;
-
-typedef uint8_t         u_int8_t;
-typedef uint16_t        u_int16_t;
-typedef uint32_t        u_int32_t;
-typedef uint64_t        u_int64_t;
-
-typedef const TCHAR     *LPCTSTR;
-typedef TCHAR           *LPTSTR;
-typedef CHAR            *LPSTR;
-typedef const CHAR      *LPCSTR;
-
-typedef DWORD           HANDLE;
-
-typedef int             BOOL;
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#include <errno.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <sys/stat.h>
-#include <strings.h>
-
-typedef int wlct_os_err_t;
-
-#define WLCT_OS_ERROR_SUCCESS              0
-#define WLCT_OS_ERROR_NOT_SUPPORTED        -ENOTSUP
-#define WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED -ENOSYS
-#define WLCT_OS_ERROR_GEN_FAILURE          -EINVAL
-#define WLCT_OS_ERROR_NOT_ENOUGH_MEMORY    -ENOMEM
-#define WLCT_OS_ERROR_NO_SUCH_ENTRY        -ENOENT
-#define WLCT_OS_ERROR_OPEN_FAILED          -EBADF
-
-#define _T(x) (x)
-
-#define __TRY if (1)
-#define __EXCEPT(ignore) else if (0)
-
-#define WLCT_MSEC_IN_SEC 1000
-
-#define sleep_ms(msec) usleep(msec * WLCT_MSEC_IN_SEC)
-
-#define USES_CONVERSION
-
-#define T2A(x) (x)
-
-#define _tcscpy_s(x, y, z) snprintf((x), (y), "%s", (z))
-#define _tcslen            strlen
-#define _stprintf_s        snprintf
-#define _snprintf          snprintf
-//#define sprintf_s          sprintf
-//#define _stprintf          sprintf
-#define sscanf_s           sscanf
-#define _tcstok_s          strtok_r
-#define _tcsstr            strstr
-#define _tcsicmp           strcasecmp
-#define _vsntprintf        vsnprintf
-#define _tfopen            fopen
-
-#define WlctGetLastError() errno
-
-#endif
-
-#define WLCT_UNREFERENCED_PARAM(x)  ((x) = (x))
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcCfg.cpp b/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcCfg.cpp
deleted file mode 100644
index 8123d18..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcCfg.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "PmcCfg.h"
-#include "DebugLogger.h"
-
-#include <string.h>
-#include <fstream>
-#include <errno.h>
-
-// *************************************************************************************************
-
-PmcCfg::PmcCfg(const char* szDebugFsPath)
-{
-    if (!szDebugFsPath)
-    {
-        LOG_ERROR << "No Debug FS path is provided" << std::endl;
-        return;
-    }
-
-    std::stringstream pathBuilder;
-    pathBuilder << szDebugFsPath << '/' << "pmccfg";
-
-    m_PmcCfgFilePath = pathBuilder.str();
-
-    LOG_DEBUG << "PMC Configurator Created.\n"
-              << "    Debug FS Path: " << szDebugFsPath << '\n'
-              << "    pmccfg: " << m_PmcCfgFilePath
-              << std::endl;
-}
-
-// *************************************************************************************************
-
-OperationStatus PmcCfg::AllocateDmaDescriptors(size_t descSize, size_t descNum)
-{
-    LOG_DEBUG << "Allocating PMC DMA Range. Descriptor Size: "
-              << descSize << " Number of descriptors: " << descNum << std::endl;
-
-    // TODO - Verify parameters for a valid range
-
-    std::stringstream cmdBuilder;
-    cmdBuilder << "alloc " << descNum << " " << descSize;
-
-    OperationStatus st = WritePmcCommand(cmdBuilder.str().c_str());
-    LOG_DEBUG << "Writing PMC command status: " << st << std::endl;
-
-    if (!st.IsSuccess())
-    {
-        LOG_ERROR << "Failure writing PMC command: " << st << std::endl;
-        return st;
-    }
-
-    return GetLastOperationStatus();
-}
-
-// *************************************************************************************************
-
-OperationStatus PmcCfg::FreeDmaDescriptors()
-{
-    LOG_DEBUG << "De-Allocating PMC DMA Range" << std::endl;
-
-    OperationStatus st = WritePmcCommand("free");
-    LOG_DEBUG << "Querying driver for the last PMC command status: " << st << std::endl;
-
-    if (!st.IsSuccess())
-    {
-        LOG_ERROR << "Failure querying for the last PMC command status: " << st << std::endl;
-        return st;
-    }
-
-    return GetLastOperationStatus();
-}
-
-// *************************************************************************************************
-
-OperationStatus PmcCfg::WritePmcCommand(const char* szPmcCmd)
-{
-    LOG_DEBUG << "Writing PMC command to pmccfg: " << szPmcCmd << std::endl;
-
-    if(m_PmcCfgFilePath.empty())
-    {
-        return OperationStatus(false, "Cannot allocate PMC memory - No pmccfg file is detected");
-    }
-
-    std::ofstream debugFSFile;
-    debugFSFile.open(m_PmcCfgFilePath);
-
-    if (!debugFSFile.is_open())
-    {
-        std::stringstream msgBuilder;
-        msgBuilder << "Cannot open " << m_PmcCfgFilePath << ": " << strerror(errno);
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    debugFSFile << szPmcCmd;
-
-    // Verify the stream state after writing
-    if (!debugFSFile)
-    {
-        std::stringstream msgBuilder;
-        msgBuilder << "Cannot write to " << m_PmcCfgFilePath << ": " << strerror(errno);
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    // Unnecessary as closed on destruction, just for clarity.
-    debugFSFile.close();
-
-    return OperationStatus(true);
-}
-
-// *************************************************************************************************
-
-OperationStatus PmcCfg::GetLastOperationStatus()
-{
-    LOG_DEBUG << "Querying pmccfg for the last operation status" << std::endl;
-
-    if(m_PmcCfgFilePath.empty())
-    {
-        return OperationStatus(false, "Cannot query for last PMC operation status - No pmccfg file is detected");
-    }
-
-    std::ifstream debugFSFile;
-    debugFSFile.open(m_PmcCfgFilePath);
-
-    if(!debugFSFile.is_open())
-    {
-        std::stringstream msgBuilder;
-        msgBuilder << "Cannot open " << m_PmcCfgFilePath << ": " << strerror(errno);
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    // Query pmcconfig for the operation status
-    // The file first line is expected to be formatted as follows:
-    // Last command status: X
-    std::string firstLineToken1;
-    std::string firstLineToken2;
-    std::string firstLineToken3;
-    int lastOpStatus = -1;
-    debugFSFile >> firstLineToken1 >> firstLineToken2 >> firstLineToken3 >> lastOpStatus;
-
-    if (!debugFSFile)
-    {
-        // The failbit will also be set if the first line is not formatted as expected.
-        // In this case errno is zero and error message is 'Success'.
-        std::stringstream msgBuilder;
-        msgBuilder << "Cannot read from " << m_PmcCfgFilePath << ": " << strerror(errno);
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    LOG_DEBUG << "First line of pmccfg: "
-              << firstLineToken1 << ' '
-              << firstLineToken2 << ' '
-              << firstLineToken3 << ' '
-              << lastOpStatus
-              << std::endl;
-
-    if (0 != lastOpStatus)
-    {
-        // TODO: Parse erorr code to a meaningfull message
-        std::stringstream msgBuilder;
-        msgBuilder << "pmccfg operation failure reported by the driver: " << lastOpStatus;
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    return OperationStatus(true);
-}
-
-// *************************************************************************************************
-
-OperationStatus PmcCfg::FlashPmcData()
-{
-    // TBD
-    OperationStatus st(false, "Not Implemented");
-    return st;
-}
-
-// *************************************************************************************************
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcCfg.h b/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcCfg.h
deleted file mode 100644
index 853a3a2..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcCfg.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _WINDOWS
-#ifndef _PMC_CFG_H_
-
-#include "OperationStatus.h"
-
-#include <cstdlib>
-#include <string>
-#include <sstream>
-
-// *************************************************************************************************
-
-class PmcCfg
-{
-public:
-
-    explicit PmcCfg(const char* szDebugFsPath);
-
-    // DMA Managements
-    OperationStatus AllocateDmaDescriptors(size_t descSize, size_t descNum);
-    OperationStatus FreeDmaDescriptors();
-
-    // PMC Data Management
-    OperationStatus FlashPmcData();
-
-private:
-
-    OperationStatus WritePmcCommand(const char* szPmcCmd);
-    OperationStatus GetLastOperationStatus();
-
-    std::string m_PmcCfgFilePath;
-};
-
-
-#endif  // _PMC_CFG_H_
-#endif  // _WINDOWS
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcData.cpp b/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcData.cpp
deleted file mode 100644
index dd20dee..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcData.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "PmcData.h"
-#include "DebugLogger.h"
-#include "OperationStatus.h"
-
-#include <cstring>
-#include <cerrno>
-
-#include <iostream>
-#include <sstream>
-#include <fstream>
-#include <memory>
-
-#include <sys/stat.h>
-#include <sys/types.h>
-
-// *************************************************************************************************
-#ifdef __ANDROID__
-#define PMC_DATA_DIRECTORY "/data/pmc"
-#else
-#define PMC_DATA_DIRECTORY "/var/pmc"
-#endif
-
-// PMC directory and file name pattern should be managed separately as directory is required as a
-// separate variable.
-
-const char* const PmcDataFileLocator::s_pDirectory = PMC_DATA_DIRECTORY;
-const char* const PmcDataFileLocator::s_pFileNamePrefix = "pmc_data_";
-
-// *************************************************************************************************
-
-PmcDataFileLocator::PmcDataFileLocator(int fileId)
-    : m_FileId(fileId)
-{
-    std::stringstream ss;
-    ss << s_pDirectory << '/' << s_pFileNamePrefix << fileId;
-    m_FileName = ss.str();
-
-    LOG_DEBUG << "PMC file name #" << fileId << " generated: " << m_FileName << std::endl;
-}
-
-bool PmcDataFileLocator::FileExists() const
-{
-    struct stat st = {};
-    return (stat(m_FileName.c_str(), &st) != -1);
-}
-
-std::ostream& operator<<(std::ostream& os, const PmcDataFileLocator& pmcDataFileLocator)
-{
-    return os << "PMC file #" << pmcDataFileLocator.GetFileId()
-              << " (" << pmcDataFileLocator.GetFileName() << ')';
-}
-
-// *************************************************************************************************
-
-PmcDataFileWriter::PmcDataFileWriter(int fileId, const char* szDebugFsPath)
-    : m_PmcDataFileLocator(fileId)
-{
-    if (!szDebugFsPath)
-    {
-        LOG_ERROR << "No Debug FS path is provided" << std::endl;
-    }
-
-    std::stringstream pathBuilder;
-    pathBuilder << szDebugFsPath << '/' << "pmcdata";
-
-    m_SrcPmcDataPath = pathBuilder.str();
-
-    LOG_DEBUG << "PMC Data File Writer Created"
-              << "\n    Debug FS Path: " << szDebugFsPath
-              << "\n    Src PMC Data: " << m_SrcPmcDataPath
-              << "\n    Dst PMC Data: " << m_PmcDataFileLocator.GetFileName()
-              << std::endl;
-}
-
-// *************************************************************************************************
-
-OperationStatus PmcDataFileWriter::MeetWritePrerequisites() const
-{
-    // Forbid file overwrite
-
-    if (m_PmcDataFileLocator.FileExists())
-    {
-        std::stringstream msgBuilder;
-        msgBuilder << "Destination PMC data file already exists: " << m_PmcDataFileLocator.GetFileName();
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    // Create a PMC directory if does not exist
-
-    struct stat st = {};
-    if (stat(m_PmcDataFileLocator.GetDirectory(), &st) != -1)
-    {
-        LOG_DEBUG << "Found existing PMC data directory " << m_PmcDataFileLocator.GetDirectory() << std::endl;
-        return OperationStatus(true);
-    }
-
-    LOG_DEBUG << "Creating a PMC data directory: " << m_PmcDataFileLocator.GetDirectory() << std::endl;
-
-    int status = mkdir(m_PmcDataFileLocator.GetDirectory(), S_IRWXU);
-    if (0 != status)
-    {
-        std::stringstream msgBuilder;
-        msgBuilder << "Cannot create a PMC data directory "<< m_PmcDataFileLocator.GetDirectory()
-                   << " Error: " << strerror(errno);
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    return OperationStatus(true);
-}
-
-// *************************************************************************************************
-
-OperationStatus PmcDataFileWriter::WriteFile() const
-{
-    OperationStatus st = MeetWritePrerequisites();
-    if (!st.IsSuccess())
-    {
-        return st;
-    }
-
-    // Just to shorten expressions
-    const char* srcFileName = m_SrcPmcDataPath.c_str();
-    const char* dstFileName = m_PmcDataFileLocator.GetFileName();
-
-    std::ifstream srcPmcData(srcFileName, std::ifstream::binary);
-    if (!srcPmcData.is_open())
-    {
-        std::stringstream msgBuilder;
-        msgBuilder << "Cannot open source PMC data " << srcFileName << ": " << strerror(errno);
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    std::ofstream dstPmcData(dstFileName, std::ofstream::binary);
-    if (!dstPmcData.is_open())
-    {
-        std::stringstream msgBuilder;
-        msgBuilder << "Cannot open destination PMC data " << dstFileName << ": " << strerror(errno);
-        return OperationStatus(false, msgBuilder.str().c_str());
-    }
-
-    // Buffered copy through user space is required as pmcdata does not support offset functionality
-    // and therefore its size cannot be queried. As a result, sendfile() cannot be used.
-
-    static const size_t DATA_COPY_BUFFER_LEN = 1024 * 1024;
-    std::unique_ptr<char[]> spDataCopyBuffer(new char[DATA_COPY_BUFFER_LEN]);
-    if (!spDataCopyBuffer)
-    {
-        std::stringstream msgBuilder;
-        msgBuilder << "Cannot allocate data copy buffer of " << DATA_COPY_BUFFER_LEN << " B";
-        return OperationStatus(false, msgBuilder.str());
-    }
-
-    std::streamsize dataSize = 0;
-    while (srcPmcData && dstPmcData)
-    {
-        // Read a data chunk up to the buffer capacity
-        srcPmcData.read(spDataCopyBuffer.get(), DATA_COPY_BUFFER_LEN);
-        std::streamsize chunkSize = srcPmcData.gcount();
-        LOG_VERBOSE << "Read chunk from pmcdata: " << chunkSize << " B" << std::endl;
-
-        if (chunkSize > 0)
-        {
-            // Write the chunk
-            dstPmcData.write(spDataCopyBuffer.get(), chunkSize);
-            dataSize += chunkSize;
-            LOG_VERBOSE << "Written PMC data chunk: " << chunkSize << " Accumulated: " << dataSize << std::endl;
-
-            if (!dstPmcData)
-            {
-                std::stringstream msgBuilder;
-                msgBuilder << "Cannot write PMC data " << dstFileName << ": " << strerror(errno);
-                return OperationStatus(false, msgBuilder.str());
-            }
-        }
-
-        // Check stop conditions
-        if (srcPmcData.fail() && srcPmcData.eof())
-        {
-            // EoF reached
-            LOG_DEBUG << "Source PMC data: EoF reached" << std::endl;
-            LOG_DEBUG << "Written PMC data file: " << dstFileName << " Size: " << dataSize << " B" << std::endl;
-
-            std::stringstream msgBuilder;
-            msgBuilder << dataSize;
-            return OperationStatus(true, msgBuilder.str());
-        }
-
-        if (!srcPmcData)
-        {
-            // Any non-EoF failure or I/O error
-            std::stringstream msgBuilder;
-            msgBuilder << "Cannot read PMC data from " << srcFileName << ": " << strerror(errno);
-            return OperationStatus(false, msgBuilder.str());
-        }
-    }
-
-    // The function flow should not get here
-    return OperationStatus(false, "Unknown Error");
-}
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcData.h b/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcData.h
deleted file mode 100644
index 32b3684..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/PmcData.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _PMC_DATA_H_
-#define _PMC_DATA_H_
-
-#include "OperationStatus.h"
-
-#include <string>
-#include <iostream>
-
-// *************************************************************************************************
-
-// Locates a PMC data file path according to its ID.
-class PmcDataFileLocator
-{
-public:
-
-    explicit PmcDataFileLocator(int fileId);
-
-    int GetFileId() const { return m_FileId; }
-    const char* GetFileName() const { return m_FileName.c_str(); }
-    bool FileExists() const;
-
-    static const char* GetDirectory() { return s_pDirectory; }
-
-private:
-
-    static const char* const s_pDirectory;
-    static const char* const s_pFileNamePrefix;
-
-    const int m_FileId;        // File ID (expected to be unique)
-    std::string m_FileName;    // File Name Buffer
-
-};
-
-std::ostream& operator<<(std::ostream& os, const PmcDataFileLocator& pmcDataFileLocator);
-
-// *************************************************************************************************
-
-// Creates a PMC data file according to a provided ID.
-class PmcDataFileWriter
-{
-public:
-
-    PmcDataFileWriter(int fileId, const char* szDebugFsPath);
-    OperationStatus WriteFile() const;
-
-private:
-
-    OperationStatus MeetWritePrerequisites() const;
-
-    const PmcDataFileLocator m_PmcDataFileLocator;
-    std::string m_SrcPmcDataPath;
-
-};
-
-
-#endif    // _PMC_DATA_H_
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/UnixPciDriver.cpp b/debug-tools/host_manager_11ad/access_layer_11ad/Unix/UnixPciDriver.cpp
deleted file mode 100644
index cb964d7..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/UnixPciDriver.cpp
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _WINDOWS
-
-#include "DebugLogger.h"
-#include "UnixPciDriver.h"
-#include "PmcCfg.h"
-#include "PmcData.h"
-
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <fstream>
-
-#include <net/if.h> // for struct ifreq
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/ioctl.h> // for struct ifreq
-
-#include <sys/types.h> // for opendir
-#include <dirent.h> // for opendir
-
-static const string PCI_END_POINT_FOLDER = "/sys/module/wil6210/drivers/pci:wil6210/";
-static const char* INVALID = "Invalid";
-
-using namespace std;
-
-UnixPciDriver::~UnixPciDriver()
-{
-    Close();
-}
-
-// Base access functions (to be implemented by specific device)
-bool UnixPciDriver::Read(DWORD address, DWORD& value)
-{
-    IoctlIO io;
-
-    io.addr = address;
-    io.val = 0;
-    io.op = EP_OPERATION_READ;
-    if (!SendRWIoctl(io, m_fileDescriptor, m_interfaceName.c_str()))
-    {
-        return false;
-    }
-
-    value = io.val;
-
-    return true;
-}
-
-bool UnixPciDriver::ReadBlock(DWORD addr, DWORD blockSize, char *arrBlock)
-{
-    IoctlIOBlock io;
-    io.op = EP_OPERATION_READ;
-    io.addr = addr;
-    io.size = blockSize;
-    io.buf = arrBlock;
-
-    return SendRWBIoctl(io, m_fileDescriptor, m_interfaceName.c_str());
-}
-
-bool UnixPciDriver::ReadBlock(DWORD address, DWORD blockSize, vector<DWORD>& values)
-{
-    bool success = false;
-
-    DWORD* arrBlock = NULL;
-    try
-    {
-        arrBlock = new DWORD[blockSize];
-
-        // blockSize is in bytes, need to be multiplied by 4 for DWORDS
-        success = ReadBlock(address, blockSize * 4, (char*)arrBlock);
-
-        values = std::vector<DWORD>(arrBlock, arrBlock + (blockSize));
-
-        LOG_DEBUG << "Read: " << values.size() << " Values \n";
-    }
-    catch (...)
-    {
-        LOG_ERROR << "Exception when trying to read block\n";
-        delete[] arrBlock;
-        return false;
-    }
-
-    delete[] arrBlock;
-    return success;
-}
-
-bool UnixPciDriver::Write(DWORD address, DWORD value)
-{
-    IoctlIO io;
-
-    io.addr = address;
-    io.val = value;
-    io.op = EP_OPERATION_WRITE;
-
-    if (!SendRWIoctl(io, m_fileDescriptor, m_interfaceName.c_str()))
-    {
-        return false;
-    }
-
-    return true;
-}
-
-bool UnixPciDriver::WriteBlock(DWORD address, DWORD blockSize, const char *valuesToWrite)
-{
-    IoctlIOBlock io;
-    io.op = EP_OPERATION_WRITE;
-    io.addr = address;
-    io.size = blockSize;
-    io.buf = (void*)valuesToWrite;
-
-    return SendRWBIoctl(io, m_fileDescriptor, m_interfaceName.c_str());
-}
-
-bool UnixPciDriver::WriteBlock(DWORD addr, vector<DWORD> values)
-{
-    char* valuesToWrite = (char*)&values[0];
-    DWORD sizeToWrite = values.size() * 4;
-
-    return WriteBlock(addr, sizeToWrite, valuesToWrite);
-}
-
-string GetInterfaceNameFromEP(string pciEndPoint)
-{
-    // const definitions
-    static const char* CURRENT_DIRECTORY = ".";
-    static const char* PARENT_DIRECTORY = "..";
-
-    stringstream interfaceNameContaingFolder; // path of a folder which contains the interface name of the specific EP
-    interfaceNameContaingFolder << PCI_END_POINT_FOLDER << pciEndPoint << "/net";
-    DIR* dp = opendir(interfaceNameContaingFolder.str().c_str());
-    if (!dp)
-    {
-        return INVALID;
-    }
-
-    dirent* de; // read interface name. We assume there is only one folder, if not we take the first one
-    do
-    {
-        de = readdir(dp);
-    } while ((de != NULL) && ((strncmp(CURRENT_DIRECTORY, de->d_name, strlen(CURRENT_DIRECTORY)) == 0) || (strncmp(PARENT_DIRECTORY, de->d_name, strlen(PARENT_DIRECTORY)) == 0)));
-    if (NULL == de)
-    {
-        closedir(dp);
-        return INVALID;
-    }
-
-    closedir(dp);
-    return de->d_name;
-}
-
-set<string> GetNetworkInterfaceNames()
-{
-    set<string> networkInterfaces;
-
-    DIR* dp = opendir(PCI_END_POINT_FOLDER.c_str());
-    if (!dp)
-    {
-        LOG_VERBOSE << "Failed to open PCI EP directories" << endl;
-        return networkInterfaces;
-    }
-    dirent* de;
-    while ((de = readdir(dp)) != NULL) // iterate through directory content and search for End Point folders
-    {
-        string potentialPciEndPoint(de->d_name);
-        if (potentialPciEndPoint.find(":") != string::npos) // only PCI end point has ":" in its name
-        {
-            // Get interface name from End Point
-            string networkInterfaceName = GetInterfaceNameFromEP(potentialPciEndPoint);
-            if (networkInterfaceName != INVALID)
-            {
-                networkInterfaces.insert(networkInterfaceName);
-            }
-            else
-            {
-                LOG_VERBOSE << "Failed to find interface name for EP: " << potentialPciEndPoint << endl;
-            }
-        }
-    }
-
-    closedir(dp);
-    return networkInterfaces;
-}
-
-set<string> UnixPciDriver::Enumerate()
-{
-    set<string> interfacesToCheck = GetNetworkInterfaceNames();
-    set<string> connectedInterfaces;
-    for (auto it = interfacesToCheck.begin(); it != interfacesToCheck.end(); ++it)
-    {
-        string interfaceName = *it;
-
-        UnixPciDriver pciDriver(interfaceName);
-        if (pciDriver.Open())
-        {
-            connectedInterfaces.insert(UnixPciDriver::NameDevice(interfaceName));
-            pciDriver.Close();
-        }
-    }
-    return connectedInterfaces;
-}
-
-bool UnixPciDriver::Open()
-{
-    if(m_initialized)
-    {
-        return true;
-    }
-
-    m_fileDescriptor = socket(AF_INET, SOCK_DGRAM, 0);
-    if (INVALID_FD == m_fileDescriptor || m_fileDescriptor < 0)
-    {
-        Close();
-        return false;
-    }
-
-    // Validate interface is 11ad interface
-    if(!ValidateInterface())
-    {
-        Close();
-        return false;
-    }
-
-    if (!SetDebugFsPath())
-    {
-        LOG_VERBOSE << "Failed to find debug FS" << endl;
-    }
-
-    m_initialized = true;
-    return true;
-}
-
-bool UnixPciDriver::SetDebugFsPath() // assuming m_interfaceName is set
-{
-    // const definitions
-    static const char* PHY = "phy";
-
-    // find phy number
-    stringstream phyContaingFolder; // path of a folder which contains the phy of the specific interface
-    phyContaingFolder << "/sys/class/net/" << m_interfaceName << "/device/ieee80211";
-    DIR* dp = opendir(phyContaingFolder.str().c_str());
-    if (!dp) // ieee80211 doesn't exist, meaning this isn't an 11ad interface
-    {
-        return false;
-    }
-    dirent* de;// read phy name (phy folder is named phyX where X is a digit). We assume there is only one folder, if not we take the first one
-    do
-    {
-        de = readdir(dp);
-    } while ((de != NULL) && (strncmp(PHY, de->d_name, strlen(PHY)) != 0));
-    if (NULL == de)
-    {
-        closedir(dp);
-        return false;
-    }
-
-    // find debug FS (using phy name)
-    stringstream debugFsPath;
-    debugFsPath << "/sys/kernel/debug/ieee80211/" << de->d_name << "/wil6210";
-    if(-1 == access(debugFsPath.str().c_str(), F_OK)) // didn't find debug FS
-    {
-        closedir(dp);
-        return false;
-    }
-    closedir(dp);
-
-    // update debug FS path
-    m_debugFsPath = debugFsPath.str();
-    return true;
-}
-
-bool UnixPciDriver::ReOpen()
-{
-    return Open();
-}
-
-bool UnixPciDriver::AllocPmc(unsigned descSize, unsigned descNum, string& outMessage)
-{
-    PmcCfg pmcCfg(m_debugFsPath.c_str());
-    OperationStatus st = pmcCfg.AllocateDmaDescriptors(descSize, descNum);
-
-    outMessage = st.GetMessage();
-    return st.IsSuccess();
-}
-
-bool UnixPciDriver::DeallocPmc(std::string& outMessage)
-{
-    PmcCfg pmcCfg(m_debugFsPath.c_str());
-    OperationStatus st = pmcCfg.FreeDmaDescriptors();
-
-    outMessage = st.GetMessage();
-    return st.IsSuccess();
-}
-
-bool UnixPciDriver::CreatePmcFile(unsigned refNumber, std::string& outMessage)
-{
-    LOG_DEBUG << "Creating PMC data file #" << refNumber << std::endl;
-
-    PmcDataFileWriter pmcFileWriter(refNumber, m_debugFsPath.c_str());
-
-    OperationStatus st = pmcFileWriter.WriteFile();
-    outMessage = st.GetMessage();
-
-    if (!st.IsSuccess())
-    {
-        LOG_ERROR << "Error creating PMC data file for #" << refNumber << std::endl;
-        return false;
-    }
-
-    LOG_DEBUG << "PMC data file created. Reported size: " << st.GetMessage() << std::endl;
-    return true;
-}
-
-bool UnixPciDriver::FindPmcFile(unsigned refNumber, std::string& outMessage)
-{
-    LOG_DEBUG << "Looking for the PMC File #" << refNumber << endl;
-
-    PmcDataFileLocator pmcDataFileLocator(refNumber);
-
-    if (!pmcDataFileLocator.FileExists())
-    {
-        std::stringstream errorMsgBuilder;
-        errorMsgBuilder << "Cannot find PMC file " << pmcDataFileLocator.GetFileName();
-        outMessage = errorMsgBuilder.str();
-        return false;
-    }
-
-    outMessage = pmcDataFileLocator.GetFileName();
-    return true;
-}
-
-void UnixPciDriver::Close()
-{
-    if (m_fileDescriptor != INVALID_FD)
-    {
-        close(m_fileDescriptor);
-        m_fileDescriptor = INVALID_FD;
-    }
-}
-
-int UnixPciDriver::GetDriverMode(int &currentState)
-{
-    //do something with params
-    (void)currentState;
-
-    return 0;
-}
-bool UnixPciDriver::SetDriverMode(int newState, int &oldState)
-{
-    //do something with params
-    (void)newState;
-    (void)oldState;
-    return false;
-}
-
-void UnixPciDriver::Reset()
-{
-    return;
-}
-
-bool UnixPciDriver::DriverControl(uint32_t Id,
-                                  const void *inBuf, uint32_t inBufSize,
-                                  void *outBuf, uint32_t outBufSize)
-{
-    //do something with params
-    (void)Id;
-    (void)inBuf;
-    (void)inBufSize;
-    (void)outBuf;
-    (void)outBufSize;
-    return false;
-}
-
-bool UnixPciDriver::SendRWIoctl(IoctlIO & io, int fd, const char* interfaceName)
-{
-    int ret;
-    struct ifreq ifr;
-    ifr.ifr_data = (char*)&io;
-
-    snprintf(ifr.ifr_name, IFNAMSIZ, "%s", interfaceName);
-    ifr.ifr_name[IFNAMSIZ - 1] = 0;
-
-    ret = ioctl(fd, WIL_IOCTL_MEMIO, &ifr); // read/write DWORD
-    if (ret < 0)
-    {
-        return false;
-    }
-
-    return true;
-}
-
-bool UnixPciDriver::SendRWBIoctl(IoctlIOBlock & io, int fd, const char* interfaceName)
-{
-    int ret;
-    struct ifreq ifr;
-    ifr.ifr_data = (char*)&io;
-
-    snprintf(ifr.ifr_name, IFNAMSIZ, "%s", interfaceName);
-    ifr.ifr_name[IFNAMSIZ - 1] = 0;
-
-    ret = ioctl(fd, WIL_IOCTL_MEMIO_BLOCK, &ifr);  // read/write BYTES. number of bytes must be multiple of 4
-    if (ret < 0)
-    {
-        return false;
-    }
-
-    return true;
-}
-
-// Receives interface name (wigig#, wlan#) and checks if it is responding
-bool UnixPciDriver::ValidateInterface()
-{
-    IoctlIO io;
-    io.addr = BAUD_RATE_REGISTER;
-    io.op = EP_OPERATION_READ;
-
-    if(SendRWIoctl(io, m_fileDescriptor, m_interfaceName.c_str()))
-    {
-        return true;
-    }
-
-    return false;
-}
-
-bool UnixPciDriver::IsValidInternal()
-{
-    if(-1 == access(m_debugFsPath.c_str(), F_OK)) // didn't find debug FS
-    {
-        return false;
-    }
-
-    return true;
-}
-
-string UnixPciDriver::NameDevice(string interfaceName)
-{
-    stringstream ss;
-    ss << Utils::PCI << DEVICE_NAME_DELIMITER << interfaceName;
-    return ss.str();
-}
-#endif // ifndef _WINDOWS
diff --git a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/UnixPciDriver.h b/debug-tools/host_manager_11ad/access_layer_11ad/Unix/UnixPciDriver.h
deleted file mode 100644
index 590ab97..0000000
--- a/debug-tools/host_manager_11ad/access_layer_11ad/Unix/UnixPciDriver.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _11AD_PCI_UNIX_PCI_DRIVER_H_
-#define _11AD_PCI_UNIX_PCI_DRIVER_H_
-
-
-#ifndef _WINDOWS
-
-#include "DriverAPI.h"
-
-using namespace std;
-
-class UnixPciDriver : public DriverAPI
-{
-    typedef struct
-    {
-        DWORD deviceUID;
-        DWORD commandID;
-        DWORD dataSize; /* inBufSize + outBufSize */
-        DWORD inBufOffset;
-        DWORD inBufSize;
-        DWORD outBufOffset;
-        DWORD outBufSize;
-    } IoctlHeader;
-
-#define IOCTL_FLAG_SET 0x1
-#define IOCTL_FLAG_GET 0x2
-
-#define EP_OPERATION_READ 0
-#define EP_OPERATION_WRITE 1
-#define WIL_IOCTL_MEMIO (SIOCDEVPRIVATE + 2)
-#define WIL_IOCTL_MEMIO_BLOCK (SIOCDEVPRIVATE + 3)
-
-#define INVALID_FD -1
-
-    static __INLINE BYTE *
-        IoctlDataIn(IoctlHeader *h)
-    {
-        return ((BYTE*)&h[1]) + h->inBufOffset;
-    }
-
-    static __INLINE BYTE *
-        IoctlDataOut(IoctlHeader *h)
-    {
-        return ((BYTE*)&h[1]) + h->outBufOffset;
-    }
-
-    typedef struct {
-        uint32_t op;
-        uint32_t addr; /* should be 32-bit aligned */
-        uint32_t val;
-    } IoctlIO;
-
-    typedef    struct {
-        uint32_t op;
-        uint32_t addr; /* should be 32-bit aligned */
-        uint32_t size; /* represents the size in bytes. should be multiple of 4 */
-        void* buf; /* block address */
-    } IoctlIOBlock;
-
-public:
-    explicit UnixPciDriver(string interfaceName) : DriverAPI(interfaceName)
-    {
-    }
-
-    ~UnixPciDriver();
-
-    // Base access functions (to be implemented by specific device)
-    bool Read(DWORD address, DWORD& value);
-    bool ReadBlock(DWORD address, DWORD blockSize, vector<DWORD>& values);
-    bool ReadBlock(DWORD addr, DWORD blockSize, char *arrBlock); // blockSize is the size in bytes
-    bool Write(DWORD address, DWORD value);
-    bool WriteBlock(DWORD addr, vector<DWORD> values);
-    bool WriteBlock(DWORD address, DWORD blockSize, const char *valuesToWrite);
-
-    bool Open();
-    bool ReOpen();
-
-    bool DriverControl(uint32_t Id,
-                       const void *inBuf, uint32_t inBufSize,
-                       void *outBuf, uint32_t outBufSize);
-//    DWORD DebugFS(char *FileName, void *dataBuf, DWORD dataBufLen, DWORD DebugFSFlags);
-
-    bool AllocPmc(unsigned descSize, unsigned descNum, std::string& outMessage);
-    bool DeallocPmc(std::string& outMessage);
-    bool CreatePmcFile(unsigned refNumber, std::string& outMessage);
-    bool FindPmcFile(unsigned refNumber, std::string& outMessage);
-
-    void Close();
-
-    int GetDriverMode(int &currentState);
-    bool SetDriverMode(int newState, int &oldState);
-
-    void Reset();
-
-    static set<string> Enumerate();
-
-private:
-
-    bool InternalIoctl(void *dataBuf, DWORD dataBufLen, DWORD ioctlFlags);
-    bool SendRWIoctl(IoctlIO & io, int fd, const char* interfaceName);
-    bool SendRWBIoctl(IoctlIOBlock & io, int fd, const char* interfaceName);
-    bool ValidateInterface();
-    bool IsValidInternal();
-    bool SetDebugFsPath();
-    static string NameDevice(string interfaceName);
-
-    bool m_initialized = false;
-
-    int m_fileDescriptor = -1;
-
-    string m_debugFsPath;
-};
-
-#endif // ifndef _WINDOWS
-
-#endif //_11AD_PCI_UNIX_PCI_DRIVER_H_
diff --git a/debug-tools/host_manager_11ad/main.cpp b/debug-tools/host_manager_11ad/main.cpp
deleted file mode 100644
index e96f68e..0000000
--- a/debug-tools/host_manager_11ad/main.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "OsHandler.h"
-#include "ArgumentsParser.h"
-#include <memory>
-//#include "Server.h"
-#include "DebugLogger.h"
-#include <iostream> //TODO - maybe remove in final
-#include "Host.h"
-
-using namespace std;
-
-#define DEFAULT_COMMANDS_TCP_SERVER_PORT 12348 //TODO - change back to 12348
-#define DEFAULT_EVENTS_TCP_SERVER_PORT 12339 //TODO - change back to 12347
-#define DEFAULT_UDP_SERVER_PORT_IN_GET_MESSAGE 12349 // This is a UDP port to get messages only from the remote server
-#define DEFAULT_REMOTE_UDP_SERVER_PORT_OUT_SEND_MESSAGE 12350 // This is the UDP port in the remote server to send messages only
-#define DEFAULT_HTTP_SERVER_PORT 3000 // This is the HTTP port for local web UI
-
-// *************************************************************************************************
-
-int main(int argc, char* argv[])
-{
-    try
-    {
-        LOG_INFO << "Host Manager 11ad version: " << HostInfo::GetVersion() << endl;
-
-        unsigned int commandsTcpPort = DEFAULT_COMMANDS_TCP_SERVER_PORT;
-        unsigned int eventsTcpPort = DEFAULT_EVENTS_TCP_SERVER_PORT;
-        unsigned int udpPortIn = DEFAULT_UDP_SERVER_PORT_IN_GET_MESSAGE;
-        unsigned int udpPortOut = DEFAULT_REMOTE_UDP_SERVER_PORT_OUT_SEND_MESSAGE;
-        unsigned int httpPort = DEFAULT_HTTP_SERVER_PORT;
-
-        unique_ptr<ArgumentsParser> pArgumentsParser(new ArgumentsParser());
-        //support to change by the user the commands TCP port only,events Tcp port UDP ports are not changeable by the user
-        bool continueRunningHostManager = pArgumentsParser->ParseAndHandleArguments(argc, argv, commandsTcpPort);
-
-        if (continueRunningHostManager)
-        {
-            //Handle OS specific configurations
-            unique_ptr<OsHandler> pOsHandler(new OsHandler());
-            pOsHandler->HandleOsSignals();
-
-            //Start Host object
-            LOG_INFO << "Starting Host Manager" << endl;
-            Host::GetHost().StartHost(commandsTcpPort, eventsTcpPort, udpPortIn, udpPortOut, httpPort);
-
-            LOG_INFO << "Stopping host_manager_11ad" << endl;
-        }
-
-    }
-    catch (exception& e)
-    {
-        LOG_ERROR << "Stopping host_manager_11ad due to failure: " << e.what() << endl;
-    }
-
-    return 0;
-
-
-}
\ No newline at end of file
diff --git a/debug-tools/lib/Android.mk b/debug-tools/lib/Android.mk
deleted file mode 100644
index 8e4e086..0000000
--- a/debug-tools/lib/Android.mk
+++ /dev/null
@@ -1,6 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-include $(call all-makefiles-under, $(LOCAL_PATH))
-
diff --git a/debug-tools/lib/FlashAcss/Android.mk b/debug-tools/lib/FlashAcss/Android.mk
deleted file mode 100644
index 2fdbf9f..0000000
--- a/debug-tools/lib/FlashAcss/Android.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libwigig_flashaccess
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CPPFLAGS := -Wall -lpthread
-
-LOCAL_C_INCLUDES += \
-	$(LOCAL_PATH) \
-	$(LOCAL_PATH)/../inc \
-	$(LOCAL_PATH)/../inc/linux \
-	$(LOCAL_PATH)/../utils \
-	$(LOCAL_PATH)/../utils/linux \
-	$(LOCAL_PATH)/linux \
-	$(LOCAL_PATH)/../WlctPciAcss \
-	$(LOCAL_PATH)/../WlctPciAcss/linux
-
-LOCAL_SRC_FILES := $(shell find $(LOCAL_PATH) -name '*.cpp' | sed s:^$(LOCAL_PATH)::g )
-
-LOCAL_SHARED_LIBRARIES := \
-	libwigig_utils \
-	libwigig_pciaccess
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/debug-tools/lib/FlashAcss/FlashAcss.cpp b/debug-tools/lib/FlashAcss/FlashAcss.cpp
deleted file mode 100644
index 47f12f4..0000000
--- a/debug-tools/lib/FlashAcss/FlashAcss.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "flashacss.h"
-#include "flash_gateway.h"
-#include "SparrowGateway.h"
-#include "MarlonGateway.h"
-
-FLSHACSS_API int wfa_create_flash_access_handler(DType devType, void* pDeviceAccess, void** pFlashAccess)
-{
-	flash_gateway* p_flash_gateway = NULL;
-	if (devType == MST_TALYN)
-	{
-		p_flash_gateway = new SparrowGateway(pDeviceAccess);
-	}
-	if (devType == MST_SPARROW)
-	{
-		p_flash_gateway = new SparrowGateway(pDeviceAccess);
-	}
-	else if (devType == MST_MARLON)
-	{
-		p_flash_gateway = new MarlonGateway(pDeviceAccess);
-	}
-	else
-	{
-		return WLCT_OS_ERROR_NOT_SUPPORTED;
-	}
-	*pFlashAccess = (void*)p_flash_gateway;
-	return 0;
-}
-
-FLSHACSS_API int wfa_close_flash_access_handler(void* pFlashAccess)
-{
-    int res = 0;
-    flash_gateway* p_flash_gateway = (flash_gateway*)pFlashAccess;
-    if (p_flash_gateway != NULL)
-    {
-        __TRY
-        {
-            delete p_flash_gateway;
-        }
-        __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-        {
-            res = -1;
-        }
-    }
-    return res;
-}
-
-FLSHACSS_API int wfa_run_command(void* pFlashAccss, UCHAR flash_cmd, FLASH_PHASE phase, bool bWrite, unsigned long addr, unsigned long ulSize)
-{
-    int rc = 0;
-    if (pFlashAccss == NULL)
-        return -1;
-
-    __TRY
-    {
-        rc = ((flash_gateway*)pFlashAccss)->runCommand(flash_cmd, phase, bWrite, addr, ulSize);
-    }
-    __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-    {
-    }
-    return rc;
-}
-
-FLSHACSS_API int wfa_set_data(void* pFlashAccss, const BYTE *buffer, unsigned long size)
-{
-    int rc = 0;
-    if (pFlashAccss == NULL)
-        return -1;
-
-    __TRY
-    {
-        rc = ((flash_gateway*)pFlashAccss)->setData(buffer, size);
-    }
-    __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-    {
-    }
-    return rc;
-}
-
-FLSHACSS_API int wfa_get_data(void* pFlashAccss, BYTE *buffer, unsigned long size)
-{
-    int rc = 0;
-    if (pFlashAccss == NULL)
-        return -1;
-
-    __TRY
-    {
-        rc = ((flash_gateway*)pFlashAccss)->getData(buffer, size);
-    }
-    __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-    {
-    }
-    return rc;
-}
-
-FLSHACSS_API int wfa_wait_done(void* pFlashAccss)
-{
-    int rc = 0;
-    if (pFlashAccss == NULL)
-        return -1;
-
-    __TRY
-    {
-        rc = ((flash_gateway*)pFlashAccss)->wait_done();
-    }
-    __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-    {
-    }
-    return rc;
-}
-
-FLSHACSS_API int wfa_boot_done(void* pFlashAccss)
-{
-    int rc = 0;
-    if (pFlashAccss == NULL)
-        return -1;
-
-    __TRY
-    {
-        rc = ((flash_gateway*)pFlashAccss)->boot_done();
-    }
-    __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-    {
-    }
-    return rc;
-}
-
-FLSHACSS_API bool wfa_get_lock (void* pFlashAccss)
-{
-    bool ret = false;
-
-    if (pFlashAccss == NULL)
-        return ret;
-
-    __TRY
-    {
-        ret = ((flash_gateway*)pFlashAccss)->get_lock();
-    }
-    __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-    {
-    }
-    return ret;
-}
-
-FLSHACSS_API int wfa_force_lock (void* pFlashAccss)
-{
-    int rc = 0;
-    if (pFlashAccss == NULL)
-        return -1;
-
-    __TRY
-    {
-        rc = ((flash_gateway*)pFlashAccss)->force_lock();
-    }
-    __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-    {
-    }
-    return rc;
-}
-
-FLSHACSS_API int wfa_release_lock(void* pFlashAccss)
-{
-    int rc = 0;
-    if (pFlashAccss == NULL)
-        return -1;
-
-    __TRY
-    {
-        rc = ((flash_gateway*)pFlashAccss)->release_lock();
-    }
-    __EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-    {
-    }
-    return rc;
-}
diff --git a/debug-tools/lib/FlashAcss/Makefile b/debug-tools/lib/FlashAcss/Makefile
deleted file mode 100644
index 3189001..0000000
--- a/debug-tools/lib/FlashAcss/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
--include $(TOPDIR)/rules.mk
-
-CFLAGS := -fPIC -Wall -g -MMD
-LDFLAGS := -shared -fPIC
-
-LIB := libwigig_flashaccess.so
-
-.DEFAULT_GOAL = all
-
-ifneq ($(CONFIG_TARGET_ipq)$(CONFIG_TARGET_ipq806x),)
-is_ipq806x = 1
-endif
-
-ifeq ($(is_ipq806x), 1)
-ifneq ($(strip $(TOOLPREFIX)),)
-CROSS:=$(TOOLPREFIX)
-endif
-endif
-
-CC = $(CROSS)gcc
-CXX = $(CROSS)g++
-
-INCLUDES = -I . \
-		-I ../inc/linux \
-                -I ../inc \
-                -I ../utils/linux \
-                -I ../utils \
-                -I ./linux \
-                -I ../WlctPciAcss \
-
-all: $(LIB)
-
-CPP_FILES := $(shell find . -type f -name '*.cpp')
-OBJ_FILES :=  $(CPP_FILES:.cpp=.o)
-
-$(LIB): $(OBJ_FILES)
-	$(CXX) $(LDFLAGS) -o $(LIB) $(OBJ_FILES)
-
-%.o : %.cpp
-	$(CXX) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-clean:
-	rm -rf $(LIB)
-	find . -type f \( -name "*.d" -o -name "*.o" \) -delete
-
--include $(OBJ_FILES:%.o=%.d)
diff --git a/debug-tools/lib/FlashAcss/MarlonGateway.cpp b/debug-tools/lib/FlashAcss/MarlonGateway.cpp
deleted file mode 100644
index 859b9c8..0000000
--- a/debug-tools/lib/FlashAcss/MarlonGateway.cpp
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include "MarlonGateway.h"
-
-#define ONES32(size)                    ((size)?(0xffffffff>>(32-(size))):0)
-#define MASK32(offset,size)             (ONES32(size)<<(offset))
-
-#define EXTRACT_C32(source,offset,size)   ((((unsigned)(source))>>(offset)) & ONES32(size))
-#define EXTRACT32(src,start,len)          (((len)==32)?(src):EXTRACT_C32(src,start,len))
-
-#define MERGE_C32(rsrc1,rsrc2,start,len)  ((((rsrc2)<<(start)) & (MASK32((start),(len)))) | ((rsrc1) & (~MASK32((start),(len)))))
-#define MERGE32(rsrc1,rsrc2,start,len)    (((len)==32)?(rsrc2):MERGE_C32(rsrc1,rsrc2,start,len))
-
-MarlonGateway::MarlonGateway(const char *device_name)
-{
-    m_got_lock = false;
-    int res;
-    res =  CreateDeviceAccessHandler( device_name, MST_MARLON, &m_handler );
-    WLCT_UNREFERENCED_PARAM(res);
-}
-
-MarlonGateway::MarlonGateway(void* flashHandle)
-{
-    m_got_lock = false;
-    m_handler = flashHandle;
-}
-
-MarlonGateway::~MarlonGateway(void)
-{
-    int res = CloseDeviceAccessHandler(m_handler);
-
-    WLCT_UNREFERENCED_PARAM(res);
-//     if (m_got_lock)
-//     {
-//       release_lock();
-//     }
-}
-
-int MarlonGateway::runCommand(UCHAR flash_cmd, FLASH_PHASE phase, bool bWrite, DWORD addr, DWORD ulSize)
-{
-    int rc = 0;
-    // write the address if it needed (according to the instruction phase)
-    switch (phase)
-    {
-    case INSTRUCTION_PHASE:
-        break;
-    case INSTRUCTION_ADDRESS_PHASE:
-        rc = setAddr(addr);
-        break;
-    case INSTRUCTION_DATA_PHASE:
-        break;
-    case INSTRUCTION_ADDRESS_DATA_PHASE:
-        rc = setAddr(addr);
-        break;
-    }
-    if (rc != 0)
-    {
-        return rc;
-    }
-
-    u_int32_t opcode_n_len = 0;
-
-    // write the number of bytes to read or write
-    opcode_n_len = MERGE32(opcode_n_len, ulSize, 0, 16);
-
-    if (bWrite)
-    {
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_WRITE_OP, 1);
-    }
-
-    switch (phase)
-    {
-    case INSTRUCTION_PHASE:
-        break;
-    case INSTRUCTION_ADDRESS_PHASE:
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_ADDR_PHASE, 1);
-        break;
-    case INSTRUCTION_DATA_PHASE:
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_DATA_PHASE, 1);
-        break;
-    case INSTRUCTION_ADDRESS_DATA_PHASE:
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_DATA_PHASE, 1);
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_ADDR_PHASE, 1);
-        break;
-    }
-    opcode_n_len = MERGE32(opcode_n_len, flash_cmd, BIT_OFFSET_INST, BIT_SIZE_INST);
-
-    rc = w(CR_FLASH_OPCODE, opcode_n_len);
-    if (rc != 0)
-    {
-        return rc;
-    }
-    rc = execute_cmd();
-    return rc;
-}
-
-int MarlonGateway::setAddr(DWORD addr)
-{
-    int rc = 0;
-    rc = w(CR_FLASH_ADDR, addr);
-    return rc;
-}
-
-
-int MarlonGateway::execute_cmd () const
-{
-    int rc = 0;
-    // BIT_GO
-    u_int32_t cmd = 0x40000000;
-    if (m_got_lock)
-    {
-        // BIT_GO & BIT_LOCK
-        cmd = 0xC0000000;
-    }
-
-    rc = w(CR_FLASH_STAT_CTL, cmd);
-    if (rc != 0)
-    {
-        return rc;
-    }
-    rc = wait_done();
-    return rc;
-}
-
-typedef struct _FOUR_BYTES_ {
-    union {
-        struct {
-            u_int8_t b[4];
-        }dummyStrct;
-
-        u_int32_t _dword_;
-    }dummyUnion;
-}FOUR_BYTES;
-
-int MarlonGateway::setData(const BYTE *buffer, DWORD size)
-{
-    int rc = 0;
-    u_int32_t word;
-    if ((size & 0x3) == 0)
-    {    // size is module 4
-        rc = wb(CR_FLASH_DATA, size, buffer);
-    }
-    else
-    {
-        for (u_int32_t i = 0 ; i < size ; i += 4)
-        {
-            // check the case that size is not DWORD align
-            if (i+4 > size)
-            {
-                FOUR_BYTES fb;
-                fb.dummyUnion._dword_ = 0;
-                // copy the entire array (1, 2, or 3 bytes)
-                for (DWORD j = 0; j < (size-i); j++)
-                {
-                    fb.dummyUnion.dummyStrct.b[j] = buffer[i+j];
-                }
-                word = fb.dummyUnion._dword_;
-            }
-            else
-            {
-                word = *((u_int32_t*)(&buffer[i]));
-            }
-            rc = w(CR_FLASH_DATA + i, word );
-            if (rc != 0)
-            {
-                return rc;
-            }
-        }
-    }
-    return rc;
-}
-
-int MarlonGateway::getData(BYTE *buffer, DWORD size)
-{
-    int rc = 0;
-    DWORD val;
-    DWORD size2 = (size >> 2) << 2;
-    DWORD remainder = size - size2;
-    rc = rb(CR_FLASH_DATA, size2, buffer);
-    return rc;
-
-    WLCT_UNREFERENCED_PARAM(val);
-    WLCT_UNREFERENCED_PARAM(remainder);
-}
-
-int MarlonGateway::wait_done (void) const
-{
-    int rc = 0;
-    DWORD val;
-    u_int32_t timeout = 0;
-    do {
-        rc = r(CR_FLASH_STAT_CTL, val);
-        if (rc != 0)
-        {
-            return rc;
-        }
-        if (EXTRACT32(val, BIT_OFFSET_BUSY, 1) == 0) {
-            return rc;
-        }
-        sleep_ms( 10 );
-        timeout+= 10;
-    } while (timeout <= 100);
-
-    ERR("wait_done:: timeout reached\n");
-    return (-1);
-}
-
-int MarlonGateway::boot_done(void) const
-{
-    int rc = 0;
-    return rc;
-}
-
-bool MarlonGateway::get_lock ()
-{
-    if (g_debug) DBG("Trying to get flash lock\n");
-    int rc = 0;
-    u_int32_t timeout = 0;
-    DWORD value;
-
-    do {
-        rc = r(CR_FLASH_STAT_CTL, value);
-        if (rc != 0)
-        {
-            return false;
-        }
-        // bit BIT_LOCK
-        if ( (value & 0x80000000) == 0) {
-            m_got_lock = true;
-            if (g_debug) DBG("Done\n");
-            return true;
-        }
-        sleep_ms( 10 );
-        timeout++;
-    } while (timeout <= 10 );
-
-    if (g_debug) DBG("Failed. Semaphore is 0x%04x\n", (unsigned int)value);
-    return false;
-}
-
-int MarlonGateway::force_lock ()
-{
-    int rc = 0;
-    //w (CR_FLASH_STAT_CTL, 1<<15);
-    m_got_lock = true;
-    if (g_debug) DBG("Forced flash lock\n");
-    return rc;
-}
-
-int MarlonGateway::release_lock()
-{
-    int rc = 0;
-    DWORD val;
-    if ( m_got_lock )
-    {
-        rc = r(CR_FLASH_STAT_CTL, val);
-        if (rc != 0)
-        {
-            return rc;
-        }
-        rc = w(CR_FLASH_STAT_CTL, val & 0x7fffffff);
-        m_got_lock = false;
-        if (g_debug) DBG("Released flash lock\n");
-    }
-    return rc;
-}
-
-int MarlonGateway::w(u_int32_t offset, DWORD val) const
-{
-    int rc = 0;
-    rc = WlctAccssWrite(m_handler, offset, val);
-    if( 0 != rc ) {
-        ERR("Failed writing offset 0x%04x rc=%d\n", offset, rc);
-    }
-    return rc;
-}
-
-int MarlonGateway::r(u_int32_t offset, DWORD & val) const
-{
-    int rc = 0;
-    rc = WlctAccssRead(m_handler, offset, val);
-    if( 0 != rc ) {
-        ERR("Failed reading offset 0x%04x rc=%d\n", offset, rc);
-    }
-    return rc;
-}
-
-int MarlonGateway::wb(u_int32_t offset, DWORD size, const BYTE *buffer)
-{
-    int rc = 0;
-    rc = writeBlock(m_handler, offset, size, (char*)buffer);
-    if( 0 != rc ) {
-        ERR("Failed writing offset 0x%04x rc=%d\n", offset, rc);
-    }
-    return rc;
-}
-
-int MarlonGateway::rb(u_int32_t offset, DWORD size, const BYTE *buffer)
-{
-    int rc = 0;
-    rc = readBlock(m_handler, offset, size, (char*)buffer);
-    if( 0 != rc ) {
-        ERR("Failed reading offset 0x%04x rc=%d\n", offset, rc);
-    }
-    return rc;
-}
-
diff --git a/debug-tools/lib/FlashAcss/MarlonGateway.h b/debug-tools/lib/FlashAcss/MarlonGateway.h
deleted file mode 100644
index 6d275b2..0000000
--- a/debug-tools/lib/FlashAcss/MarlonGateway.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-#include "flashacss.h"
-
-class MarlonGateway : public flash_gateway
-{
-public:
-    MarlonGateway(const char *device_name);
-    MarlonGateway(void* flashHandle);
-    virtual ~MarlonGateway(void);
-    virtual int runCommand(UCHAR flash_cmd, FLASH_PHASE phase, bool bWrite, DWORD addr, DWORD ulSize);
-    virtual int setData(const BYTE *buffer, DWORD size);
-    virtual int getData(BYTE *buffer, DWORD size);
-    virtual int wait_done (void) const;
-    virtual int boot_done(void) const;
-    virtual bool get_lock ();
-    virtual int force_lock ();
-    virtual int release_lock();
-
-private:
-
-    int setAddr(DWORD addr);
-//    void setSize(DWORD size);
-    int setCommand(UCHAR cmd, FLASH_PHASE phase, bool bWrite);
-
-    int wb(u_int32_t offset, DWORD size, const BYTE *buffer);
-    int rb(u_int32_t offset, DWORD size, const BYTE *buffer);
-    int r(u_int32_t offset, DWORD & val) const;
-    int w(u_int32_t offset, DWORD val) const;
-    int execute_cmd() const;
-
-    bool m_got_lock;
-
-    enum constants{
-        CR_USER                 = 0x880000,
-#ifndef MARLON_B0
-        CR_FLASH_DATA           = CR_USER + 0xA8,
-        CR_FLASH_ADDR           = CR_USER + 0x1B0,
-        CR_FLASH_OPCODE         = CR_USER + 0x1AC,
-        CR_FLASH_STAT_CTL       = CR_USER + 0x1A8,
-#else
-        CR_FLASH_DATA           = CR_USER + 0x5C,
-        CR_FLASH_ADDR           = CR_USER + 0x164,
-        CR_FLASH_OPCODE         = CR_USER + 0x160,
-        CR_FLASH_STAT_CTL       = CR_USER + 0x15C,
-#endif // MARLON_B0
-
-        // CR_FLASH_OPCODE
-        BIT_OFFSET_INST         = 16,
-        BIT_SIZE_INST           = 8,
-        BIT_OFFSET_ADDR_PHASE   = 24,
-        BIT_OFFSET_DATA_PHASE   = 25,
-        BIT_OFFSET_WRITE_OP     = 31,
-
-        BIT_FLASH_STATUS_OFFSET = 0,
-        BIT_FLASH_STATUS_SIZE   = 8,
-        BIT_OFFSET_BUSY         = 29,
-        BIT_GO                  = 30,
-        BIT_LOCK                = 31,
-    };
-
-};
diff --git a/debug-tools/lib/FlashAcss/SparrowGateway.cpp b/debug-tools/lib/FlashAcss/SparrowGateway.cpp
deleted file mode 100644
index 2146643..0000000
--- a/debug-tools/lib/FlashAcss/SparrowGateway.cpp
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include "SparrowGateway.h"
-
-#define ONES32(size)                    ((size)?(0xffffffff>>(32-(size))):0)
-#define MASK32(offset,size)             (ONES32(size)<<(offset))
-
-#define EXTRACT_C32(source,offset,size)   ((((unsigned)(source))>>(offset)) & ONES32(size))
-#define EXTRACT32(src,start,len)          (((len)==32)?(src):EXTRACT_C32(src,start,len))
-
-#define MERGE_C32(rsrc1,rsrc2,start,len)  ((((rsrc2)<<(start)) & (MASK32((start),(len)))) | ((rsrc1) & (~MASK32((start),(len)))))
-#define MERGE32(rsrc1,rsrc2,start,len)    (((len)==32)?(rsrc2):MERGE_C32(rsrc1,rsrc2,start,len))
-
-SparrowGateway::SparrowGateway(const char *device_name)
-{
-    m_got_lock = false;
-    int res;
-    res =  CreateDeviceAccessHandler( device_name, MST_SPARROW, &m_handler );
-    WLCT_UNREFERENCED_PARAM(res);
-}
-
-SparrowGateway::SparrowGateway(void* flashHandle)
-{
-    m_got_lock = false;
-    m_handler = flashHandle;
-}
-
-SparrowGateway::~SparrowGateway(void)
-{
-    int res = CloseDeviceAccessHandler(m_handler);
-
-    WLCT_UNREFERENCED_PARAM(res);
-//     if (m_got_lock)
-//     {
-//       release_lock();
-//     }
-}
-
-int SparrowGateway::runCommand(UCHAR flash_cmd, FLASH_PHASE phase, bool bWrite, DWORD addr, DWORD ulSize)
-{
-    int rc = 0;
-    // write the address if it needed (according to the instruction phase)
-    switch (phase)
-    {
-    case INSTRUCTION_PHASE:
-        break;
-    case INSTRUCTION_ADDRESS_PHASE:
-        rc = setAddr(addr);
-        break;
-    case INSTRUCTION_DATA_PHASE:
-        break;
-    case INSTRUCTION_ADDRESS_DATA_PHASE:
-        rc = setAddr(addr);
-        break;
-    }
-    if (rc != 0)
-    {
-        return rc;
-    }
-
-    u_int32_t opcode_n_len = 0;
-
-    // write the number of bytes to read or write
-    opcode_n_len = MERGE32(opcode_n_len, ulSize, 0, 16);
-
-    if (bWrite)
-    {
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_WRITE_OP, 1);
-    }
-
-    switch (phase)
-    {
-    case INSTRUCTION_PHASE:
-        break;
-    case INSTRUCTION_ADDRESS_PHASE:
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_ADDR_PHASE, 1);
-        break;
-    case INSTRUCTION_DATA_PHASE:
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_DATA_PHASE, 1);
-        break;
-    case INSTRUCTION_ADDRESS_DATA_PHASE:
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_DATA_PHASE, 1);
-        opcode_n_len = MERGE32(opcode_n_len, 1, BIT_OFFSET_ADDR_PHASE, 1);
-        break;
-    }
-    opcode_n_len = MERGE32(opcode_n_len, flash_cmd, BIT_OFFSET_INST, BIT_SIZE_INST);
-
-    rc = w(CR_FLASH_OPCODE, opcode_n_len);
-    if (rc != 0)
-    {
-        return rc;
-    }
-    rc = execute_cmd();
-    return rc;
-}
-
-int SparrowGateway::setAddr(DWORD addr)
-{
-    int rc = 0;
-    rc = w(CR_FLASH_ADDR, addr);
-    return rc;
-}
-
-
-int SparrowGateway::execute_cmd () const
-{
-    int rc = 0;
-    // BIT_GO
-    u_int32_t cmd = 0x40000000;
-    if (m_got_lock)
-    {
-        // BIT_GO & BIT_LOCK
-        cmd = 0xC0000000;
-    }
-
-    rc = w(CR_FLASH_STAT_CTL, cmd);
-    if (rc != 0)
-    {
-        return rc;
-    }
-    rc = wait_done();
-    return rc;
-}
-
-typedef struct _FOUR_BYTES_ {
-    union {
-        struct {
-            u_int8_t b[4];
-        }dummyStrct;
-
-        u_int32_t _dword_;
-    }dummyUnion;
-}FOUR_BYTES;
-
-int SparrowGateway::setData(const BYTE *buffer, DWORD size)
-{
-    int rc = 0;
-    u_int32_t word;
-    if ((size & 0x3) == 0)
-    {    // size is module 4
-        rc = wb(CR_FLASH_DATA, size, buffer);
-    }
-    else
-    {
-        for (u_int32_t i = 0 ; i < size ; i += 4)
-        {
-            // check the case that size is not DWORD align
-            if (i+4 > size)
-            {
-                FOUR_BYTES fb;
-                fb.dummyUnion._dword_ = 0;
-                // copy the entire array (1, 2, or 3 bytes)
-                for (DWORD j = 0; j < (size-i); j++)
-                {
-                    fb.dummyUnion.dummyStrct.b[j] = buffer[i+j];
-                }
-                word = fb.dummyUnion._dword_;
-            }
-            else
-            {
-                word = *((u_int32_t*)(&buffer[i]));
-            }
-            rc = w(CR_FLASH_DATA + i, word );
-            if (rc != 0)
-            {
-                return rc;
-            }
-        }
-    }
-    return rc;
-}
-
-int SparrowGateway::getData(BYTE *buffer, DWORD size)
-{
-    int rc = 0;
-    DWORD val;
-    DWORD size2 = (size >> 2) << 2;
-    DWORD remainder = size - size2;
-    rc = rb(CR_FLASH_DATA, size2, buffer);
-    return rc;
-
-    WLCT_UNREFERENCED_PARAM(val);
-    WLCT_UNREFERENCED_PARAM(remainder);
-}
-
-int SparrowGateway::wait_done (void) const
-{
-    int rc = 0;
-    DWORD val;
-    u_int32_t timeout = 0;
-    do {
-        rc = r(CR_FLASH_STAT_CTL, val);
-        if (rc != 0)
-        {
-            return rc;
-        }
-        if (EXTRACT32(val, BIT_OFFSET_BUSY, 1) == 0) {
-            return rc;
-        }
-        sleep_ms( 10 );
-        timeout+= 10;
-    } while (timeout <= 100);
-
-    ERR("wait_done:: timeout reached\n");
-    return (-1);
-}
-
-int SparrowGateway::boot_done(void) const
-{
-    int rc = 0;
-    return rc;
-}
-
-bool SparrowGateway::get_lock ()
-{
-    if (g_debug) DBG("Trying to get flash lock\n");
-    int rc = 0;
-    u_int32_t timeout = 0;
-    DWORD value;
-
-    do {
-        rc = r(CR_FLASH_STAT_CTL, value);
-        if (rc != 0)
-        {
-            return false;
-        }
-        // bit BIT_LOCK
-        if ( (value & 0x80000000) == 0) {
-            m_got_lock = true;
-            if (g_debug) DBG("Done\n");
-            return true;
-        }
-        sleep_ms( 10 );
-        timeout++;
-    } while (timeout <= 10 );
-
-    if (g_debug) DBG("Failed. Semaphore is 0x%04x\n", (unsigned int)value);
-    return false;
-}
-
-int SparrowGateway::force_lock ()
-{
-    int rc = 0;
-    //w (CR_FLASH_STAT_CTL, 1<<15);
-    m_got_lock = true;
-    if (g_debug) DBG("Forced flash lock\n");
-    return rc;
-}
-
-int SparrowGateway::release_lock()
-{
-    int rc = 0;
-    DWORD val;
-    if ( m_got_lock )
-    {
-        rc = r(CR_FLASH_STAT_CTL, val);
-        if (rc != 0)
-        {
-            return rc;
-        }
-        rc = w(CR_FLASH_STAT_CTL, val & 0x7fffffff);
-        m_got_lock = false;
-        if (g_debug) DBG("Released flash lock\n");
-    }
-    return rc;
-}
-
-int SparrowGateway::w(u_int32_t offset, DWORD val) const
-{
-    int rc = 0;
-    rc = WlctAccssWrite(m_handler, offset, val);
-    if( 0 != rc ) {
-        ERR("Failed writing offset 0x%04x rc=%d\n", offset, rc);
-    }
-    return rc;
-}
-
-int SparrowGateway::r(u_int32_t offset, DWORD & val) const
-{
-    int rc = 0;
-    rc = WlctAccssRead(m_handler, offset, val);
-    if( 0 != rc ) {
-        ERR("Failed reading offset 0x%04x rc=%d\n", offset, rc);
-    }
-    return rc;
-}
-
-int SparrowGateway::wb(u_int32_t offset, DWORD size, const BYTE *buffer)
-{
-    int rc = 0;
-    rc = writeBlock(m_handler, offset, size, (char*)buffer);
-    if( 0 != rc ) {
-        ERR("Failed writing offset 0x%04x rc=%d\n", offset, rc);
-    }
-    return rc;
-}
-
-int SparrowGateway::rb(u_int32_t offset, DWORD size, const BYTE *buffer)
-{
-    int rc = 0;
-    rc = readBlock(m_handler, offset, size, (char*)buffer);
-    if( 0 != rc ) {
-        ERR("Failed reading offset 0x%04x rc=%d\n", offset, rc);
-    }
-    return rc;
-}
-
diff --git a/debug-tools/lib/FlashAcss/SparrowGateway.h b/debug-tools/lib/FlashAcss/SparrowGateway.h
deleted file mode 100644
index 1d293ba..0000000
--- a/debug-tools/lib/FlashAcss/SparrowGateway.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-#include "flashacss.h"
-
-class SparrowGateway : public flash_gateway
-{
-public:
-    SparrowGateway(const char *device_name);
-    SparrowGateway(void* flashHandle);
-    virtual ~SparrowGateway(void);
-    virtual int runCommand(UCHAR flash_cmd, FLASH_PHASE phase, bool bWrite, DWORD addr, DWORD ulSize);
-    virtual int setData(const BYTE *buffer, DWORD size);
-    virtual int getData(BYTE *buffer, DWORD size);
-    virtual int wait_done (void) const;
-    virtual int boot_done(void) const;
-    virtual bool get_lock ();
-    virtual int force_lock ();
-    virtual int release_lock();
-
-private:
-
-    int setAddr(DWORD addr);
-//    void setSize(DWORD size);
-    int setCommand(UCHAR cmd, FLASH_PHASE phase, bool bWrite);
-
-    int wb(u_int32_t offset, DWORD size, const BYTE *buffer);
-    int rb(u_int32_t offset, DWORD size, const BYTE *buffer);
-    int r(u_int32_t offset, DWORD & val) const;
-    int w(u_int32_t offset, DWORD val) const;
-    int execute_cmd() const;
-
-    bool m_got_lock;
-
-    enum constants{
-        CR_USER                 = 0x880000,
-#ifndef MARLON_B0
-        CR_FLASH_DATA           = CR_USER + 0xA8,
-        CR_FLASH_ADDR           = CR_USER + 0x1B0,
-        CR_FLASH_OPCODE         = CR_USER + 0x1AC,
-        CR_FLASH_STAT_CTL       = CR_USER + 0x1A8,
-#else
-        CR_FLASH_DATA           = CR_USER + 0x5C,
-        CR_FLASH_ADDR           = CR_USER + 0x164,
-        CR_FLASH_OPCODE         = CR_USER + 0x160,
-        CR_FLASH_STAT_CTL       = CR_USER + 0x15C,
-#endif // MARLON_B0
-
-        // CR_FLASH_OPCODE
-        BIT_OFFSET_INST         = 16,
-        BIT_SIZE_INST           = 8,
-        BIT_OFFSET_ADDR_PHASE   = 24,
-        BIT_OFFSET_DATA_PHASE   = 25,
-        BIT_OFFSET_WRITE_OP     = 31,
-
-        BIT_FLASH_STATUS_OFFSET = 0,
-        BIT_FLASH_STATUS_SIZE   = 8,
-        BIT_OFFSET_BUSY         = 29,
-        BIT_GO                  = 30,
-        BIT_LOCK                = 31,
-    };
-
-};
diff --git a/debug-tools/lib/FlashAcss/flash.cpp b/debug-tools/lib/FlashAcss/flash.cpp
deleted file mode 100644
index c818402..0000000
--- a/debug-tools/lib/FlashAcss/flash.cpp
+++ /dev/null
@@ -1,870 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "flash.h"
-#include "wlct_os.h"
-
-bool g_debug = false;
-
-void flash_base::set_exit_flag(bool bExit)
-{
-    m_bExit = bExit;
-}
-
-flash::flash(DType device_type)
-    :flash_base(device_type)
-{
-	m_pDeviceAccss = NULL;
-	m_pFlashAccss = NULL;
-	if (device_type == MST_SPARROW)
-		m_size = FLASH_SIZE_SPARROW;
-	if (device_type == MST_MARLON)
-		m_size = FLASH_SIZE_MARLON;
-	if (device_type == MST_TALYN)
-		m_size = FLASH_SIZE_TALYN;
-	m_hw_read_chunk_size = 256;
-	m_hw_write_chunk_size = 256;
-	m_page_erased = new bool [m_size / FLASH_PAGE_SIZE];
-
-        if (!m_page_erased)
-        { 
-            ERR("Cannot allocate page_erased buffer of size %d\n", m_size / FLASH_PAGE_SIZE);
-            exit(1);
-        }
-
-        memset(m_page_erased, 0, m_size / FLASH_PAGE_SIZE);
-
-	m_buffer = NULL;
-	update_erased_flash(false);
-
-    flag_reading_not_done = false;
-    m_address = 0;
-    m_length = 0;
-}
-
-flash::~flash(void)
-{
-    if (m_pFlashAccss != NULL)
-    {
-        wfa_release_lock(m_pFlashAccss);
-        close ();
-    }
-
-    free_buffer();
-
-    delete[] m_page_erased;
-}
-
-void flash::free_buffer ()
-{
-    if (m_buffer != NULL)
-    {
-        delete [] m_buffer;
-    }
-}
-
-#ifdef _WINDOWS
-void readThread(void* pFlashDevice)
-#else
-    void *readThread(void* pFlashDevice)
-#endif
-{
-    flash *pFlash = (flash*)pFlashDevice;
-    pFlash->set_flag_reading_not_done(true);
-
-    u_int32_t address = pFlash->get_address();
-    u_int32_t length = pFlash->get_length();
-    BYTE* buffer = (BYTE*)pFlash->get_buffer_ptr();
-
-    pFlash->read( address , length , buffer);
-
-    pFlash->set_flag_reading_not_done(false);
-#ifndef _WINDOWS
-    return NULL;
-#endif
-}
-
-int flash::read_async( const u_int32_t address, const u_int32_t length )
-{
-    if (flag_reading_not_done)
-    {
-        return BUFFER_NOT_READY;
-    }
-
-    m_address = address;
-    m_length = length;
-
-    free_buffer(); //free memory if already allocated before
-    m_buffer = new BYTE[length];
-
-#ifdef _WINDOWS
-    m_thread = (HANDLE)_beginthread(readThread, 0 , this);
-#else
-    if (0 != pthread_create(&m_thread, NULL, readThread, this))
-    {
-        ERR("Failed to create Read thread\n");
-        free_buffer();
-        return BUFFER_NOT_READY;
-    }
-#endif
-
-    return BUFFER_OK;
-}
-
-int flash::open (const char *device_name, DType dtype, bool ignore_lock)
-{
-    int res = 0;
-    res =  CreateDeviceAccessHandler( device_name, dtype, &m_pDeviceAccss);
-    if (res != 0)
-        return res;
-    deviceType = dtype;
-    res =  wfa_create_flash_access_handler(dtype, m_pDeviceAccss, &m_pFlashAccss);
-    if (res != 0)
-        return res;
-
-    res = wfa_boot_done(m_pFlashAccss);
-    if (res != 0)
-        return res;
-
-    if (ignore_lock) {
-        res = wfa_force_lock(m_pFlashAccss);
-    } else {
-        if (wfa_get_lock(m_pFlashAccss) == false) {
-            ERR("Failed getting Flash lock."
-                "Use -ignore_lock option to ignore locking mechanism\n");
-            return (-1);
-        }
-    }
-
-    res = retrive_info();
-    return res;
-}
-
-int flash::open (void *m_pDeviceAccss, DType dtype, bool ignore_lock)
-{
-    int res = 0;
-    if (m_pDeviceAccss == NULL)
-        return -1;
-    deviceType = dtype;
-    res =  wfa_create_flash_access_handler(dtype, m_pDeviceAccss, &m_pFlashAccss);
-    if (res != 0)
-        return res;
-
-    res = wfa_boot_done(m_pFlashAccss);
-    if (res != 0)
-        return res;
-
-    if (ignore_lock) {
-        res = wfa_force_lock(m_pFlashAccss);
-    } else {
-        if (wfa_get_lock(m_pFlashAccss) == false) {
-            ERR("Failed getting Flash lock."
-                "Use -ignore_lock option to ignore locking mechanism\n");
-            return (-1);
-        }
-    }
-
-    res = retrive_info();
-    return res;
-}
-
-void flash::close ()
-{
-    if (m_pFlashAccss)
-    {
-        wfa_close_flash_access_handler(m_pFlashAccss);
-        m_pFlashAccss = NULL;
-    }
-    int res = CloseDeviceAccessHandler(m_pDeviceAccss);
-
-    WLCT_UNREFERENCED_PARAM(res);
-    if (g_debug ) DBG("Closed device\n");
-}
-
-int flash::retrive_info()
-{
-    int res = 0;
-    res = wfa_run_command(m_pFlashAccss, FC_RDID, INSTRUCTION_DATA_PHASE, false, 0, 20);
-    if (res != 0)
-    {
-#ifdef _WINDOWS /* TODO: Handle error in linux */
-        // 1 - OK
-        // 2 = cancel
-        //int mb = MessageBox(NULL, L"Failed access to flash.\nPress OK to continue or\nCancel to abort.", L"Error", MB_OKCANCEL );
-        //if (mb == 2)
-        {
-            return res;
-        }
-        //res = 0;
-#endif
-    }
-
-    memset((void*)&m_info, 0, sizeof(m_info));
-    res = wfa_get_data(m_pFlashAccss,(BYTE*)&m_info, sizeof(m_info) - 4);
-    if (res != 0)
-        return 0;
-
-    INFO ("Flash Manufactured by ");
-    switch (m_info.manufacturer_id)
-    {
-    case 0x20:
-    {
-        INFO("Numonyx ");
-        switch (m_info.device_id1)
-        {
-        case 0x80 :
-        {
-            INFO("M25PE ");
-            break;
-        }
-        case 0x20 :
-        {
-            INFO("M25P ");
-            break;
-        }
-        default : INFO("Unknown device ID ");
-        }
-
-        switch (m_info.device_id2)
-        {
-        case 0x11 :
-        {
-            INFO("Capacity of 1Mbits ");
-            break;
-        }
-        case 0x12 :
-        {
-            INFO("Capacity of 2Mbits ");
-            break;
-        }
-        case 0x14 :
-        {
-            INFO("Capacity of 8Mbits ");
-            break;
-        }
-        default : INFO("Unknown capacity ");
-        }
-
-        break;
-    }
-
-    case 0xC2:
-    {
-        INFO("Macronix ");
-        switch (m_info.device_id1)
-        {
-        case 0x20 :
-        {
-            INFO("MX25L8006E ");
-            break;
-        }
-        default : INFO("Unknown device ID ");
-        }
-
-        switch (m_info.device_id2)
-        {
-        case 0x11 :
-        {
-            INFO("Capacity of 1Mbits ");
-            break;
-        }
-        case 0x12 :
-        {
-            INFO("Capacity of 2Mbits ");
-            break;
-        }
-        case 0x13 :
-        {
-            INFO("Capacity of 4Mbits ");
-            break;
-        }
-        case 0x14 :
-        {
-            INFO("Capacity of 8Mbits ");
-            break;
-        }
-        default : INFO("Unknown capacity ");
-        }
-
-        break;
-    }
-
-    case 0x1F:
-    {
-        INFO("Atmel ");
-        switch (m_info.device_id1)
-        {
-        case 0x43 :
-        {
-            INFO("AT25DF021 ");
-            break;
-        }
-        default : INFO("Unknown device ID ");
-        }
-        break;
-    }
-    default:
-    {
-        INFO("Unknown manufacturer");
-    }
-    }
-
-    //if (m_info.extended_string_length != 0) {
-    //INFO("Extended INFO %s ", m_info.extended_string);
-    //}
-    INFO("\n --------------------------- \n");
-    return res;
-}
-
-
-int flash::read( const u_int32_t address, const u_int32_t length, BYTE *buffer ) const
-{
-    int res = 0;
-    if (address & 0x1) {
-        ERR("address 0x%04x is not word aligned\n",address);
-        return -1;
-    }
-
-    if (length & 0x1) {
-        ERR("length 0x%04x is not word aligned\n",length);
-        return -1;
-    }
-    if (address + length > this->m_size) {
-        ERR("address 0x%04x + length 0x%04x exceeds flash size of 0x%04x\n",address,length,this->m_size);
-        //return -1;
-    }
-
-    u_int32_t offset = 0;
-    while (!m_bExit && offset < length )
-    {
-        u_int16_t current_size = FLASH_PAGE_SIZE - ((address + offset) & 0xff); // Part of a page
-        if (current_size > length ) {
-            current_size = (u_int16_t)length;
-        }
-
-        if (offset + current_size > length ) {
-            current_size = (u_int16_t)(length - offset);
-        }
-        //while ( offset < length ) {
-        //   if( m_bExit ) {
-        //      reruen(-1);
-        //   }
-
-        //   u_int32_t curr_length = min(m_hw_read_chunk_size, length - offset);
-        u_int32_t curr_address = address + offset;
-        if (g_debug) DBG("Reading 0x%04x bytes from address 0x%04x\n", current_size, curr_address);
-
-        res = wfa_run_command(m_pFlashAccss, FC_READ, INSTRUCTION_ADDRESS_DATA_PHASE, false, curr_address, current_size);
-        if (res != 0)
-            break;
-        res = wfa_get_data(m_pFlashAccss,buffer + offset, current_size);
-        if (res != 0)
-            break;
-        offset += current_size;
-    }
-    return res;
-}
-
-int flash::write( const u_int32_t address, const u_int32_t length, const BYTE *buffer, bool verify )
-{
-
-    //unused param
-    (void)verify;
-    int res = -1;
-
-    res = write_wen();
-    if (res != 0)
-        return res;
-
-    u_int32_t offset = 0;
-    while (!m_bExit && offset < length )
-    {
-        u_int16_t current_size = FLASH_PAGE_SIZE - ((address + offset) & 0xff); // Part of a page
-        if (current_size > length ) {
-            current_size = (u_int16_t)length;
-        }
-
-        if (offset + current_size > length ) {
-            current_size = (u_int16_t)(length - offset);
-        }
-
-        //   u_int32_t curr_length = min(m_hw_read_chunk_size, length - offset);
-        u_int32_t curr_address = address + offset;
-        if (g_debug) DBG("Reading 0x%04x bytes from address 0x%04x\n", current_size, curr_address);
-
-        res = wfa_set_data(m_pFlashAccss,buffer + offset, current_size);
-        if (res != 0)
-            break;
-        res = wfa_run_command(m_pFlashAccss, FC_PW, INSTRUCTION_ADDRESS_DATA_PHASE, true, curr_address, current_size);
-        if (res != 0)
-            break;
-        offset += current_size;
-    }
-    return res;
-}
-
-int flash::program( const u_int32_t address, const u_int32_t length, const BYTE *buffer, bool verify )
-{
-    int res = -1;
-
-    //    u_int8_t type = m_erased ? FC_PP : FC_PW;
-    //    u_int8_t type = FC_PW;
-    u_int8_t type = FC_PP;
-
-    if (address & 0x1) {
-        ERR("address 0x%04x is not word aligned\n",address);
-        return -1;
-    }
-
-    if (length & 0x1) {
-        ERR("length 0x%04x is not word aligned\n",length);
-        return -1;
-    }
-    if (address + length > this->m_size) {
-        ERR("address 0x%04x + length 0x%04x exceeds flash size of 0x%04x\n",address,length,this->m_size);
-        return -1;
-    }
-
-    u_int32_t offset = 0;
-    BYTE *verify_buffer = new BYTE[FLASH_PAGE_SIZE];
-    if (!verify_buffer) {
-        ERR("Cannot allocate verify buffer\n");
-        return -1;
-    }
-
-    u_int32_t loop = 0;
-    bool dbg_verify = false;
-    while (!m_bExit && offset < length )
-    {
-        loop++;
-        if (loop%50 == 0 || loop < 10)
-            dbg_verify = true;
-        else
-            dbg_verify = false;
-
-        u_int16_t current_size = FLASH_PAGE_SIZE - ((address + offset) & 0xff); // Part of a page
-        if (current_size > length ) {
-            current_size = (u_int16_t)length;
-        }
-
-        if (offset + current_size > length ) {
-            current_size = (u_int16_t)(length - offset);
-        }
-
-        if (type == FC_PP) {
-            bool all_ff = true;
-            for (u_int32_t i = 0; i < current_size ; i+=2) {
-                if ( (*(u_int16_t*)(buffer + offset + i)) != (u_int16_t)(-1) ) {
-                    all_ff = false;
-                    break;
-                }
-            }
-
-            if (all_ff) {
-                if (g_debug) {
-                    DBG(" - skipped empty page 0x%04x - ", address+offset);
-                } else {
-                    INFO("\rSkip   - ");
-                }
-                offset += current_size;
-                INFO("%03.2f%%", (float)offset / (float)length * 100);
-                if (g_debug) DBG("\n");
-                continue;
-            }
-        }
-
-        INFO("\rWrite  - ");
-        res = page_write_program(address+offset, current_size, &buffer[offset], type);
-        if (res != 0)
-            break;
-
-        if (verify || dbg_verify) {
-            INFO("\rRead   - ");
-            res = read(address+offset, current_size, verify_buffer);
-            if (res != 0)
-                break;
-            INFO("\rVerify - ");
-            if( memcmp(&buffer[offset], verify_buffer, current_size) != 0 ) {
-                ERR("Data verification failed on address 0x%04x length 0x%03x\n", address+offset, current_size);
-                res = -1;
-                break;
-            }
-        }
-
-        offset += current_size;
-        INFO("%03.2f%%", (float)offset / (float)length * 100);
-        if (g_debug) DBG("\n");
-    }
-    delete[] verify_buffer;
-    printf("\n");
-    return res;
-}
-
-int flash::page_write_program( const u_int32_t address, const u_int16_t length, const BYTE *buffer, u_int8_t type )
-{
-    int res = 0;
-    if( m_bExit ) {
-        return (-1);
-    }
-
-    if (type == FC_PP) {
-        if ( !is_erased(address) ) {
-            res = sub_sector_erase( address );
-//            sector_erase( address );
-        }
-        if (g_debug) DBG("Programing page address 0x%04x length 0x%03x\n", address, length);
-    }
-    else {
-        if (g_debug) DBG("Writing page address 0x%04x length 0x%03x\n", address, length);
-    }
-
-    res = write_wen();
-    if (res != 0)
-        return res;
-    res = wfa_set_data(m_pFlashAccss, buffer, length);
-    if (res != 0)
-        return res;
-    res = wfa_run_command(m_pFlashAccss, type, INSTRUCTION_ADDRESS_DATA_PHASE, true, address, length);
-    if (res != 0)
-        return res;
-
-    res = wait_wip();
-    return res;
-}
-
-int flash::write_wen (void) const
-{
-    int res = 0;
-//    execute_cmd(0x0106);
-    res = wfa_run_command(m_pFlashAccss, FC_WREN, INSTRUCTION_PHASE, true, 0, 0);
-    return res;
-}
-
-int flash::erase (void)
-{
-    int res = 0;
-    res = wfa_boot_done(m_pFlashAccss);
-    if (res != 0)
-        return res;
-    res = write_wen();
-    if (res != 0)
-        return res;
-
-    //erase
-    res = wfa_run_command(m_pFlashAccss, FC_BE, INSTRUCTION_PHASE, true, 0, 0);
-    if (res != 0)
-        return res;
-
-    res = wait_wip();
-    if (res != 0)
-        return res;
-    update_erased_flash( true );
-    return res;
-}
-
-int flash::page_erase(u_int32_t address)
-{
-    int res = 0;
-    write_wen();
-    if (res != 0)
-        return res;
-
-    res = wfa_run_command(m_pFlashAccss, FC_PE, INSTRUCTION_ADDRESS_PHASE, true, address, 0);
-    if (res != 0)
-        return res;
-    res = wait_wip();
-    if (res != 0)
-        return res;
-    if (g_debug) DBG("Cmd is 0x%04x, Status is 0x%04x\n",FC_PE, get_status() );
-    if (g_debug) DBG("Erased page address 0x%04x\n", address);
-    update_erased_page(address, true);
-    return res;
-}
-
-int flash::sector_erase(u_int32_t address)
-{
-    int res = 0;
-    res = write_wen();
-    if (res != 0)
-        return res;
-
-    res = wfa_run_command(m_pFlashAccss, FC_SE, INSTRUCTION_ADDRESS_PHASE, true, address, 0);
-    if (res != 0)
-        return res;
-    res = wait_wip();
-    if (res != 0)
-        return res;
-    if (g_debug) DBG("Cmd is 0x%04x, Status is 0x%04x\n",FC_SE, get_status() );
-    if (g_debug) DBG("Erased sector address 0x%04x\n", address);
-    update_erased_sector(address, true);
-    return res;
-}
-
-int flash::sub_sector_erase(u_int32_t address)
-{
-    int res = 0;
-    printf("Erasing sub_sector %d\n", address / SUB_SECTOR_SIZE);
-    res = write_wen();
-    if (res != 0)
-        return res;
-
-    res = wfa_run_command(m_pFlashAccss, FC_SSE, INSTRUCTION_ADDRESS_PHASE, true, address, 0);
-    if (res != 0)
-        return res;
-    res = wait_wip();
-    if (res != 0)
-        return res;
-    if (g_debug) DBG("Cmd is 0x%04x, Status is 0x%04x\n",FC_SSE, get_status() );
-    if (g_debug) {
-        DBG(" - Erased sub_sector address 0x%04x - ", address);
-    } else {
-        INFO("\rErase  - ");
-    }
-    update_erased_sub_sector(address, true);
-    return res;
-}
-
-u_int8_t flash::get_status() const
-{
-    int res = 0;
-    res = wfa_run_command(m_pFlashAccss, FC_RDSR, INSTRUCTION_DATA_PHASE, false, 0, 1);
-
-    u_int32_t value;
-    unsigned long size = sizeof(u_int32_t);
-    res = wfa_get_data(m_pFlashAccss, (BYTE*)&value, size);
-
-    WLCT_UNREFERENCED_PARAM(res);
-    return (u_int8_t)value;
-}
-
-int flash::wait_wip (void) const
-{
-    int res = 0;
-    u_int16_t value;
-    u_int32_t timeout = 0;
-    WLCT_UNREFERENCED_PARAM(res);
-
-    do {
-        value = get_status();
-        if (EXTRACT(value, 0, 1) == 0) {
-            if (EXTRACT(value, 1, 1) == 1 ) {
-                ERR("WIP bit is 0 but WEL bit is 1. Status = 0x%04x\n", value);
-                return (-1);
-            }
-            return 0;
-        }
-        timeout++;
-    } while (timeout <= 1000000 );
-
-    ERR("wait_wip:: timeout reached\n");
-    return -1;
-}
-
-void flash::update_erased_page (u_int32_t offset, bool erased )
-{
-    m_page_erased[offset/FLASH_PAGE_SIZE] = erased;
-}
-
-void flash::update_erased_sub_sector (u_int32_t offset, bool erased )
-{
-    u_int32_t page_offset = offset / SUB_SECTOR_SIZE * SUB_SECTOR_SIZE;
-    for (u_int32_t i =0; i < PAGES_PER_SUB_SECTOR; i++) {
-        update_erased_page( page_offset + i * FLASH_PAGE_SIZE, erased );
-    }
-}
-
-void flash::update_erased_sector (u_int32_t offset, bool erased )
-{
-    u_int32_t page_offset = offset / SECTOR_SIZE * SECTOR_SIZE;
-    for (u_int32_t i =0; i < SUB_SECTORS_PER_SECTOR; i++) {
-        update_erased_sub_sector( page_offset + i * SUB_SECTOR_SIZE, erased );
-    }
-}
-
-void flash::update_erased_flash (bool erased )
-{
-    for (u_int32_t i =0; i < SECTORS_PER_FLASH; i++) {
-        update_erased_sector( i * SECTOR_SIZE, erased );
-    }
-}
-
-bool flash::is_erased( u_int32_t page_offset ) const{
-    u_int32_t page_index = page_offset/FLASH_PAGE_SIZE;
-    bool erased = m_page_erased[page_index];
-    return erased;
-}
-
-void flash::clear_erased( u_int32_t page_offset ) {
-    u_int32_t page_index = page_offset/FLASH_PAGE_SIZE;
-    m_page_erased[page_index] = false;
-}
-
-int flash_file::open (const char *device_name, DType dtype, bool ignore_lock = true)
-{
-    //unused param
-    (void)ignore_lock;
-
-//    m_device_name = device_name;
-    m_handler = fopen( device_name, "rb+");
-    m_buffer = new char [m_size];
-    if (!m_buffer) {
-        ERR("Cannot allocate a buffer of size %u\n", m_size);
-        return (-1);
-    }
-
-    if (0 == m_handler) { // File doesn't exist
-        if (g_debug) DBG("file %s type %d does not exist. Creating...\n", device_name, dtype);
-        m_handler = fopen( device_name, "wb");
-        if (0 == m_handler) {
-            ERR("Failed creating file %s type %d\n", device_name, dtype);
-            return (-1);
-        }
-        memset(m_buffer, 0, m_size);
-    } else {
-        int res = fread(m_buffer, 1, m_size, (FILE*)m_handler);
-        if( (u_int32_t)res != m_size ) {
-            ERR("Expected %d bytes and read %d bytes\n", m_size, res);
-            return (-1);
-        }
-        rewind((FILE*)m_handler);
-        //res = fclose((FILE*)m_handler);
-        //if (0 != res) {
-        //   ERR("Failed closing file\n");
-        //   return (-1);
-        //}
-        if (g_debug) DBG("Opened file %s type %d\n", device_name, dtype);
-    }
-    return 0;
-}
-
-void flash_file::close ()
-{
-    //m_handler = fopen( this->m_device_name.c_str(), "w");
-    //if (0 == m_handler) {
-    //   ERR("Failed opening file for writing\n");
-    //   return (-1);
-    //}
-
-
-    int res = fwrite(m_buffer, 1, m_size, (FILE*)m_handler);
-    if( (u_int32_t)res != m_size ) {
-        ERR("Expected %d bytes and wrote %d bytes\n", m_size, res);
-        return;
-    }
-
-    res = fclose((FILE*)m_handler);
-
-    if (0 != res) {
-        ERR("Failed closing device\n");
-        return;
-    }
-
-    if (g_debug ) DBG("Closed device\n");
-}
-
-int flash_file::erase (void)
-{
-    memset(m_buffer, 0xff, m_size);
-    this->update_erased_flash( true );
-    return 0;
-}
-
-flash_file::flash_file(DType device_type)
-    :flash(device_type)
-{
-    m_buffer = 0;
-}
-
-flash_file::~flash_file(void)
-{
-    if (0 != m_handler) {
-        close ();
-        m_handler = 0;
-    }
-    if (0 != m_buffer) {
-        delete m_buffer;
-        m_buffer = 0;
-    }
-}
-
-int flash_file::page_write_program( const u_int32_t address, const u_int16_t length, const BYTE *buffer, u_int8_t type )
-{
-    if( m_bExit ) {
-        return(-1);
-    }
-
-    if (type == FC_PP) {
-        if ( !this->is_erased(address) ) {
-            sub_sector_erase( address );
-            //         sector_erase( address );
-        }
-        if (g_debug) DBG("Programing page address 0x%04x length 0x%03x\n", address, length);
-    }
-    else {
-        if (g_debug) DBG("Writing page address 0x%04x length 0x%03x\n", address, length);
-    }
-
-    memcpy(m_buffer+address, buffer, length);
-    return 0;
-}
-
-int flash_file::sub_sector_erase(u_int32_t address)
-{
-    printf("Erasing sub_sector %d\n", address / SUB_SECTOR_SIZE);
-
-    memset(m_buffer+address, 0xff, SUB_SECTOR_SIZE);
-    if (g_debug) {
-        DBG(" - Erased sub_sector address 0x%04x - ", address);
-    } else {
-        INFO("\rErase  - ");
-    }
-    this->update_erased_sub_sector(address, true);
-    return 0;
-}
-
-int flash_file::read( const u_int32_t address, const u_int32_t length, BYTE *buffer ) const
-{
-    if (address & 0x1) {
-        ERR("address 0x%04x is not word aligned\n",address);
-        return(-1);
-    }
-
-    if (length & 0x1) {
-        ERR("length 0x%04x is not word aligned\n",length);
-        return(-1);
-    }
-
-    if (address + length > this->m_size) {
-        ERR("address 0x%04x + length 0x%04x exceeds flash size of 0x%04x\n",address,length,this->m_size);
-        return(-1);
-    }
-
-    memcpy(buffer, m_buffer+address, length);
-    return 0;
-}
diff --git a/debug-tools/lib/FlashAcss/flash.h b/debug-tools/lib/FlashAcss/flash.h
deleted file mode 100644
index d29050a..0000000
--- a/debug-tools/lib/FlashAcss/flash.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <string>
-#include "WlctPciAcss.h"
-#include "flashacss.h"
-
-#ifdef _WINDOWS
-#ifdef FLSHACSS_EXPORTS
-#define FLSHACSS_CPP_API __declspec(dllexport)
-#else
-#define FLSHACSS_CPP_API __declspec(dllimport)
-#endif
-#else //#ifdef _WINDOWS
-#define FLSHACSS_CPP_API
-#endif //#ifdef _WINDOWS
-
-#define BUFFER_NOT_READY -1
-#define BUFFER_OK 0
-
-extern "C"
-{
-    class FLSHACSS_CPP_API flash_base
-    {
-    public:
-	enum {
-            //FLASH_SIZE_SWIFT = 256*1024,
-            FLASH_SIZE_SPARROW = 1024*512,
-            //FLASH_SIZE_MARLON = 1024*1024,
-            FLASH_SIZE_MARLON = 1024*512,
-            FLASH_SIZE_TALYN = 1024*512*4
-	};
-	flash_base(DType device_type)
-        : m_bExit(false)
-        , deviceType(device_type)
-        , m_size(0)
-	{
-            if (device_type == MST_SPARROW)
-                m_size = FLASH_SIZE_SPARROW;
-            if (device_type == MST_MARLON)
-                m_size = FLASH_SIZE_MARLON;
-            if (device_type == MST_TALYN)
-                m_size = FLASH_SIZE_TALYN;
-            else
-                m_size = FLASH_SIZE_TALYN;
-	};
-	virtual ~flash_base(void) {};
-	virtual int open (const char *device_name, DType dtype, bool ignore_lock) = 0;
-	virtual int open (void *m_pDeviceAccss, DType dtype, bool ignore_lock) = 0;
-	virtual void close () = 0;
-	virtual int read( const u_int32_t address, const u_int32_t length, BYTE *buffer ) const = 0;
-	virtual int write( const u_int32_t address, const u_int32_t length, const BYTE *buffer, bool verify ) = 0;
-	virtual int program( const u_int32_t address, const u_int32_t length, const BYTE *buffer, bool verify ) = 0;
-	virtual int erase (void) = 0;
-	virtual void clear_erased( u_int32_t page_offset ) = 0;
-
-        void set_exit_flag(bool bExit);
-        DType GetDeviceType()
-        {
-            return deviceType;
-        }
-
-    protected:
-        bool m_bExit;
-        DType deviceType;
-        u_int32_t m_size;
-    };
-
-    class FLSHACSS_CPP_API flash: public flash_base
-    {
-    public:
-        flash(DType device_type);
-        virtual ~flash(void);
-        virtual int open (const char *device_name, DType dtype, bool ignore_lock);
-        virtual int open (void *m_pDeviceAccss, DType dtype, bool ignore_lock);
-        virtual void close ();
-        virtual int read( const u_int32_t address, const u_int32_t length, BYTE *buffer ) const;
-        virtual int read_async( const u_int32_t address, const u_int32_t length);
-        int write( const u_int32_t address, const u_int32_t length, const BYTE *buffer, bool verify );
-        int program( const u_int32_t address, const u_int32_t length, const BYTE *buffer, bool verify );
-        virtual int erase (void);
-        bool get_flag_reading_not_done () {return flag_reading_not_done; };
-        void set_flag_reading_not_done (bool new_val) {flag_reading_not_done = new_val;};
-        void* get_buffer_ptr () {return m_buffer; };
-        void free_buffer ();
-
-        u_int32_t get_address () {return m_address; };
-        u_int32_t get_length () {return m_length; };
-
-
-    public:
-        enum {
-            FLASH_PAGE_SIZE = 256,
-            PAGES_PER_SUB_SECTOR = 16,
-            SUB_SECTOR_SIZE = PAGES_PER_SUB_SECTOR * FLASH_PAGE_SIZE,
-            SUB_SECTORS_PER_SECTOR = 16,
-            SECTOR_SIZE = SUB_SECTORS_PER_SECTOR * SUB_SECTOR_SIZE,
-#ifdef FLASH_256KB
-            SECTORS_PER_FLASH = 4, // support 1MB flash
-#else
-            //SECTORS_PER_FLASH = 16, // support 1MB flash
-            SECTORS_PER_FLASH = 8, // support 0.5MB flash
-#endif
-        };
-
-    public:
-        struct {
-            BYTE manufacturer_id;
-            BYTE device_id1;
-            BYTE device_id2;
-            BYTE extended_string_length;
-            char extended_string [256]; // maximal size
-        } m_info; // according to JEDEC standard
-
-    protected:
-        int page_erase(u_int32_t offset);
-        int sector_erase(u_int32_t address);
-        virtual int sub_sector_erase(u_int32_t address);
-        virtual int page_write_program( const u_int32_t address, const u_int16_t length, const BYTE *buffer, u_int8_t type );
-        int wait_wip (void) const;
-        int write_wen (void) const;
-        u_int8_t get_status(void) const;
-        void update_erased_page (u_int32_t offset, bool erased );
-        void update_erased_sub_sector (u_int32_t offset, bool erased );
-        void update_erased_sector (u_int32_t offset, bool erased );
-        void update_erased_flash ( bool erased );
-        bool is_erased( u_int32_t page_offset ) const;
-        void clear_erased( u_int32_t page_offset );
-        int retrive_info();
-
-    protected:
-        bool *m_page_erased;
-        u_int32_t m_hw_read_chunk_size;
-        u_int32_t m_hw_write_chunk_size;
-
-#if _WINDOWS
-        HANDLE m_thread;
-#else
-        pthread_t m_thread;
-#endif
-
-    protected:
-//    string m_device_name;
-
-    protected:
-        enum FlashCommand {
-            FC_WREN         = 0x06,
-            FC_WRDI         = 0x04,
-            FC_RDID         = 0x9F,
-            FC_RDSR         = 0x05,
-            FC_WRLR         = 0xE5,
-            FC_WRSR         = 0x01,
-            FC_RDLR         = 0xE8,
-            FC_READ         = 0x03,
-            FC_FAST_READ    = 0x0B,
-            FC_PW           = 0x0A,
-            FC_PP           = 0x02,
-            FC_PE           = 0xDB,
-            FC_SSE          = 0x20,
-            FC_SE           = 0xD8,
-            FC_BE           = 0xC7,
-            FC_DP           = 0xB9,
-            FC_RDP          = 0xAB
-        };
-    private:
-//    flash_gateway* m_flash_gateway;
-        void* m_pDeviceAccss;
-        void* m_pFlashAccss;
-
-        bool flag_reading_not_done;
-        u_int32_t m_address;
-        u_int32_t m_length;
-        BYTE* m_buffer;
-    };
-
-
-    class FLSHACSS_CPP_API flash_file: public flash
-    {
-    public:
-        flash_file(DType device_type);
-        ~flash_file(void);
-        virtual int read( const u_int32_t address, const u_int32_t length, BYTE *buffer ) const;
-        virtual int erase ();
-        virtual int open (const char *device_name, DType dtype, bool ignore_lock);
-        virtual int open (void *m_pDeviceAccss, DType dtype, bool ignore_lock)
-        {
-            //do something with params
-            (void)m_pDeviceAccss;
-            (void)dtype;
-            (void)ignore_lock;
-            return -1;
-        }
-        virtual void close ();
-
-    private:
-        virtual int page_write_program( const u_int32_t address, const u_int16_t length, const BYTE *buffer, u_int8_t type );
-        virtual int sub_sector_erase(u_int32_t address);
-    private:
-        mutable char *m_buffer;
-        void *m_handler;
-    };
-};
diff --git a/debug-tools/lib/FlashAcss/flash_gateway.h b/debug-tools/lib/FlashAcss/flash_gateway.h
deleted file mode 100644
index ee86d7a..0000000
--- a/debug-tools/lib/FlashAcss/flash_gateway.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-#include "flashacss.h"
-#include "WlctPciAcss.h"
-
-//using namespace std;
-
-#define ONES16(size)                    ((size)?(0xffff>>(16-(size))):0)
-#define MASK16(offset,size)             (ONES16(size)<<(offset))
-
-#define EXTRACT_C(source,offset,size)   ((((unsigned)(source))>>(offset)) & ONES16(size))
-#define EXTRACT(src,start,len)          (((len)==16)?(src):EXTRACT_C(src,start,len))
-
-#define MERGE_C(rsrc1,rsrc2,start,len)  ((((rsrc2)<<(start)) & (MASK16((start),(len)))) | ((rsrc1) & (~MASK16((start),(len)))))
-#define MERGE(rsrc1,rsrc2,start,len)    (((len)==16)?(rsrc2):MERGE_C(rsrc1,rsrc2,start,len))
-
-typedef enum _FlashGatewayType
-{
-    FPT_SPARROW,
-    FPT_MARLON
-
-}FlashGatewayType;
-
-typedef enum _FLASH_PHASE
-{
-    INSTRUCTION_PHASE                = 0,
-    INSTRUCTION_ADDRESS_PHASE        = 1,
-    INSTRUCTION_DATA_PHASE           = 2,
-    INSTRUCTION_ADDRESS_DATA_PHASE   = 3
-}FLASH_PHASE;
-
-class flash_gateway
-{
-protected:
-
-public:
-    flash_gateway(const char *device_name);
-    flash_gateway(void* flashHandle);
-    flash_gateway(){}
-    virtual ~flash_gateway(){};
-    virtual int runCommand(UCHAR flash_cmd, FLASH_PHASE phase, bool bWrite, DWORD addr, DWORD ulSize) = 0;
-    virtual int setData(const BYTE *buffer, DWORD size) = 0;
-    virtual int getData(BYTE *buffer, DWORD size) = 0;
-    virtual int wait_done (void) const = 0;
-    virtual int boot_done(void) const = 0;
-    virtual bool get_lock () = 0;
-    virtual int force_lock () = 0;
-    virtual int release_lock() = 0;
-
-protected:
-    void *m_handler;
-};
diff --git a/debug-tools/lib/FlashAcss/flashacss.h b/debug-tools/lib/FlashAcss/flashacss.h
deleted file mode 100644
index f56f290..0000000
--- a/debug-tools/lib/FlashAcss/flashacss.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "flash_gateway.h"
-
-#define ERR printf
-#define DBG printf
-#define INFO printf
-//#define _EXIT_(val) {exit (val);}
-
-extern bool g_debug;
-
-
-typedef struct _FLSH_ACCSS_DLL_VERSION
-{
-    int major;
-    int minor;
-    int maintenance;
-    int build;
-    char fullFilePath[256];
-
-}FLSH_ACCSS_DLL_VERSION;
-
-
-// The following ifdef block is the standard way of creating macros which make exporting
-// from a DLL simpler. All files within this DLL are compiled with the WLCTPCIACSS_EXPORTS
-// symbol defined on the command line. this symbol should not be defined on any project
-// that uses this DLL. This way any other project whose source files include this file see
-// WLCTPCIACSS_API functions as being imported from a DLL, whereas this DLL sees symbols
-// defined with this macro as being exported.
-
-#ifdef _WINDOWS
-#ifdef FLSHACSS_EXPORTS
-#define FLSHACSS_API __declspec(dllexport)
-#else
-#define FLSHACSS_API __declspec(dllimport)
-#endif
-#endif   // _WINDOWS
-
-#if defined(__GNUC__)
-#if defined(__i386)
-#define FLSHACSS_API extern "C" __attribute__((cdecl))
-#else
-#define FLSHACSS_API extern "C"
-#endif
-#endif   // __GNUC__
-
-
-FLSHACSS_API int wfa_create_flash_access_handler(DType devType, void* pDeviceAccess, void** pFlashAccess);
-FLSHACSS_API int wfa_close_flash_access_handler(void* pFlashAccess);
-FLSHACSS_API int wfa_read(void* pFlashAccess, BYTE *buffer, unsigned long offset, unsigned long size);
-FLSHACSS_API int wfa_write(void* pFlashAccess, const BYTE *buffer, unsigned long offset, unsigned long size);
-FLSHACSS_API int wfa_program(void* pFlashAccess);
-FLSHACSS_API int wfa_erase(void* pFlashAccess);
-
-FLSHACSS_API int wfa_run_command(void* pFlashAccss, UCHAR flash_cmd, FLASH_PHASE phase, bool bWrite, unsigned long addr, unsigned long ulSize);
-FLSHACSS_API int wfa_set_data(void* pFlashAccss, const BYTE *buffer, unsigned long size);
-FLSHACSS_API int wfa_get_data(void* pFlashAccss, BYTE *buffer, unsigned long size);
-FLSHACSS_API int wfa_wait_done(void* pFlashAccss);
-FLSHACSS_API int wfa_boot_done(void* pFlashAccss);
-FLSHACSS_API bool wfa_get_lock(void* pFlashAccss);
-FLSHACSS_API int wfa_force_lock(void* pFlashAccss);
-FLSHACSS_API int wfa_release_lock(void* pFlashAccss);
-
diff --git a/debug-tools/lib/WlctPciAcss/Android.mk b/debug-tools/lib/WlctPciAcss/Android.mk
deleted file mode 100644
index 65b6c68..0000000
--- a/debug-tools/lib/WlctPciAcss/Android.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libwigig_pciaccess
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CPPFLAGS := -Wall -lpthread
-
-LOCAL_C_INCLUDES += \
-	$(LOCAL_PATH) \
-	$(LOCAL_PATH)/../inc \
-	$(LOCAL_PATH)/../inc/linux \
-	$(LOCAL_PATH)/../utils \
-	$(LOCAL_PATH)/../utils/linux \
-	$(LOCAL_PATH)/linux
-
-LOCAL_SRC_FILES := $(shell find $(LOCAL_PATH) -name '*.cpp' | sed s:^$(LOCAL_PATH)::g )
-
-LOCAL_SHARED_LIBRARIES := \
-	libwigig_utils \
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/debug-tools/lib/WlctPciAcss/DeviceAccess.h b/debug-tools/lib/WlctPciAcss/DeviceAccess.h
deleted file mode 100644
index eb312a4..0000000
--- a/debug-tools/lib/WlctPciAcss/DeviceAccess.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "wlct_os.h"
-#include "WlctPciAcss.h"
-#include "LoggerSupport.h"
-
-#define _DeviceTypeCOM		1
-#define _DeviceTypePCI		2
-#define _DeviceTypeJTAG	        3
-#define _DeviceTypeMEMORY	4
-
-#define MAX_DEVICE_NAME_LEN 256
-
-class IDeviceAccess
-{
-public:
-    typedef enum
-    {
-        ETypeUnknown = -1,			// Unknown
-        ETypeCOM	= _DeviceTypeCOM,
-        ETypePCI	= _DeviceTypePCI,
-        ETypeJTAG	= _DeviceTypeJTAG,
-        ETypeMEMORY	= _DeviceTypeMEMORY,
-    }
-    EType;
-
-    IDeviceAccess(const TCHAR* tchDeviceName, DType devType);
-    IDeviceAccess(){deviceType = MST_NONE;}
-    virtual ~IDeviceAccess(void){}
-    virtual int CloseDevice() = 0;
-    virtual int GetType() = 0;
-
-    virtual int r32(DWORD addr, DWORD & val) = 0;
-    virtual int w32(DWORD addr, DWORD val) = 0;
-
-    // read block
-    virtual int rb(DWORD addr, DWORD blockSize, char *arrBlock) = 0;
-    // write block
-    virtual int wb(DWORD addr, DWORD blockSize, const char *arrBlock) = 0;
-    // read repeat
-    virtual int rr(DWORD addr, DWORD num_repeat, DWORD *arrBlock) = 0;
-
-    virtual int getFwDbgMsg(FW_DBG_MSG** pMsg) = 0;
-    virtual int clearAllFwDbgMsg() = 0;
-    virtual int do_reset(BOOL bFirstTime = TRUE) = 0;
-    virtual int do_sw_reset() = 0;
-    virtual int do_interface_reset() = 0;
-
-    virtual int startSampling(
-        DWORD* pRegsArr,
-        DWORD regArrSize,
-        DWORD interval,
-        DWORD maxSampling,
-        DWORD transferMethod)
-    {
-        //do something with params
-        (void)pRegsArr;
-        (void)regArrSize;
-        (void)interval;
-        (void)maxSampling;
-        (void)transferMethod;
-
-        LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-        return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-    }
-    virtual int stopSampling()
-    {
-        LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-        return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-    }
-    virtual int getSamplingData(DWORD** pDataSamples)
-    {
-        //do something with params
-        (void)pDataSamples;
-        LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-        return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-    }
-    virtual int alloc_pmc(int num_of_descriptors, int size_of_descriptor)
-    {
-        //do something with params
-        (void)num_of_descriptors;
-        (void)size_of_descriptor;
-        LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-        return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-    }
-
-    bool isInitialized()
-    {
-        return bInitialized;
-    }
-    wlct_os_err_t GetLastError()
-    {
-        return lastError;
-    }
-    void SetLastError(wlct_os_err_t err)
-    {
-        lastError = err;
-    }
-    TCHAR* GetInterfaceName()
-    {
-        return szInterfaceName;
-    }
-    DType GetDeviceType()
-    {
-        return deviceType;
-    }
-    DEVICE_STEP GetDeviceStep()
-    {
-        return deviceStep;
-    }
-    void SetDeviceStep(DEVICE_STEP devStep)
-    {
-        deviceStep = devStep;
-    }
-
-    //virtual int alloc_pmc(){
-    //	return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-    //}
-protected:
-    bool bInitialized;
-    DType deviceType;
-    DEVICE_STEP deviceStep;
-    TCHAR szInterfaceName[MAX_DEVICE_NAME_LEN];
-    std::deque<FW_DBG_MSG*> m_dbgMsgsList;
-
-public:
-    // Sampling
-    DWORD	m_no_sampling_regs;
-    DWORD	m_interval;
-    DWORD	m_maxSampling;
-    DWORD*	m_pRegsArr;
-    DWORD	m_sampling_head;
-    DWORD	m_sampling_tail;
-    DWORD	m_loops;
-    DWORD	oneSamplingSize;
-    // cyclic buffer that hold the sampling
-    DWORD*	m_sampling_arr;
-    // I'm using this buffer for optimizations
-    // when getSamplingData will called, we will copy the data that was capture
-    // till now to this buffer.
-    // We do not need to allocate it each time and not release it.
-    DWORD*	m_get_sampling_arr;
-    DWORD	m_transferMethod; // 1-save to file 2-save to buffer
-
-    LONG m_flag_busy;
-    wlct_os_err_t lastError;
-};
-
-
diff --git a/debug-tools/lib/WlctPciAcss/IoctlDevXFace.h b/debug-tools/lib/WlctPciAcss/IoctlDevXFace.h
deleted file mode 100644
index ccc3f72..0000000
--- a/debug-tools/lib/WlctPciAcss/IoctlDevXFace.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "wlct_os.h"
-
-class IIoctlDev
-{
-public:
-    IIoctlDev(const TCHAR* tchDeviceName)
-    {
-        WLCT_ASSERT(tchDeviceName != NULL);
-        WLCT_ASSERT(sizeof(szInterfaceName) > _tcslen(tchDeviceName));
-        _tcscpy_s(szInterfaceName, INTERFACE_NAME_LENGTH, tchDeviceName);
-    }
-
-    virtual ~IIoctlDev()
-    {
-
-    }
-
-    virtual bool          IsOpened(void) = 0;
-
-    virtual wlct_os_err_t Open() = 0;
-    virtual wlct_os_err_t Ioctl(uint32_t Id,
-                                const void *inBuf, uint32_t inBufSize,
-                                void *outBuf, uint32_t outBufSize) = 0;
-    virtual wlct_os_err_t DebugFS(char *FileName, void *dataBuf, DWORD dataBufLen, DWORD DebugFSFlags){
-        //do something with params
-        (void)FileName;
-        (void)dataBuf;
-        (void)dataBufLen;
-        (void)DebugFSFlags;
-        return -1;
-    }
-    virtual void          Close() = 0;
-
-protected:
-    static const size_t INTERFACE_NAME_LENGTH = 256;
-    TCHAR szInterfaceName[INTERFACE_NAME_LENGTH];
-};
diff --git a/debug-tools/lib/WlctPciAcss/Makefile b/debug-tools/lib/WlctPciAcss/Makefile
deleted file mode 100644
index 2e5ef56..0000000
--- a/debug-tools/lib/WlctPciAcss/Makefile
+++ /dev/null
@@ -1,52 +0,0 @@
--include $(TOPDIR)/rules.mk
-
-CFLAGS := -fPIC -Wall -g -MMD
-LDFLAGS := -shared -fPIC
-
-LIB := libwigig_pciaccess.so
-
-.DEFAULT_GOAL = all
-
-ifneq ($(CONFIG_TARGET_ipq)$(CONFIG_TARGET_ipq806x),)
-is_ipq806x = 1
-endif
-
-ifeq ($(is_ipq806x), 1)
-ifneq ($(strip $(TOOLPREFIX)),)
-CROSS:=$(TOOLPREFIX)
-endif
-endif
-
-CC = $(CROSS)gcc
-CXX = $(CROSS)g++
-
-INCLUDES = -I . \
-	   -I ../inc/linux \
-           -I ../inc \
-           -I ../utils/linux \
-           -I ../utils \
-           -I ./linux \
-
-all: $(LIB)
-
-CPP_FILES := $(shell find . -type f -name '*.cpp')
-C_FILES := $(shell find . -type f -name '*.c')
-
-OBJ_FILES :=  $(CPP_FILES:.cpp=.o)
-OBJ_FILES +=  $(C_FILES:.c=.o)
-
-$(LIB): $(OBJ_FILES)
-	$(CXX) $(LDFLAGS) -o $(LIB) $(OBJ_FILES)
-
-%.o : %.cpp
-	$(CXX) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-%.o : %.c
-	$(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-clean:
-	rm -rf $(LIB)
-	find . -type f \( -name "*.d" -o -name "*.o" \) -delete
-
-
--include $(OBJ_FILES:%.o=%.d)
diff --git a/debug-tools/lib/WlctPciAcss/MemoryAccess.cpp b/debug-tools/lib/WlctPciAcss/MemoryAccess.cpp
deleted file mode 100644
index b1fafc5..0000000
--- a/debug-tools/lib/WlctPciAcss/MemoryAccess.cpp
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "MemoryAccess.h"
-
-CMemoryAccess::CMemoryAccess(const TCHAR* tchDeviceName, DType devType)
-{
-	//do something with params
-	(void)tchDeviceName;
-	//if (devType == MST_MARLON)
-	//{
-	m_size = WLCT_DEV_MEMORY_SIZE;
-	m_baseAddress = 0x800000;
-	//}
-
-	deviceType = devType;
-	m_pMem = new char[m_size];
-        if (!m_pMem)
-        {
-            LOG_MESSAGE_ERROR(_T("Cannot allocate memory access buffer"));
-            exit(1);
-        }
-
-        memset(m_pMem, 0, m_size);
-}
-
-CMemoryAccess::~CMemoryAccess(void)
-{
-	CloseDevice();
-}
-
-int CMemoryAccess::GetType()
-{
-	return IDeviceAccess::ETypeMEMORY;
-}
-
-int CMemoryAccess::CloseDevice()
-{
-	if (m_pMem != NULL)
-	{
-		delete []m_pMem;
-		m_pMem = NULL;
-	}
-	return 0;
-}
-
-int CMemoryAccess::r32(DWORD addr, DWORD & val)
-{
-	DWORD	actualAddr = addr - m_baseAddress;
-
-	if (actualAddr >= m_size)
-		return -1;
-
-	actualAddr = actualAddr >> 2;
-	val = ((DWORD*)m_pMem)[actualAddr];
-	LOG_MESSAGE_DEBUG(_T("ADDR(in bytes): %04X Value: 0x%08X"), addr, val);
-	return 0;
-}
-
-int CMemoryAccess::w32(DWORD addr, DWORD val)
-{
-	DWORD	actualAddr = addr - m_baseAddress;
-	if (actualAddr >= m_size)
-		return -1;
-
-	actualAddr = actualAddr >> 2;
-	((DWORD*)m_pMem)[actualAddr] = val;
-	LOG_MESSAGE_DEBUG(_T("ADDR: %04X Value: 0x%04X"),addr, val);
-	return 0;
-}
-
-int CMemoryAccess::rb(DWORD addr, DWORD blockSize, char *arrBlock)
-{
-	DWORD	actualAddr = addr;
-//	DWORD	val;
-
-	//if (GetDeviceType() == MST_MARLON)
-	//{
-	actualAddr = addr - m_baseAddress;
-	//}
-
-	if ((actualAddr+blockSize) >= m_size)
-		return -1;
-
-	memcpy(arrBlock, &(m_pMem[actualAddr]), blockSize);
-
-// 	for (int inx = 0; inx < blockSize; inx++)
-// 	{
-// 		// wait between each loop
-// 		DWORD readFromIndex = actualAddr+inx;
-//
-// 		if (GetDeviceType() == MST_SWIFT)
-// 		{
-// 			val = ((USHORT*)m_pMem)[readFromIndex];
-// 		}
-//
-// 		if (GetDeviceType() == MST_MARLON)
-// 		{
-// 			val = ((DWORD*)m_pMem)[actualAddr];
-// 		}
-//
-// 		arrBlock[inx] = val;
-// 	}
-
-	return 0;
-}
-
-int CMemoryAccess::wb(DWORD addr, DWORD blockSize, const char *arrBlock)
-{
-	//do something with params
-	(void)addr;
-	(void)blockSize;
-	(void)arrBlock;
-
-	return 0;
-}
-
-void CMemoryAccess::rr32(DWORD addr, DWORD num_repeat, DWORD *arrBlock)
-{
-	DWORD* pFrom = &((DWORD*)m_pMem)[addr>>2];
-	for (DWORD loop = 0; loop < num_repeat; loop++)
-	{
-		// wait between each loop
-
-		arrBlock[loop] = *pFrom;
-	}
-}
-
-int CMemoryAccess::rr(DWORD addr, DWORD num_repeat, DWORD *arrBlock)
-{
-	if (!isInitialized())
-		return -1;
-
-	DWORD	actualAddr = addr;
-
-	//if (GetDeviceType() == MST_MARLON)
-	//{
-	actualAddr = addr - m_baseAddress;
-	//}
-
-	if (actualAddr >= m_size)
-		return -1;
-
-	//if (GetDeviceType() == MST_MARLON)
-	//{
-	rr32(actualAddr, num_repeat, arrBlock);
-	//}
-	return 0;
-}
-
-int CMemoryAccess::getFwDbgMsg(FW_DBG_MSG** pMsg)
-{
-	//do something with params
-	(void)pMsg;
-
-//	LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-	return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-int CMemoryAccess::clearAllFwDbgMsg()
-{
-	LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-	return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-int CMemoryAccess::do_reset(BOOL bFirstTime)
-{
-	//do something with params
-	(void)bFirstTime;
-	LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-	return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-
-int CMemoryAccess::do_sw_reset()
-{
-	LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-	return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-
-int CMemoryAccess::do_interface_reset()
-{
-	LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-	return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-}
diff --git a/debug-tools/lib/WlctPciAcss/MemoryAccess.h b/debug-tools/lib/WlctPciAcss/MemoryAccess.h
deleted file mode 100644
index 3240327..0000000
--- a/debug-tools/lib/WlctPciAcss/MemoryAccess.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-#include "DeviceAccess.h"
-
-#define WLCT_DEV_MEMORY_SIZE	(0x129000)
-
-
-extern "C" class CMemoryAccess : public IDeviceAccess
-{
-public:
-	CMemoryAccess(const TCHAR* tchDeviceName, DType devType);
-	virtual ~CMemoryAccess(void);
-	virtual int CloseDevice();
-	virtual int GetType();
-	virtual int r32(DWORD addr, DWORD & val);
-	virtual int w32(DWORD addr, DWORD val);
-	virtual int rb(DWORD addr, DWORD blockSize, char *arrBlock);
-	virtual int wb(DWORD addr, DWORD blockSize, const char *arrBlock);
-	virtual int rr(DWORD addr, DWORD num_repeat, DWORD *arrBlock);
-	virtual int getFwDbgMsg(FW_DBG_MSG** pMsg);
-	virtual int clearAllFwDbgMsg();
-	virtual int do_reset(BOOL bFirstTime = TRUE);
-	virtual int do_sw_reset();
-	virtual int do_interface_reset();
-
-private:
-	void rr32(DWORD addr, DWORD num_repeat, DWORD *arrBlock);
-
-private:
-	char*	m_pMem;
-	DWORD	m_size;
-	DWORD	m_baseAddress;
-};
diff --git a/debug-tools/lib/WlctPciAcss/PciDeviceAccess.cpp b/debug-tools/lib/WlctPciAcss/PciDeviceAccess.cpp
deleted file mode 100644
index 3f1d1d4..0000000
--- a/debug-tools/lib/WlctPciAcss/PciDeviceAccess.cpp
+++ /dev/null
@@ -1,1267 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "wlct_os.h"
-
-#include "PciDeviceAccess.h"
-#include "WlctPciAcssHelper.h"
-#include "DeviceAccess.h"
-#include <ctime>
-#include "Util.h"
-
-
-//////////////////////////////////////////////////////////////////////////
-// PCI interface
-
-CPciDeviceAccess::CPciDeviceAccess(const TCHAR* tchDeviceName, DType devType)
-    : IoctlDev(tchDeviceName)/*, SamplingThread(SamplingThreadProc, this),
-                               PciPluginThread(this)*/
-{
-    LOG_MESSAGE_INFO(_T("Create PCI device access for: %s"), tchDeviceName);
-    _tcscpy_s(szInterfaceName, MAX_DEVICE_NAME_LEN, tchDeviceName);
-    deviceType = devType;
-    m_close_state = 2;
-    m_open_state = 0;
-    //LOG_MESSAGE_INFO(_T("[close %d] [open %d]"), m_close_state, m_open_state);
-    bInitialized = false;
-    Open();
-    if (bInitialized)
-    {
-//		PciPluginThread.Start();
-    }
-    return;
-}
-
-void CPciDeviceAccess::Open()
-{
-    if (IoctlDev.IsOpened())
-    {
-        LOG_MESSAGE_INFO(_T("Already open. changing m_close_state = 0 and m_open_state = 2 [close %d] [open %d]"), m_close_state, m_open_state);
-        bInitialized = true;
-        m_close_state = 0;
-        m_open_state = 2;
-        return;
-    }
-
-    m_sampling_arr = NULL;
-    m_get_sampling_arr = NULL;
-//	m_hMonitorwPciPluginThread = NULL;
-    lastError = WLCT_OS_ERROR_SUCCESS;
-    dwBaseAddress = 0x880000;
-
-    bIsLocal = true;
-    TCHAR LorR = szInterfaceName[_tcslen(szInterfaceName) - 1];
-    if (LorR == _T('R') || LorR == _T('r'))
-    {
-        bIsLocal = false;
-        dwBaseAddress += 0x100000;
-    }
-
-    lastError = IoctlDev.Open();
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        //LOG_MESSAGE_ERROR(_T("PCIdeviceAccess: failed to open driver wPci. ERROR_FILE_NOT_FOUND = %d"), lastError);
-        return;
-    }
-
-//	ReOpen();
-
-    bInitialized = true;
-//	LOG_MESSAGE_INFO(_T("changing m_close_state to 0 and m_open_state to 2 [close %d] [open %d]"), m_close_state, m_open_state);
-    m_close_state = 0;
-    m_open_state = 2;
-
-    m_flag_busy = false;
-}
-
-CPciDeviceAccess::~CPciDeviceAccess()
-{
-    CloseDevice();
-}
-
-int CPciDeviceAccess::ReOpen()
-{
-    LOG_MESSAGE_INFO(_T("Sending ioctl IOCTL_FILTER_OPEN_DEVICE"));
-
-    FILTER_OPEN_DEVICE openDevice;
-
-    lastError = IoctlDev.Ioctl(bIsLocal?IOCTL_FILTER_OPEN_LOCAL_DEVICE:IOCTL_FILTER_OPEN_REMOTE_DEVICE,
-                               NULL, 0, &openDevice, sizeof(openDevice));
-    if ( lastError != WLCT_OS_ERROR_SUCCESS )
-    {
-        LOG_MESSAGE_ERROR(_T("Error in DeviceIoControl: IOCTL_FILTER_OPEN_DEVICE [err %d]"), lastError);
-        return -1;
-    }
-
-    LOG_MESSAGE_INFO(_T("Successfully sent ioctl IOCTL_FILTER_OPEN_DEVICE"));
-
-    return 0;
-}
-
-int CPciDeviceAccess::GetType()
-{
-    return IDeviceAccess::ETypePCI;
-}
-
-int CPciDeviceAccess::InternalCloseDevice()
-{
-//	DWORD bytesReturned = 0;
-
-//	sleep_ms(100);
-
-// 	if (bIsLocal)
-// 	{
-// 		bRc = DeviceIoControl (hPciCtrlDevice, IOCTL_FILTER_CLOSE_LOCAL_DEVICE, NULL, 0, NULL, 0, &bytesReturned, NULL);
-// 	}
-// 	else
-// 	{
-// 		bRc = DeviceIoControl (hPciCtrlDevice, IOCTL_FILTER_CLOSE_REMOTE_DEVICE, NULL, 0, NULL, 0, &bytesReturned, NULL);
-// 	}
-// 	lastError = ::GetLastError();
-// 	if ( !bRc || bytesReturned != 0)
-// 	{
-// 		LOG_MESSAGE_WARN(_T("Error in DeviceIoControl : %d"), lastError);
-// 	}
-// 	else
-// 	{
-// 		LOG_MESSAGE_INFO(_T("Successfully sent ioctl IOCTL_FILTER_CLOSE_DEVICE"))
-// 	}
-
-    IoctlDev.Close();
-//	LOG_MESSAGE_INFO(_T("changing m_close_state to 2 [close %d] [open %d]"), m_close_state, m_open_state);
-    m_close_state = 2;
-
-    return 0;
-}
-
-int CPciDeviceAccess::CloseDevice()
-{
-    //PciPluginThread.Stop();
-    if (InternalCloseDevice() == 0)
-    {
-        bInitialized = false;
-        //LOG_MESSAGE_INFO(_T("changing m_open_state to 0 and bInitialized to false [close %d] [open %d]"), m_close_state, m_open_state);
-        m_open_state = 0;
-    }
-    return 0;
-}
-
-#ifdef _WINDOWS
-int CPciDeviceAccess::SetDriverMode(int newState, int &oldState, int &payloadResult)
-{
-    if(!isInitialized()){
-        return -1;
-    }
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    SET_MODE_CMD_INPUT inBuffer;
-    SET_MODE_CMD_OUTPUT outBuffer;
-
-    memset(&inBuffer, 0, sizeof(SET_MODE_CMD_INPUT));
-    memset(&outBuffer, 0, sizeof(SET_MODE_CMD_OUTPUT));
-
-    inBuffer.mode = (DRIVER_MODE)newState;
-
-    lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_SET_MODE_NEW, &inBuffer, sizeof(inBuffer), &outBuffer, sizeof(outBuffer));
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_SET_MODE_NEW failed. %X"), lastError);
-        oldState = -1;
-        return -1;
-        payloadResult = -1;
-    }
-    if(!outBuffer.result){
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_SET_MODE_NEW did not change the mode"));
-    }
-    payloadResult = outBuffer.result;
-    oldState = outBuffer.previousMode;
-    return 0;
-}
-
-
-int CPciDeviceAccess::GetDriverMode(int &currentState){
-    if(!isInitialized()){
-        return false;
-    }
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    GET_MODE_CMD_OUTPUT currentModeBuffer;
-    memset(&currentModeBuffer, 0, sizeof(GET_MODE_CMD_OUTPUT));
-
-
-    lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_GET_MODE_NEW, NULL, 0, &currentModeBuffer, sizeof(currentModeBuffer));
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_GET_MODE_NEW failed. %X"), lastError);
-        return -1;
-    }
-
-    currentState = currentModeBuffer.currentMode;
-    return 0;
-}
-#endif //_WINDOWS
-
-// MARLON
-int CPciDeviceAccess::r32(DWORD addr, DWORD & val)
-{
-    if (!isInitialized())
-        return -1;
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    FILTER_1_ULONG_PARAM	inParams;
-    FILTER_1_ULONG_PARAM	outParams;
-
-    inParams.param = addr;
-
-    if (!bIsLocal)
-    {
-        inParams.param += 0x100000;
-    }
-
-    if (IoctlDev.bOldIoctls)
-        lastError = IoctlDev.Ioctl(IOCTL_INDIRECT_READ_OLD, &inParams, sizeof(inParams), &outParams, sizeof(outParams));
-    else
-        lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_INDIRECT_READ, &inParams, sizeof(inParams), &outParams, sizeof(outParams));
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_INDIRECT_READ failed. %X"), lastError);
-        return -1;
-    }
-
-    val = outParams.param;
-    LOG_MESSAGE_DEBUG(_T("ADDR(in bytes): 0x%X Value: 0x%X"), addr, val);
-    return 0;
-}
-
-bool CPciDeviceAccess::try2open(int timeout)
-{
-    do
-    {
-        Open();
-        if (IoctlDev.IsOpened())
-            break;
-        sleep_ms(100);
-        timeout -= 100;
-    } while (timeout > 0);
-
-    if (!IoctlDev.IsOpened())
-        return false;
-    return true;
-}
-
-
-int CPciDeviceAccess::do_interface_reset()
-{
-    if (!isInitialized())
-        return -1;
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    FILTER_1_ULONG_PARAM	inParams;
-    FILTER_1_ULONG_PARAM	outParams;
-
-    /*inParams.param = addr;
-
-      if (!bIsLocal)
-      {
-      inParams.param += 0x100000;
-      }*/
-
-    lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_DEVICE_SW_RESET, &inParams, sizeof(inParams), &outParams, sizeof(outParams));
-
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_DEVICE_SW_RESET failed. %X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-    //val = outParams.param;
-    LOG_MESSAGE_INFO(_T("Pci Interface Reset using IOCTL"));
-    return 0;
-}
-
-int CPciDeviceAccess::do_sw_reset()
-{
-    LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-    return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-
-#define USING_RESET_FUNCTION 0
-int CPciDeviceAccess::do_reset(BOOL bFirstTime)
-{
-    if (USING_RESET_FUNCTION == 0)
-    {
-        LOG_MESSAGE_WARN(_T("reset was not done because USING_RESET_FUNCTION == 0"));
-        return -1;
-    }
-
-    if (!isInitialized())
-        return -1;
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    DWORD addr;
-    if (deviceStep == STEP_NONE)
-        addr = 0x880AE0;
-    else if (deviceStep == MARLON_STEP_B0 || deviceStep == SPARROW_STEP_A0 || deviceStep == SPARROW_STEP_B0)
-        addr = 0x880B04;
-    else // default
-    {
-        addr = 0x880B04;
-    }
-
-    DWORD val;
-    bool bres;
-
-    // check if there is an access to the board
-    int ret = r32(BAUD_RATE_REGISTER, val);
-    if (ret != 0 || val == 0 || val == 0xFFFFFFFF)
-    {
-        // access failed.
-        if (bFirstTime == FALSE)
-            return -1;
-
-        // do disable enable
-        InternalCloseDevice();
-        sleep_ms(500);
-        bres = Util::ICHDisableEnable();
-        if (!bres)
-            sleep_ms(1000);
-        Open();
-        do_reset(FALSE);
-    }
-
-    w32(addr, 1);
-    InternalCloseDevice();
-    sleep_ms(500);
-    bres = Util::ICHDisableEnable();
-
-    bres = try2open(2000);
-    if (!bres)
-    {
-        LOG_MESSAGE_INFO(_T("do_reset: failed to open the device after reset"));
-        return -1;
-    }
-
-
-    int timeout = 2000;
-    bres = false;
-    do
-    {
-        ret = r32(BAUD_RATE_REGISTER, val);
-        if (ret == 0 && val > 0 && val < 0xFFFFFFFF)
-        {
-            bres = true;
-            break;
-        }
-        sleep_ms(100);
-        timeout -= 100;
-    } while (timeout > 0);
-    if (!bres)
-    {
-        LOG_MESSAGE_ERROR(_T("ERROR: failed to read the baudrate after reset."));
-        return -1;
-    }
-    return 0;
-}
-
-int CPciDeviceAccess::reset_complete()
-{
-    DWORD val;
-    bool bres;
-    int ret;
-
-    InternalCloseDevice();
-    sleep_ms(500);
-    Util::ICHDisableEnable();
-
-    bres = try2open(2000);
-    if (!bres)
-    {
-        LOG_MESSAGE_INFO(_T("failed to open the device after reset"));
-        return -1;
-    }
-
-    int timeout = 2000;
-    bres = false;
-    do
-    {
-        ret = r32(BAUD_RATE_REGISTER, val);
-        if (ret == 0 && val > 0 && val < 0xFFFFFFFF)
-        {
-            bres = true;
-            break;
-        }
-        sleep_ms(100);
-        timeout -= 100;
-    } while (timeout > 0);
-    if (!bres)
-    {
-        LOG_MESSAGE_ERROR(_T("ERROR: failed to read the baudrate after reset."));
-        return -1;
-    }
-    return 0;
-}
-
-// marlon
-int CPciDeviceAccess::w32(DWORD addr, DWORD val)
-{
-    if (!isInitialized())
-        return -1;
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-
-    FILTER_2_ULONG_PARAM	inParams;
-
-    inParams.param1 = addr;
-
-    if (!bIsLocal)
-    {
-        inParams.param1 += 0x100000;
-    }
-
-    inParams.param2 = val;
-
-
-    if (IoctlDev.bOldIoctls)
-        lastError = IoctlDev.Ioctl(IOCTL_INDIRECT_WRITE_OLD, &inParams, sizeof(inParams), NULL, 0);
-    else
-        lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_INDIRECT_WRITE, &inParams, sizeof(inParams), NULL, 0);
-
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("IOCTL_INDIRECT_WRITE failed. %X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-    if (USING_RESET_FUNCTION == 0)
-    {
-        if (((deviceStep == STEP_NONE) && (addr == 0x880AE0)) || ((deviceStep == MARLON_STEP_B0 || deviceStep == SPARROW_STEP_A0 || deviceStep == SPARROW_STEP_B0) && (addr == 0x880B04)))
-        {
-            if (val & 0x1)
-            {
-                LOG_MESSAGE_WARN(_T("Calling reset from write command instead of calling reset directly!!!!!!!!!!!!!!!!!!!!!!!!!!"));
-                reset_complete();
-            }
-        }
-    }
-
-    LOG_MESSAGE_DEBUG(_T("ADDR: 0x%X Value: 0x%X"),addr, val);
-    return 0;
-}
-
-// addr is in bytes.
-// block size for SWITH is number of 16 bits and MARLON is number of bytes
-// In MARLON the block size should be align to 32 bits (otherwise it will be
-// truncated by the hardware)
-//
-int CPciDeviceAccess::rb(DWORD addr, DWORD blockSize, char *arrBlock)
-{
-    if (!isInitialized())
-        return -1;
-// 	if (m_close_state == 1)
-// 		InternalCloseDevice();
-// 	if (m_open_state == 1)
-// 		Open();
-// 	if (m_close_state == 2)
-// 		return -1;
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-
-    //if (GetDeviceType() == MST_MARLON)
-    //{
-    FILTER_1_ULONG_PARAM	inParams;
-
-    inParams.param = addr;
-
-    if (!bIsLocal)
-    {
-        inParams.param += 0x100000;
-    }
-
-
-    if (IoctlDev.bOldIoctls)
-        lastError = IoctlDev.Ioctl(IOCTL_INDIRECT_READ_BLOCK, &inParams, sizeof(inParams), arrBlock, blockSize);
-    else
-        lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_INDIRECT_READ_BLOCK, &inParams, sizeof(inParams), arrBlock, blockSize);
-
-    //	DWORD le = GetLastError();
-    //	LOG_MESSAGE_WARN(_T("IOCTL_INDIRECT_READ return %d [lastError 0x%X]"), bRc, le);
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("IOCTL_INDIRECT_READ failed. %X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-    //}
-
-    return 0;
-}
-
-int CPciDeviceAccess::wb(DWORD addr, DWORD blockSize, const char *arrBlock)
-{
-    if (!isInitialized())
-        return -1;
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    PFILTER_WRITE_BLOCK	pinParams;
-    char* p = new char[2*sizeof(ULONG) + blockSize];
-    if (!p) return -1;
-
-    pinParams = (PFILTER_WRITE_BLOCK)p;
-    pinParams->address = addr;
-
-    if (!bIsLocal)
-    {
-        pinParams->address += 0x100000;
-    }
-
-    pinParams->size = blockSize;
-    memcpy(pinParams->buffer, arrBlock, blockSize);
-
-
-    if (IoctlDev.bOldIoctls)
-        lastError = IoctlDev.Ioctl(IOCTL_INDIRECT_WRITE_BLOCK, pinParams, 2*sizeof(ULONG) + blockSize, NULL, 0);
-    else
-        lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_INDIRECT_WRITE_BLOCK, pinParams, 2*sizeof(ULONG) + blockSize, NULL, 0);
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_INDIRECT_WRITE_BLOCK failed. %X"), lastError);
-        InternalCloseDevice();
-        delete [] p;
-        return -1;
-    }
-
-    delete [] p;
-    return 0;
-}
-
-void CPciDeviceAccess::rr32(DWORD addr, DWORD num_repeat, DWORD *arrBlock)
-{
-    WLCT_UNREFERENCED_PARAM(addr);
-    WLCT_UNREFERENCED_PARAM(num_repeat);
-    WLCT_UNREFERENCED_PARAM(arrBlock);
-    WLCT_ASSERT(0);
-}
-
-int CPciDeviceAccess::rr(DWORD addr, DWORD num_repeat, DWORD *arrBlock)
-{
-    if (!isInitialized())
-        return -1;
-    if (m_close_state == 2)
-        Open();
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    //if (GetDeviceType() == MST_MARLON)
-    //{
-    FILTER_1_ULONG_PARAM	inParams;
-    inParams.param = addr;
-    if (!bIsLocal)
-    {
-        inParams.param += 0x100000;
-    }
-
-    lastError = IoctlDev.Ioctl(IOCTL_INDIRECT_READ_REPEAT, &inParams, sizeof(inParams), arrBlock, num_repeat*sizeof(DWORD));
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("IOCTL_INDIRECT_READ failed. %X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-
-// 		actualAddr = addr - dwBaseAddress;
-// 		if (actualAddr >= CRSsize)
-// 			return -1;
-//
-// 		rr32(actualAddr>>2, num_repeat, arrBlock);
-    //}
-    return 0;
-}
-
-int CPciDeviceAccess::getFwDbgMsg(FW_DBG_MSG** pMsg)
-{
-    (void)pMsg;
-    //	LOG_MESSAGE_DEBUG(_T("NOT IMPLEMENTED"));
-    return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-int CPciDeviceAccess::clearAllFwDbgMsg()
-{
-    LOG_MESSAGE_ERROR(_T("NOT IMPLEMENTED"));
-    return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-/*
-  void CPciDeviceAccess::SamplingThreadProc(void *pDeviceAccss)
-  {
-  LOG_MESSAGE_DEBUG(_T("start running"));
-  CPciDeviceAccess *pDevice = (CPciDeviceAccess*)pDeviceAccss;
-  #ifdef WCLT_SAMPLING_TO_FILE_IS_SUPPORTED
-  HANDLE            hSamplingFile = INVALID_HANDLE_VALUE;
-  #endif
-  uint64_t          startTS;
-
-  pDevice->m_sampling_head = 0;
-  pDevice->m_sampling_tail = 0;
-  pDevice->m_loops = 0;
-
-  startTS = GetTimeStampMs();
-
-  WLCT_UNREFERENCED_PARAM(startTS);
-
-  SAMPLING_REGS* currEntry;
-
-  #ifdef WCLT_SAMPLING_TO_FILE_IS_SUPPORTED
-  DWORD written = 0;
-  if (pDevice->m_transferMethod == 1)
-  {	// saving to file
-  TCHAR file_name[256];
-  _stprintf (file_name, _T("c:\\sampling_%X.bin"), GetTickCount());
-  hSamplingFile = CreateFile(file_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-  if (hSamplingFile == INVALID_HANDLE_VALUE)
-  {
-  return;
-  }
-  // first data in the file is the number of registers in each sampling
-  WriteFile(hSamplingFile, &pDevice->m_no_sampling_regs, sizeof(pDevice->m_no_sampling_regs), &written, NULL);
-  // then write the registers address
-  WriteFile(hSamplingFile, pDevice->m_pRegsArr, sizeof(DWORD)* pDevice->m_no_sampling_regs, &written, NULL);
-  }
-  #endif
-
-  uint64_t last_timeStamp = 0;
-  do
-  {
-  //sleep_ms(pDevice->m_interval);
-  do
-  {
-  sleep_ms(0);
-  } while ( (GetTimeStampMs() - last_timeStamp) <  pDevice->m_interval);
-  last_timeStamp = GetTimeStampMs();
-
-  currEntry = (SAMPLING_REGS*)(pDevice->m_sampling_arr + pDevice->m_sampling_head * (pDevice->m_no_sampling_regs + 1));
-  currEntry->timeStamp = (DWORD)last_timeStamp;
-  for (DWORD i = 0; i < pDevice->m_no_sampling_regs; i++)
-  {
-  DWORD val;
-  if (pDevice->GetDeviceType() == MST_SWIFT)
-  {
-  pDevice->r2(pDevice->m_pRegsArr[i], val);
-  currEntry->regArr[i] = val;
-  }
-  else if (pDevice->GetDeviceType() == MST_MARLON)
-  {
-  pDevice->r32(pDevice->m_pRegsArr[i], currEntry->regArr[i]);
-  }
-  }
-
-  pDevice->m_sampling_head++;
-  if (pDevice->m_sampling_head >= pDevice->m_maxSampling)
-  {
-  pDevice->m_sampling_head = 0;
-  #ifdef WCLT_SAMPLING_TO_FILE_IS_SUPPORTED
-  if (pDevice->m_transferMethod == 1)
-  {
-  // save the buffer to the disk;
-  WriteFile(hSamplingFile, pDevice->m_sampling_arr, pDevice->oneSamplingSize * pDevice->m_maxSampling, &written, NULL);
-  }
-  #endif
-  if (pDevice->m_transferMethod == 2)
-  {
-  pDevice->m_loops++;
-  }
-
-  }
-
-  } while (!pDevice->SamplingThread.ShouldStop());
-  #ifdef WCLT_SAMPLING_TO_FILE_IS_SUPPORTED
-  if (pDevice->m_transferMethod == 1)
-  {
-  CloseHandle(hSamplingFile);
-  }
-  #endif
-  LOG_MESSAGE_DEBUG(_T("Leaving"));
-  }
-
-  int CPciDeviceAccess::startSampling(
-  DWORD* pRegsArr,
-  DWORD regArrSize,
-  DWORD interval,
-  DWORD maxSampling,
-  DWORD transferMethod)
-  {
-  m_no_sampling_regs = regArrSize;
-  m_pRegsArr = new DWORD[regArrSize];
-  memcpy(m_pRegsArr, pRegsArr, sizeof(DWORD)*regArrSize);
-  m_interval = interval;
-  m_maxSampling = maxSampling;
-  m_transferMethod = transferMethod;
-
-  // allocate the sampling buffer
-  // each sampling required:
-  // m_no_sampling_regs * sizeof(DWORD) + timestamp
-  oneSamplingSize = m_no_sampling_regs * sizeof(DWORD) + sizeof(DWORD);
-  m_sampling_arr = new DWORD[oneSamplingSize * m_maxSampling];
-  m_get_sampling_arr = new DWORD[oneSamplingSize * m_maxSampling];
-
-  // start the read tread
-  SamplingThread.Start();
-  sleep_ms(100);
-
-  return 0;
-  }
-
-  int CPciDeviceAccess::stopSampling()
-  {
-  SamplingThread.Stop();
-
-  // free the sampling buffers
-  delete [] m_pRegsArr;
-  delete [] m_sampling_arr;
-  delete [] m_get_sampling_arr;
-  return 0;
-  }
-
-  int CPciDeviceAccess::getSamplingData(DWORD** pDataSamples)
-  {
-  DWORD total_copy = 0;
-
-  // get the head and tail position
-  DWORD head = m_sampling_head;
-  DWORD tail = m_sampling_tail;
-
-  LOG_MESSAGE_DEBUG(_T("[head %X] [tail %X] [loops %d]"), head, tail, m_loops);
-
-  memset(m_get_sampling_arr, 0, oneSamplingSize * m_maxSampling);
-
-  // 0 - no new data. nothing to copy
-  // -1 - error
-  // 1 - copy from tail to head
-  // 2 - copy from tail to end buffer and then from start buffer to head
-  // 3 - overlapped. copy from head to head.
-  //
-  DWORD copy_type = 0;
-  if (m_loops == 0)
-  {
-  if (head == tail)
-  {
-  // no new data
-  copy_type = 0;
-  }
-  else if (head > tail)
-  {
-  // new data. copy from tail to head
-  copy_type = 1;
-  }
-  else if (head < tail)
-  {
-  // error
-  LOG_MESSAGE_ERROR(_T("ERROR: !!!!!!!! loop is ZERO [head %X] [tail %X]"), head, tail);
-  copy_type = -1;
-  }
-  }
-  else if (m_loops == 1)
-  {
-  if (head == tail)
-  {
-  // overlapped. copy head to head
-  copy_type = 3;
-  }
-  else if (head > tail)
-  {
-  // overlapped. copy head to head
-  copy_type = 3;
-  }
-  else if (head < tail)
-  {
-  // copy from tail to end buffer and then from start buffer to head
-  copy_type = 2;
-  }
-  }
-  else if (m_loops > 1)
-  {
-  // overlapped. copy head to head
-  copy_type = 3;
-  }
-
-  DWORD srcPos;
-  switch (copy_type)
-  {
-  case 1:
-  {
-  srcPos = oneSamplingSize * tail / sizeof(DWORD);
-  memcpy(m_get_sampling_arr, &(m_sampling_arr[srcPos]), oneSamplingSize * (head - tail));
-  total_copy = oneSamplingSize * (head - tail);
-  }
-  break;
-  case 2:
-  {
-  // copy from tail to the end of the buffer
-  srcPos = oneSamplingSize * tail / sizeof(DWORD);
-  memcpy(m_get_sampling_arr, &(m_sampling_arr[srcPos]), oneSamplingSize * (m_maxSampling - tail));
-  //
-  DWORD nextIndex = (oneSamplingSize * (m_maxSampling - tail))/sizeof(DWORD);
-  memcpy(&(m_get_sampling_arr[nextIndex]), m_sampling_arr, oneSamplingSize * head);
-  total_copy = oneSamplingSize * (m_maxSampling - tail) + oneSamplingSize * head;
-  }
-  break;
-  case 3:
-  {
-  // copy all the cyclic buffer, starting from the head
-  // the head is pointing to the next place to put there new sample.
-  // there is a racing condition because it is possible that just before
-  // we will start coping a context switch will happened and the read
-  // sampling thread will overwrite this area.
-  // we are not locking this sharing resource for now
-  memcpy(m_get_sampling_arr, &(m_sampling_arr[head]), oneSamplingSize * (m_maxSampling - head));
-  // copy from the beginning till the head
-  DWORD nextIndex = (oneSamplingSize * (m_maxSampling - head))/sizeof(DWORD);
-  memcpy(&(m_get_sampling_arr[nextIndex]), &(m_sampling_arr[0]), oneSamplingSize * head);
-  total_copy = oneSamplingSize * m_maxSampling;
-
-  LOG_MESSAGE_WARN(_T("detect a loop [%d]. samples lost."), m_loops);
-  }
-  break;
-  }
-
-  m_loops = 0;
-  m_sampling_tail = head;
-  LOG_MESSAGE_DEBUG(_T("[m_sampling_tail %X] [total_copy %d]"), m_sampling_tail, total_copy);
-
-  *pDataSamples = m_get_sampling_arr;
-  return total_copy;
-  }
-*/
-int CPciDeviceAccess::alloc_pmc(int num_of_descriptors, int size_of_descriptor){
-    if (!isInitialized())
-    {
-        LOG_MESSAGE_ERROR(_T("alloc_pmc - Not initialized"));
-        return -1;
-    }
-    if (m_close_state == 2)
-    {
-        Open();
-    }
-    if (!IoctlDev.IsOpened())
-    {
-        LOG_MESSAGE_ERROR(_T("alloc_pmc - Not opened"));
-        return -1;
-    }
-
-    int data[2] = {num_of_descriptors, size_of_descriptor};
-    int res = IoctlDev.DebugFS((char*)"pmccfg", data, 8, 0);
-
-    if (res != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_ERROR(_T("Cannot open DebugFS for pmccfg: 0x%X"), res);
-    }
-
-    return res;
-}
-#ifdef _WINDOWS
-int CPciDeviceAccess::send_wmi_cmd(SEND_RECEIVE_WMI* wmi)
-{
-    LOG_MESSAGE_INFO(_T("send_wmi_cmd: 0x%X"),  wmi->uCmdId);
-
-    if (!isInitialized())
-        return -1;
-
-
-    lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_SEND_WMI, wmi, sizeof(SEND_RECEIVE_WMI), NULL, 0);
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_SEND_WMI failed. %X"), lastError);
-        return lastError;
-    }
-
-
-    return 0;
-}
-
-int CPciDeviceAccess::recieve_wmi_event(SEND_RECEIVE_WMI* evt)
-{
-    LOG_MESSAGE_INFO(_T("recieve_wmi_event"));
-
-    if (!isInitialized())
-        return -1;
-
-
-    lastError = IoctlDev.Ioctl( WILOCITY_IOCTL_RECEIVE_WMI, NULL, 0, evt, sizeof(SEND_RECEIVE_WMI));
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_RECEIVE_WMI failed. %X"), lastError);
-        return lastError;
-    }
-
-    return 0;
-}
-#endif //_WINDOWS
-
-int CPciDeviceAccess::register_driver_mailbox_event(HANDLE* pMailboxEventHandle )
-{
-    LOG_MESSAGE_INFO(_T("register_driver_mailbox_event"));
-
-    if (!isInitialized())
-        return -1;
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    REGISTER_EVENT req;
-    memset(&req, 0, sizeof(REGISTER_EVENT));
-
-    req.hEvent = *pMailboxEventHandle;
-
-    lastError = IoctlDev.Ioctl(WILOCITY_IOCTL_REGISTER_WMI_RX_EVENT, &req, sizeof(REGISTER_EVENT), NULL, 0);
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_REGISTER_WMI_RX_EVENT failed. 0x%X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-    return ERROR_SUCCESS;
-}
-
-int CPciDeviceAccess::register_device_unplug2(INT_PTR hEvent){
-    LOG_MESSAGE_INFO(_T("register_device_unplug2"));
-
-    WLCT_UNREFERENCED_PARAM(hEvent);
-
-    if (!isInitialized())
-        return -1;
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-
-#ifdef _WINDOWS
-    DRIVER_REGISTER_EVENT req;
-    memset(&req, 0, sizeof(DRIVER_REGISTER_EVENT));
-    LOG_MESSAGE_INFO(_T("register_device_unplug2: <Event Pointer=0x%p>"), hEvent);
-    req.UserEventHandle = hEvent;
-
-    lastError = IoctlDev.Ioctl( WILOCITY_IOCTL_REGISTER_DEVICE, &req, sizeof(req), NULL, 0);
-
-
-#endif //_WINDOWS
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("register_device_unplug2 failed. 0x%X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-    return ERROR_SUCCESS;
-}
-
-int CPciDeviceAccess::unregister_device_unplug2(){
-    LOG_MESSAGE_INFO(_T("unregister_device_unplug2"));
-
-    if (!isInitialized())
-        return -1;
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-
-#ifdef _WINDOWS
-    DRIVER_REGISTER_EVENT req;
-    memset(&req, 0, sizeof(DRIVER_REGISTER_EVENT));
-    LONG invalidPointer = -1;
-    LOG_MESSAGE_INFO(_T("register_device_unplug2: <Event Pointer=0x%X>"), invalidPointer);
-    req.UserEventHandle = invalidPointer;
-
-    lastError = IoctlDev.Ioctl( WILOCITY_IOCTL_REGISTER_DEVICE, &req, sizeof(req), NULL, 0);
-
-
-#endif //_WINDOWS
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("register_device_unplug2 failed. 0x%X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-    return ERROR_SUCCESS;
-}
-
-
-
-int CPciDeviceAccess::register_driver_device_event(INT_PTR hEvent,int deviceId, int eventId)
-{
-    LOG_MESSAGE_INFO(_T("register_driver_device_event"));
-    WLCT_UNREFERENCED_PARAM(hEvent);
-    WLCT_UNREFERENCED_PARAM(deviceId);
-    WLCT_UNREFERENCED_PARAM(eventId);
-
-    if (!isInitialized())
-        return -1;
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-
-#ifdef _WINDOWS
-
-    LOG_MESSAGE_INFO(_T("register_driver_device_event: <Event Pointer=0x%p> <deviceId=0x%x> <EventId=0x%x>"), hEvent, deviceId, eventId);
-
-    // Our DLL assumed to be always compiled for 32bit application.
-    // Since the driver excpects to recieve HANDLEs of size that IS platform speciefic,
-    // we must dynamically find out if we are running on 64bit OS or now.
-    // for more information, read remarks on WlcyPciAcssWmi.h file
-    if (Util::Is64BitWindows())
-    {
-        LOG_MESSAGE_INFO(_T("register_driver_device_event Driver HANDLE problem WA, using 64bit struct"));
-        EVENT_HANDLE_64BIT req;
-        memset(&req, 0, sizeof(EVENT_HANDLE_64BIT));
-        req.DeviceId = deviceId;
-        req.EventId = eventId;
-        req.hEvent_l = hEvent;
-        req.hEvent_h = 0;
-
-        lastError = IoctlDev.Ioctl( WILOCITY_IOCTL_REGISTER_EVENT, &req, sizeof(req), NULL, 0);
-
-
-    }
-    else
-    {
-        LOG_MESSAGE_INFO(_T("register_driver_device_event Driver HANDLE problem WA, using 32bit struct"));
-        EVENT_HANDLE_32BIT req;
-        memset(&req, 0, sizeof(EVENT_HANDLE_32BIT));
-
-        req.DeviceId = deviceId;
-        req.EventId = eventId;
-        req.hEvent = hEvent;
-
-        lastError = IoctlDev.Ioctl( WILOCITY_IOCTL_REGISTER_EVENT, &req, sizeof(req), NULL, 0);
-    }
-
-#endif //_WINDOWS
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_REGISTER_EVENT failed. 0x%X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-    //do something with params
-    (void)deviceId;
-    (void)eventId;
-    return ERROR_SUCCESS;
-}
-int CPciDeviceAccess::register_driver_device_events(INT_PTR hDnEvent, INT_PTR hUpEvent, INT_PTR hUnplugEvent, INT_PTR hSysAssertEvent)
-{
-    LOG_MESSAGE_INFO(_T("register_driver_device_events"));
-    WLCT_UNREFERENCED_PARAM(hDnEvent);
-    WLCT_UNREFERENCED_PARAM(hUpEvent);
-    WLCT_UNREFERENCED_PARAM(hUnplugEvent);
-    WLCT_UNREFERENCED_PARAM(hSysAssertEvent);
-
-    if (!isInitialized())
-        return -1;
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-
-#ifdef _WINDOWS
-
-    LOG_MESSAGE_INFO(_T("register_driver_device_events: <hDnEvent=0x%p> <hUpEvent=0x%p> <hUnplugEvent=0x%p> <hSysAssertEvent=0x%p>"), hDnEvent, hUpEvent, hUnplugEvent, hSysAssertEvent );
-
-    // Our DLL assumed to be always compiled for 32bit application.
-    // Since the driver excpects to recieve HANDLEs of size that IS platform speciefic,
-    // we must dynamically find out if we are running on 64bit OS or now.
-    // for more information, read remarks on WlcyPciAcssWmi.h file
-    if (Util::Is64BitWindows())
-    {
-        LOG_MESSAGE_INFO(_T("register_driver_device_events Driver HANDLES problem WA, using 64bit struct"));
-        SHARED_EVENT_64BIT req;
-        memset(&req, 0, sizeof(SHARED_EVENT_64BIT));
-
-        req.hDnEvent_l = hDnEvent;
-        req.hDnEvent_h = 0;
-        req.hUpEvent_l = hUpEvent;
-        req.hUpEvent_h = 0;
-        req.unplugEvent_l = hUnplugEvent;
-        req.hUpEvent_h = 0;
-        req.sysAssertEvent_l = hSysAssertEvent;
-        req.sysAssertEvent_h = 0;
-
-        lastError = IoctlDev.Ioctl( IOCTL_OPEN_USER_MODE_EVENT, &req, sizeof(req), NULL, 0);
-
-
-    }
-    else
-    {
-        LOG_MESSAGE_INFO(_T("register_driver_device_events Driver HANDLES problem WA, using 32bit struct"));
-        SHARED_EVENT_32BIT req;
-        memset(&req, 0, sizeof(SHARED_EVENT_32BIT));
-
-        req.hDnEvent = hDnEvent;
-        req.hUpEvent = hUpEvent;
-        req.unplugEvent = hUnplugEvent;
-        req.sysAssertEvent = hSysAssertEvent;
-
-        lastError = IoctlDev.Ioctl( IOCTL_OPEN_USER_MODE_EVENT, &req, sizeof(req), NULL, 0);
-    }
-
-#endif //_WINDOWS
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("IOCTL_OPEN_USER_MODE_EVENT failed. 0x%X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-    return ERROR_SUCCESS;
-}
-
-int CPciDeviceAccess::unregister_driver_device_events()
-{
-    LOG_MESSAGE_INFO(_T("unregister_driver_device_events"));
-
-    if (!isInitialized())
-        return -1;
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-
-#ifdef _WINDOWS
-
-    LOG_MESSAGE_INFO(_T("unregister_driver_device_events with invalid handles"));
-
-    // Our DLL assumed to be always compiled for 32bit application.
-    // Since the driver excpects to recieve HANDLEs of size that IS platform speciefic,
-    // we must dynamically find out if we are running on 64bit OS or now.
-    // for more information, read remarks on WlcyPciAcssWmi.h file
-    if (Util::Is64BitWindows())
-    {
-        LOG_MESSAGE_INFO(_T("register_driver_device_events Driver HANDLES problem WA, using 64bit struct"));
-        SHARED_EVENT_64BIT req;
-        memset(&req, 0, sizeof(SHARED_EVENT_64BIT));
-
-        req.hDnEvent_l = -1;
-        req.hDnEvent_h = -1;
-        req.hUpEvent_l = -1;
-        req.hUpEvent_h = -1;
-        req.unplugEvent_l = -1;
-        req.hUpEvent_h = -1;
-        req.sysAssertEvent_l = -1;
-        req.sysAssertEvent_h = -1;
-
-        lastError = IoctlDev.Ioctl( IOCTL_OPEN_USER_MODE_EVENT, &req, sizeof(req), NULL, 0);
-
-
-    }
-    else
-    {
-        LOG_MESSAGE_INFO(_T("register_driver_device_events Driver HANDLES problem WA, using 32bit struct"));
-        SHARED_EVENT_32BIT req;
-        memset(&req, 0, sizeof(SHARED_EVENT_32BIT));
-
-        req.hDnEvent = -1;
-        req.hUpEvent = -1;
-        req.unplugEvent = -1;
-        req.sysAssertEvent = -1;
-
-        lastError = IoctlDev.Ioctl( IOCTL_OPEN_USER_MODE_EVENT, &req, sizeof(req), NULL, 0);
-    }
-
-#endif //_WINDOWS
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("IOCTL_OPEN_USER_MODE_EVENT failed. 0x%X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-    return ERROR_SUCCESS;
-}
-
-int CPciDeviceAccess::setMpDriverLogLevels(ULONG logModulesEnableMsk, ULONG logModuleLevelsMsk[WILO_DRV_NUM_LOG_COMPS])
-{
-    LOG_MESSAGE_INFO(_T("setMpDriverLogLevels"));
-
-    if (!isInitialized())
-        return -1;
-    if (!IoctlDev.IsOpened())
-        return -1;
-
-    DRIVER_LOGS_CFG req;
-    memset(&req, 0, sizeof(DRIVER_LOGS_CFG));
-    req.logModulesEnableMsk = logModulesEnableMsk;
-    memcpy( req.logModuleLevelsMsk, logModuleLevelsMsk, (WILO_DRV_NUM_LOG_COMPS*4)) ;
-
-    lastError = IoctlDev.Ioctl( WILOCITY_IOCTL_DRIVER_LOG_LEVELS_CFG, &req, sizeof(req), NULL, 0);
-
-    if (lastError != WLCT_OS_ERROR_SUCCESS)
-    {
-        LOG_MESSAGE_WARN(_T("WILOCITY_IOCTL_DRIVER_LOG_LEVELS_CFG failed. 0x%X"), lastError);
-        InternalCloseDevice();
-        return -1;
-    }
-
-    return ERROR_SUCCESS;
-}
diff --git a/debug-tools/lib/WlctPciAcss/PciDeviceAccess.h b/debug-tools/lib/WlctPciAcss/PciDeviceAccess.h
deleted file mode 100644
index 8c2d741..0000000
--- a/debug-tools/lib/WlctPciAcss/PciDeviceAccess.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "DeviceAccess.h"
-#include "WlctPciAcss.h"
-#include "IoctlDev.h"
-#include "Thread.h"
-#include "public.h"
-
-#ifdef _WINDOWS
-#include "ioctl_if.h"
-#else
-// some definitions from ioctl_if.h
-#define WILOCITY_IOCTL_INDIRECT_READ IOCTL_INDIRECT_READ_OLD
-#define WILOCITY_IOCTL_INDIRECT_WRITE IOCTL_INDIRECT_WRITE_OLD
-#define WILOCITY_IOCTL_INDIRECT_READ_BLOCK IOCTL_INDIRECT_READ_BLOCK
-#define WILOCITY_IOCTL_INDIRECT_WRITE_BLOCK IOCTL_INDIRECT_WRITE_BLOCK
-#endif
-
-extern "C" class CPciDeviceAccess : public IDeviceAccess
-{
-public:
-    CPciDeviceAccess(const TCHAR* tchDeviceName, DType devType);
-    ~CPciDeviceAccess();
-
-    virtual int CloseDevice();
-    virtual int GetType();
-    virtual int r32(DWORD addr, DWORD & val);
-    virtual int w32(DWORD addr, DWORD val);
-    virtual int rb(DWORD addr, DWORD blockSize, char *arrBlock);
-    virtual int wb(DWORD addr, DWORD blockSize, const char *arrBlock);
-    virtual int rr(DWORD addr, DWORD num_repeat, DWORD *arrBlock);
-    virtual int getFwDbgMsg(FW_DBG_MSG** pMsg);
-    virtual int clearAllFwDbgMsg();
-    virtual int do_reset(BOOL bFirstTime = TRUE);
-    virtual int do_sw_reset();
-    virtual int do_interface_reset();
-#ifdef _WINDOWS
-    virtual int send_wmi_cmd(SEND_RECEIVE_WMI* wmi) ;
-    virtual int recieve_wmi_event(SEND_RECEIVE_WMI* evt) ;
-
-    virtual int SetDriverMode(int newState, int &oldState, int &payload);
-    virtual int GetDriverMode(int &currentState);
-#endif // _WINDOWS
-    virtual int register_driver_mailbox_event(HANDLE* pMailboxEventHandle );
-    virtual int register_driver_device_events(INT_PTR hDnEvent, INT_PTR hUpEvent, INT_PTR hUnplugEvent, INT_PTR hSysAssertEvent);
-    virtual int unregister_driver_device_events();
-    virtual int register_driver_device_event(INT_PTR hEvent, int eventId, int deviceId);
-    virtual int register_device_unplug2(INT_PTR hEvent);
-    virtual int unregister_device_unplug2();
-    virtual int setMpDriverLogLevels(ULONG logModulesEnableMsk, ULONG logModuleLevelsMsk[WILO_DRV_NUM_LOG_COMPS]);
-    virtual int alloc_pmc(int num_of_descriptors, int size_of_descriptor);
-
-    int		reset_complete();
-    void	Open();
-    int		InternalCloseDevice();
-
-    /*virtual int startSampling(
-      DWORD* pRegsArr,
-      DWORD regArrSize,
-      DWORD interval,
-      DWORD maxSampling,
-      DWORD transferMethod);
-      virtual int stopSampling();
-      virtual int getSamplingData(DWORD** pDataSamples);*/
-
-    // 0 - not closed
-    // 1 - need to be close
-    // 2 - close
-    DWORD	m_close_state;
-    // 0 - not opened
-    // 1 - need to be open
-    // 2 - open
-    DWORD	m_open_state;
-
-private:
-    void rr32(DWORD addr, DWORD num_repeat, DWORD *arrBlock);
-    int ReOpen();
-    bool try2open(int timeout);
-
-private:
-    static void SamplingThreadProc(void *pDeviceAccss);
-    static void PciPluginThreadProc(void *pDeviceAccss);
-
-    // handle to the control device in wPci driver
-    CIoctlDev			IoctlDev;
-
-    // true if device is Local (wPciL)
-    // false if device is remote (wPciR)
-    bool		bIsLocal;
-
-    DWORD		dwBaseAddress;
-
-};
diff --git a/debug-tools/lib/WlctPciAcss/PciPluginThreadXFace.h b/debug-tools/lib/WlctPciAcss/PciPluginThreadXFace.h
deleted file mode 100644
index fc5937d..0000000
--- a/debug-tools/lib/WlctPciAcss/PciPluginThreadXFace.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "Thread.h"
-
-class CPciDeviceAccess;
-
-class IWlctPluginThread : public CWlctThread
-{
-public:
-  IWlctPluginThread(CPciDeviceAccess *pciDeviceAccess)
-    : CWlctThread(GlobalPluginThreadMain, this), pAccess(pciDeviceAccess)
-  {
-
-  }
-  virtual ~IWlctPluginThread() {;}
-
-  virtual void PluginThreadMain() = 0;
-
-protected:
-  CPciDeviceAccess *pAccess;
-
-  static void GlobalPluginThreadMain(void *p);
-};
diff --git a/debug-tools/lib/WlctPciAcss/Util.h b/debug-tools/lib/WlctPciAcss/Util.h
deleted file mode 100644
index 88a6fa4..0000000
--- a/debug-tools/lib/WlctPciAcss/Util.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "wlct_os.h"
-
-class Util
-{
-public:
-	static bool getFileVersionInfo(const TCHAR *fileNameFillPath, int &mjr, int &mnr, int &mnt, int &build);
-	static BOOL IsNumeric(LPCTSTR pszString, BOOL bIgnoreColon);
-	static DWORD ReadRegistrySettings(LPCTSTR lpszRegistryPath, LPCTSTR valName);
-	static DWORD WriteRegistrySettings(LPCTSTR lpszRegistryPath, LPCTSTR valName, DWORD val);
-	static int   IsWlctDevicePlugin();
-//	static bool Util::GetWlstPluggedInDevice();
-	static bool ICHDisableEnable();
-	static bool GetPciControllerDevicePath(TCHAR* devicePath);
-
-	// perfrom atomic change value, to acquire resource!
-	// if VAR != FLAG_VALUE, then set VAR to FLAG_VALUE.
-	// loop until timeout (milisec). return success in acheiving resource
-	// Assumes that FLAG_VALUE should be diffrent then current value stored in VAR
-	// turn keepWaiting on to wait infinite
-
-	static BOOL timedResourceInterLockExchange ( LONG* var, LONG flag_value, int timeout, bool keepWaiting );
-
-	static BOOL Is64BitWindows();
-
-private:
-	Util(void);
-	~Util(void);
-};
-
-#ifdef _WINDOWS
-#include <setupapi.h>
-#include <cfgmgr32.h>
-
-typedef HKEY (__stdcall SETUPDIOPENDEVREGKEY)(HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM);
-typedef BOOL (__stdcall SETUPDICLASSGUIDSFROMNAME)(LPCTSTR, LPGUID, DWORD, PDWORD);
-typedef BOOL (__stdcall SETUPDIDESTROYDEVICEINFOLIST)(HDEVINFO);
-typedef BOOL (__stdcall SETUPDIENUMDEVICEINFO)(HDEVINFO, DWORD, PSP_DEVINFO_DATA);
-typedef HDEVINFO (__stdcall SETUPDIGETCLASSDEVS)(LPGUID, LPCTSTR, HWND, DWORD);
-typedef BOOL (__stdcall SETUPDIGETDEVICEREGISTRYPROPERTY)(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD);
-typedef DWORD (__stdcall CM_GET_DEVICE_ID)(DEVINST, PTCHAR, ULONG, ULONG);
-#endif
diff --git a/debug-tools/lib/WlctPciAcss/WlctPciAcss.cpp b/debug-tools/lib/WlctPciAcss/WlctPciAcss.cpp
deleted file mode 100644
index 1a6cf95..0000000
--- a/debug-tools/lib/WlctPciAcss/WlctPciAcss.cpp
+++ /dev/null
@@ -1,1544 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "WlctPciAcss.h"
-#include "WlctPciAcssHelper.h"
-#include "wlct_os.h"
-#include "DeviceAccess.h"
-#include "PciDeviceAccess.h"
-#ifdef _WINDOWS
-#include "JtagDeviceAccess.h"
-#include "SerialDeviceAccess.h"
-#endif
-#include "MemoryAccess.h"
-#include "Util.h"
-
-#ifdef _WINDOWS
-#define WIGIG_REGISTRY_PATH _T("Software\\QualcommAtheros\\WIGIG")
-#endif
-
-using namespace std;
-
-#define WLCT_IFACE_NAME_LEN 256
-#define BL_READY_TIMEOUT_MS 1000
-#define BL_READY_WAIT_INTERVAL_MS 20
-
-WLCTPCIACSS_API int GetMyVersion(WLCT_DLL_VERSION *pVer)
-{
-	return GetPciAcssVersion(pVer);
-}
-
-WLCTPCIACSS_API bool wPciDisableEnable()
-{
-	return Util::ICHDisableEnable();
-}
-
-// return 0 for success
-WLCTPCIACSS_API int GetInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
-{
-	*ReturnItems = 0;
-//	int ret = 0;
-#ifdef _WINDOWS
-#ifndef NO_JTAG
-	if (!jtagLoaded) {
-		if (!load_jtag_dll()) {
-			printf("jTag DLL were not found, skipping jTag interfaces...\n");
-		}
-	}
-#endif
-#endif
-
-	for (int i = 0; i < MAX_INTERFACES; i++)
-	{
-		memset(ifList->list[i].ifName, 0, MAX_IF_NAME_LENGTH);
-	}
-
-#ifdef _WINDOWS
-	LOG_MESSAGE_INFO(_T("Checking registry for SkipSerialInterfaces register"));
-	DWORD dwSkip = Util::ReadRegistrySettings(WIGIG_REGISTRY_PATH, _T("SkipSerialInterfaces"));
-	if (dwSkip == (DWORD)-1)
-	{
-		LOG_MESSAGE_INFO(_T("SkipSerialInterfaces not found, adding registry key with default set to skip serial interfaces scan"));
-		dwSkip = 0;
-		Util::WriteRegistrySettings(WIGIG_REGISTRY_PATH, _T("SkipSerialInterfaces"), dwSkip);
-	}
-	else if (dwSkip == 0)
-	{
-		LOG_MESSAGE_INFO(_T("Get Interfaces for Serial"));
-		GetSerialInterfaces(ifList, ReturnItems);
-	}
-	else
-	{
-		LOG_MESSAGE_INFO(_T("SkipSerialInterfaces registry key found, skipping serial interface scan"));
-	}
-#endif
-
-	LOG_MESSAGE_INFO(_T("Get Interfaces for PCI"));
-	GetPciInterfaces(ifList, ReturnItems);
-
-#ifdef _WINDOWS
-#ifndef NO_JTAG
-	if (jtagLoaded)
-	{
-		LOG_MESSAGE_INFO(_T("Get Interfaces for jTag"));
-		GetJtagInterfaces(ifList, ReturnItems);
-	}
-#endif
-
-#ifndef NO_SERIAL
-	//GetSerialInterfaces(ifList, ReturnItems);
-#endif
-
-#endif
-
-	printf("Found %d interfaces \n",*ReturnItems);
-
-	return 0;
-}
-
-WLCTPCIACSS_API int StrGetInterfaces(char* ifListStr, int capacity)
-{
-    INTERFACE_LIST ifList;
-    int ReturnItems;
-    int ret = GetInterfaces(&ifList, &ReturnItems);
-    WLCT_UNREFERENCED_PARAM(ret);
-
-    std::ostringstream ifListBuilder;
-
-    for (int item = 0; item < ReturnItems; item++)
-    {
-        ifListBuilder << ifList.list[item].ifName << ' ';
-    }
-
-    int ifListActualLength = _snprintf(ifListStr, capacity, "%s", ifListBuilder.str().c_str());
-    if (ifListActualLength >= capacity)
-    {
-        LOG_MESSAGE_ERROR(
-            _T("Error filling interface list: %S, insufficient buffer capacity: %d\n"),
-            ifListBuilder.str().c_str(), capacity);
-        return 1;
-    }
-
-    LOG_MESSAGE_INFO(_T("Interfaces returned: %S"), ifListStr);
-    return 0;
-}
-
-//	NAME OF FUNCTION: CreateDeviceAccessHandler
-//	CREDIT:
-//	PURPOSE:
-//		The function will create and will initialize an access of read and write
-//		to Wilocity hardware. According to tchDeviceName it will interpret the
-//		access type (COM port, PCIe driver or Jtag)
-//
-//	PARAMETERS:
-//	name				type	value/reference		description
-// ---------------------------------------------------------------------
-//	tchDeviceName    TCHAR*  reference			the name of the access interface
-//	devType			int		value				the hardware type (MARLON)
-//
-//	RETURN VALUE:
-//	name         type	description
-//	handle / pointer to the access object.
-//
-//	NOTE:
-//		After calling this
-// ---------------------------------------------------------------------
-//	func return	void*	the overall total enrollment for the university
-//
-//	CALLS TO: This is a factory method. According to the device name it interprets
-//		the right interface and create a new object.
-//
-// CALLED FROM: main
-//
-// METHOD: The following is a factory.
-
-WLCTPCIACSS_API int CreateDeviceAccessHandler(const char* deviceName, DType devType, void** pDeviceAccess)
-{
-	LOG_STACK_ENTER;
-	IDeviceAccess* pIDeviceAccss = NULL;
-	const TCHAR* const delimit = _T("!");
-
-	TCHAR *tchDeviceName;
-
-	TCHAR *next_token = NULL;
-	DType devTypeFromInterface = devType;
-	TCHAR tchInterfaceName[WLCT_IFACE_NAME_LEN];
-	TCHAR tchOriginalInterfaceName[WLCT_IFACE_NAME_LEN];
-
-    // tchInterfaceName may be not null-terminated after calling _tcscpy_s()
-	_tcscpy_s(tchInterfaceName, WLCT_IFACE_NAME_LEN, TSTR_ARG(deviceName));
-	tchInterfaceName[WLCT_IFACE_NAME_LEN - 1] = '\0';
-
-	_tcscpy_s(tchOriginalInterfaceName, WLCT_IFACE_NAME_LEN, TSTR_ARG(deviceName));
-	//tchOriginalInterfaceName[WLCT_IFACE_NAME_LEN - 1] = '\0';
-
-	LOG_MESSAGE_INFO(_T("CreateDeviceAccessHandler for interface named: %s"), tchInterfaceName);
-
-	tchDeviceName = _tcstok_s( tchInterfaceName, delimit, &next_token);
-
-	if (!tchDeviceName)
-	{
-		LOG_MESSAGE_ERROR(_T("No device name found"));
-		return WLCT_OS_ERROR_NOT_SUPPORTED;
-	}
-
-	if (_tcsstr(tchDeviceName, _T("wPci")) == tchDeviceName ||
-            _tcsstr(tchDeviceName, _T("wpci")) == tchDeviceName)
-	{
-            if (devTypeFromInterface != devType)
-            {
-                return WLCT_OS_ERROR_NOT_SUPPORTED;
-            }
-			LOG_MESSAGE_INFO(_T("wPci Interface detected"));
-            pIDeviceAccss = new CPciDeviceAccess(tchDeviceName, devType);
-	}
-	else if (_tcsstr(tchDeviceName, _T("wMp")) == tchDeviceName ||
-            _tcsstr(tchDeviceName, _T("wmp")) == tchDeviceName)
-	{
-            if (devTypeFromInterface != devType)
-            {
-                return WLCT_OS_ERROR_NOT_SUPPORTED;
-            }
-			LOG_MESSAGE_INFO(_T("wMp Interface detected"));
-            pIDeviceAccss = new CPciDeviceAccess(tchDeviceName, devType);
-	}
-	else if (_tcsstr(tchDeviceName, _T("wEP")) == tchDeviceName ||
-            _tcsstr(tchDeviceName, _T("wep")) == tchDeviceName)
-	{
-			LOG_MESSAGE_INFO(_T("wEP Interface detected"));
-            pIDeviceAccss = new CPciDeviceAccess(tchOriginalInterfaceName, devType);
-	}
-	else if (_tcsstr(tchDeviceName, _T("wController")) == tchDeviceName ||
-            _tcsstr(tchDeviceName, _T("wcontroller")) == tchDeviceName)
-	{
-            if (devTypeFromInterface != devType)
-            {
-                return WLCT_OS_ERROR_NOT_SUPPORTED;
-            }
-			LOG_MESSAGE_INFO(_T("wController Interface detected"));
-            pIDeviceAccss = new CPciDeviceAccess(tchDeviceName, devType);
-	}	// acceptable format is: com3, COM3
-	else if (_tcsstr(tchDeviceName, _T("COM")) == tchDeviceName ||
-            _tcsstr(tchDeviceName, _T("com")) == tchDeviceName)
-	{
-		if (devTypeFromInterface != devType)
-		{
-			return WLCT_OS_ERROR_NOT_SUPPORTED;
-		}
-
-#ifdef _WINDOWS
-		pIDeviceAccss = new CSerialDeviceAccess(tchDeviceName, devType);
-		pIDeviceAccss->SetLastError(0);
-#else
-                return WLCT_OS_ERROR_NOT_SUPPORTED;
-#endif
-	}
-	else /*if (_tcsicmp(tchDeviceName, _T("wjtag")) == 0)*/
-	{
-            if (devTypeFromInterface != devType)
-            {
-                return WLCT_OS_ERROR_NOT_SUPPORTED;
-            }
-#ifdef _WINDOWS
-#ifndef NO_JTAG
-            pIDeviceAccss = new CJtagDeviceAccess(tchDeviceName, devType);
-            if (pIDeviceAccss->lastError == WLCT_OS_ERROR_OPEN_FAILED)
-            {
-                printf("JTAG CJtagDeviceAccess creation failed!\n");
-                return WLCT_OS_ERROR_NOT_SUPPORTED;
-            }
-#endif
-#else
-            return WLCT_OS_ERROR_NOT_SUPPORTED;
-#endif
-	}
-
-        // Sanity check - pIDeviceAccss should be set according to the access type in the above block
-        if (!pIDeviceAccss)
-        {
-            LOG_MESSAGE_ERROR(_T("No device access handler is set"));
-            return WLCT_OS_ERROR_NOT_SUPPORTED;
-        }
-
-	// assume device type = unknown and search for correct device type
-	pIDeviceAccss->SetDeviceStep(STEP_NONE);
-
-	DWORD rev_id_address = 0x880B34;
-	DWORD dft_signature_address = 0x800C;
-	DWORD val = 0;
-
-	int ret = WlctAccssRead(pIDeviceAccss, rev_id_address, val);
-	LOG_MESSAGE_INFO(_T("RevID on [%S] is [0x%X]"),deviceName,val);
-	if (ret == 0 && val != 0xFFFFFFFF)
-	{
-		if (devType == MST_MARLON)
-		{
-			if (val == 0x612072F)
-			{
-				pIDeviceAccss->SetDeviceStep(MARLON_STEP_B0);
-				LOG_MESSAGE_INFO(_T("MARLON STEP B0"));
-			}
-
-			/* This is not really Marlon, it is a DFT device and it should have
-				been a different gateway (not a step inside Marlon) */
-			else if (val == 0x0) // DFT
-			{
-				int ret = WlctAccssRead(pIDeviceAccss, dft_signature_address, val);
-				if (ret == 0 && val == 0xCE4)
-				{
-					pIDeviceAccss->SetDeviceStep(DFT_STEP);
-					LOG_MESSAGE_INFO(_T("DFT STEP"));
-				}
-			}
-			else
-			{
-
-				//for now always use marlon as B0
-
-				// Device doesn't match the device type MST_MARLON
-				LOG_MESSAGE_INFO(_T("NOT Marlon, RevID = [0x%X], closing handler.."),val);
-				pIDeviceAccss->CloseDevice();
-				return WLCT_OS_ERROR_NOT_SUPPORTED;
-			}
-		}
-		else if (devType == MST_SPARROW)
-		{
-			if (val == 0x0632072F)
-			{
-				pIDeviceAccss->SetDeviceStep(SPARROW_STEP_A0);
-				LOG_MESSAGE_INFO(_T("SPARROW STEP A0"));
-			}
-			else if(val == 0x1632072F)
-			{
-				pIDeviceAccss->SetDeviceStep(SPARROW_STEP_A1);
-				LOG_MESSAGE_INFO(_T("SPARROW STEP A1"));
-			}
-			else if (val == 0x2632072F)
-			{
-				pIDeviceAccss->SetDeviceStep(SPARROW_STEP_B0);
-				LOG_MESSAGE_INFO(_T("SPARROW STEP B0"));
-			}
-			else
-			{
-				LOG_MESSAGE_INFO(_T("Unknown RevID = [0x%X] "),val);
-				// This case is for future unrecognized devices, for example, MST_NONE
-				pIDeviceAccss->SetDeviceStep(STEP_NONE);
-				LOG_MESSAGE_INFO(_T("UNKNOWN DEVICE found, assuming it is Sparrow's next step"));
-				//pIDeviceAccss->CloseDevice();
-				//return WLCT_OS_ERROR_NOT_SUPPORTED;
-			}
-		}
-	}
-	else
-	{
-		pIDeviceAccss->SetLastError(-1);
-	}
-
-	*pDeviceAccess = (void*)pIDeviceAccss;
-	return pIDeviceAccss->GetLastError();
-}
-
-WLCTPCIACSS_API int CloseDeviceAccessHandler(void* pDeviceAccss)
-{
-	int res = 0;
-	IDeviceAccess* pIDevice = (IDeviceAccess*)pDeviceAccss;
-	if (pIDevice != NULL)
-	{
-		__TRY
-		{
-			pIDevice->CloseDevice();
-            #ifdef _WINDOWS
-            delete pIDevice;
-            #else
-			pIDevice = NULL;
-            #endif
-		}
-		__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-		{
-			LOG_MESSAGE_ERROR(_T("got exception"));
-			res = -1;
-		}
-	}
-	return res;
-}
-
-#ifdef _WINDOWS
-WLCTPCIACSS_API int WlctAccssSetDriverMode(void* pDeviceAccss, int newState, int & oldState, int &payloadResult){
-	if(pDeviceAccss == NULL){
-		return -1;
-	}
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		LOG_MESSAGE_ERROR(_T("Could not get lock for PCI access"));
-		return -1;
-	}
-
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->SetDriverMode(newState, oldState, payloadResult);
-		else
-			res = -1;
-
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception on Mode Change"));
-		res = -1;
-		oldState = -1;
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-		return res;
-}
-
-WLCTPCIACSS_API int WlctAccssGetDriverMode(void* pDeviceAccss, int & oldState){
-	if(pDeviceAccss == NULL){
-		return -1;
-	}
-	int res = 0;
-	int got_resource;
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		LOG_MESSAGE_ERROR(_T("Could not get lock for PCI access"));
-		return -1;
-	}
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->GetDriverMode(oldState);
-		else
-			res = -1;
-
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception on Mode Change"));
-		res = -1;
-		oldState = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-#endif //_WINDOWS
-
-WLCTPCIACSS_API int WlctAccssRead(void* pDeviceAccss, DWORD addr, DWORD & val)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	if (addr == BAUD_RATE_REGISTER)
-		if (((IDeviceAccess*)pDeviceAccss)->GetDeviceStep() == DFT_STEP)
-		{
-			DWORD baud_rate = 350; // expected baud rate value from DFT
-			val = baud_rate;
-			return 0;
-		}
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		res = accssRead(pDeviceAccss, addr, val);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	LOG_MESSAGE_DEBUG(_T("%S [addr 0x%X] [val %d]"), __FUNCTION__, addr, val);
-	return res;
-}
-
-WLCTPCIACSS_API int accssRead(void* pDeviceAccss, DWORD addr, DWORD & val) {
-
-	return ((IDeviceAccess*)pDeviceAccss)->r32(addr, val);
-}
-
-
-WLCTPCIACSS_API int WlctAccssAllocPmc(void* pDeviceAccss, DWORD size, DWORD numOfDescriptors)
-{
-	if (pDeviceAccss == NULL)
-        {
-            LOG_MESSAGE_ERROR(_T("Cannot allocate PMC descriptors - No device access handler"));
-            return -1;
-        }
-
-	// Get Resource
-	int got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-            LOG_MESSAGE_ERROR(_T("Cannot allocated PMC descriptors - Cannot obtain a lock"));
-            return -1;
-	}
-
-        int res = 0;
-	__TRY
-	{
-		res = ((IDeviceAccess*)pDeviceAccss)->alloc_pmc(size, numOfDescriptors);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-            LOG_MESSAGE_ERROR(_T("Cannot allocated PMC descriptors - Got exception"));
-            res = -1;
-            ((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	LOG_MESSAGE_DEBUG(_T("Allocated PMC descriptors. status: %d"), res);
-	return res;
-}
-
-WLCTPCIACSS_API int SwReset(void* pDeviceAccss)
-{
-	UINT32 bootLoadReady;
-	UINT i, maxIterations;
-	USER_RGF_BL_INFO_VER_0 blInfo;
-
-	DWORD readVal;
-	int res = 0;
-
-	LOG_MESSAGE_INFO(_T("SwReset Initiated..."));
-
-	/* Clear MAC link up */
-	accssSet32(pDeviceAccss, USER_RGF_HP_CTRL, BIT(15));
-	accssSet32(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_MASK_0, BIT(6));	/* hpal_perst_from_pad_src_n_mask */
-	accssSet32(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_MASK_0, BIT(7));	/* car_perst_rst_src_n_mask */
-
-	/* Halt CPU */
-	accssWrite(pDeviceAccss, USER_RGF_USER_CPU_0, BIT(1));
-	accssWrite(pDeviceAccss, USER_RGF_MAC_CPU_0, BIT(1));
-
-
-	/* clear all boot loader "ready" bits */
-	accssWrite(pDeviceAccss, USER_RGF_BL_READY, 0); //USER_RGF_BL_READY
-
-	/* Clear Fw Download notification */
-	accssClear32(pDeviceAccss, USER_RGF_USAGE_6, BIT(0)); //USER_RGF_USAGE_6)
-
-	// Sparrow only register configuration
-	accssSet32(pDeviceAccss, USER_RGF_CAF_OSC_CONTROL, BIT_CAF_OSC_XTAL_EN); //USER_RGF_CAF_OSC_CONTROL
-
-
-
-	LOG_MESSAGE_INFO(_T("Sleep: waiting for XTAL stabilization..."));
-	/* XTAL stabilization should take about 3ms */
-	sleep_ms(XTAL_STABLE_WAIT_MS);
-	LOG_MESSAGE_INFO(_T("Sleep done: Checking XTAL stabilization..."));
-	res = accssRead(pDeviceAccss, USER_RGF_CAF_PLL_LOCK_STATUS, readVal);	//USER_RGF_CAF_PLL_LOCK_STATUS
-
-	if (!(readVal & BIT_CAF_OSC_DIG_XTAL_STABLE)) {	//BIT_CAF_OSC_DIG_XTAL_STABLE
-            LOG_MESSAGE_ERROR(_T("%s: BIT_CAF_OSC_DIG_XTAL_STABLE=0x%x\n"), __FUNCTION__, BIT_CAF_OSC_DIG_XTAL_STABLE);
-            LOG_MESSAGE_ERROR(_T("%s: Xtal stabilization timeout USER_RGF_CAF_PLL_LOCK_STATUS val=0x%x\n"), __FUNCTION__, readVal);
-            return -1;
-	}
-
-	/* switch 10k to XTAL*/
-	accssClear32(pDeviceAccss, USER_RGF_SPARROW_M_4, BIT_SPARROW_M_4_SEL_SLEEP_OR_REF); //USER_RGF_SPARROW_M_4
-
-	/* 40 MHz */
-	accssClear32(pDeviceAccss, USER_RGF_CLKS_CTL_0, BIT_USER_CLKS_CAR_AHB_SW_SEL);  //USER_RGF_CLKS_CTL_0
-
-
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_0, 0x3ff81f); //USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_0
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_1, 0xf);	//USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_1
-
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_2, 0xFE000000);	//USER_RGF_CLKS_CTL_SW_RST_VEC_2
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_1, 0x0000003F); //USER_RGF_CLKS_CTL_SW_RST_VEC_1
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_3, 0x000000f0); //USER_RGF_CLKS_CTL_SW_RST_VEC_3
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_0, 0xFFE7FC00);	//USER_RGF_CLKS_CTL_SW_RST_VEC_0
-
-	/* Sparrow Exit SW Reset */
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_0, 0x0);	//USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_0
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_1, 0x0);	//USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_1
-
-
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_2, 0);	//USER_RGF_CLKS_CTL_SW_RST_VEC_2
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_1, 0); //USER_RGF_CLKS_CTL_SW_RST_VEC_1
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_3, 0); //USER_RGF_CLKS_CTL_SW_RST_VEC_3
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_0, 0);	//USER_RGF_CLKS_CTL_SW_RST_VEC_0
-
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_3, 0x00000003); //USER_RGF_CLKS_CTL_SW_RST_VEC_3
-	/* reset A2 PCIE AHB */
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_2, 0x00008000);	//USER_RGF_CLKS_CTL_SW_RST_VEC_2
-
-	/* TODO: check order here!!! Erez code is different */
-	accssWrite(pDeviceAccss, USER_RGF_CLKS_CTL_SW_RST_VEC_0, 0x0);	//USER_RGF_CLKS_CTL_SW_RST_VEC_0
-
-	// Now wait for device ready, use HW_MACHINE register for this
-	maxIterations = BL_READY_TIMEOUT_MS / BL_READY_WAIT_INTERVAL_MS;
-
-
-	LOG_MESSAGE_INFO(_T("Checking bootloader..."));
-
-	for (i = maxIterations; i; --i)
-	{
-
-		//First wait to let the register have the stabilization time it needs
-		sleep_ms(BL_READY_WAIT_INTERVAL_MS);
-
-		bootLoadReady = accssRead(pDeviceAccss, USER_RGF_BL_READY, readVal);	//USER_RGF_BL_READY
-		(void)bootLoadReady;
-
-		if (readVal == BL_BIT_READY)//BL_BIT_READY
-		{
-			break;
-		}
-	}
-
-	LOG_MESSAGE_INFO(_T("Wait on register USER_RGF_BL_READY for %d msec\n"), (maxIterations - i)*BL_READY_WAIT_INTERVAL_MS);
-
-	// check for long wait
-	if (0 == i)
-	{
-            LOG_MESSAGE_ERROR(_T("%s: timeout on register USER_RGF_BL_READY\n"), __FUNCTION__);
-            return -1;
-	}
-
-	// read info from BL
-	void* pBlInfo = &blInfo; // keep the address in temporary variable to prevent false positive warning
-	hwCopyFromIO(pBlInfo, pDeviceAccss, USER_RGF_BL_START_OFFSET, sizeof(blInfo));
-
-
-	LOG_MESSAGE_INFO(_T("Boot loader information: Ready=0x%x, StructVersion=0x%x, RfType=0x%x BaseBandType=0x%x\n"),
-		blInfo.Ready, blInfo.StructVersion, blInfo.RfType, blInfo.BaseBandType);
-
-	LOG_MESSAGE_INFO(_T("Boot loader macaddr=%02x:%02x:%02x:%02x:%02x:%02x\n"),
-		blInfo.MacAddr[0], blInfo.MacAddr[1], blInfo.MacAddr[2],
-		blInfo.MacAddr[3], blInfo.MacAddr[4], blInfo.MacAddr[5]);
-
-	accssClear32(pDeviceAccss, USER_RGF_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); //USER_RGF_CLKS_CTL_0
-
-
-	if (blInfo.StructVersion > 0)
-	{
-		USER_RGF_BL_INFO_VER_1 blInfoVer1;
-		// print the BL version
-		void* pBlInfo1 = &blInfoVer1; // keep the address in temporary variable to prevent false positive warning
-		hwCopyFromIO(pBlInfo1, pDeviceAccss, USER_RGF_BL_START_OFFSET, sizeof(blInfoVer1));
-
-		LOG_MESSAGE_INFO(_T("Boot Loader build %d.%d.%d.%d\n"),
-			blInfoVer1.VersionMajor, blInfoVer1.VersionMinor,
-			blInfoVer1.VersionSubminor, blInfoVer1.VersionBuild);
-	}
-
-	LOG_MESSAGE_INFO(_T("SwReset Done..."));
-
-	return res;
-}
-
-WLCTPCIACSS_API int InterfaceReset(void* pDeviceAccss)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		res = ((IDeviceAccess*)pDeviceAccss)->do_interface_reset();
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	LOG_MESSAGE_DEBUG(_T("Interface Reset flow end"));
-	return res;
-}
-
-/* helper function copied and modified from the driver
-	we can use this to read info from the boot loader
-*/
-WLCTPCIACSS_API void hwCopyFromIO( void* dst, void* pDeviceAccss, DWORD src, UINT32 len)
-{
-	const size_t regSizeInBytes = 4;
-	UINT32 regCount = (len + regSizeInBytes - 1) / regSizeInBytes;
-	std::vector<DWORD> readBuffer(regCount);
-
-	for (size_t i = 0U; i < readBuffer.size(); ++i)
-	{
-		((IDeviceAccess*)pDeviceAccss)->r32(src + i, readBuffer[i]);
-	}
-
-	memcpy(dst, &readBuffer[0], len);
-}
-
-WLCTPCIACSS_API int WlctAccssWrite(void* pDeviceAccss, DWORD addr, DWORD val)
-{
-	int res = 0;
-	int got_resource;
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return -1;
-	}
-
-	__TRY
-	{
-		res = accssWrite(pDeviceAccss,addr,val);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	LOG_MESSAGE_DEBUG(_T("%S [addr 0x%X] [val %d]"), __FUNCTION__, addr, val);
-	return res;
-}
-
-WLCTPCIACSS_API int accssWrite(void* pDeviceAccss, DWORD addr, DWORD val)
-{
-
-	return ((IDeviceAccess*)pDeviceAccss)->w32((addr), val);
-
-}
-
-/* accssSet32 is a modifiled write function based on logic from the driver
-	First read from the addr
-	Set  the readVal to the desired val with |= val
-	Write readVal back into addr
-*/
-WLCTPCIACSS_API int accssSet32(void* pDeviceAccss, DWORD addr, DWORD val) {
-	int res = 0;
-	DWORD readVal;
-
-	res = accssRead(pDeviceAccss, addr, readVal);
-	readVal |= val;
-	res = accssWrite(pDeviceAccss, addr, readVal);
-
-	return res;
-}
-
-/* accssClear32 is a modifiled write function based on logic from the driver
-	First read from the addr
-	Clear the readVal to the desired val with &= ~val
-	Write readVal back into addr
-*/
-WLCTPCIACSS_API int accssClear32(void* pDeviceAccss, DWORD addr, DWORD val) {
-	int res = 0;
-	DWORD readVal;
-
-	res = accssRead(pDeviceAccss, addr, readVal);
-	readVal &= ~val;
-	res = accssWrite(pDeviceAccss, addr, readVal);
-
-	return res;
-}
-
-WLCTPCIACSS_API bool isInit(void* pDeviceAccss)
-{
-	if (pDeviceAccss == NULL)
-		return false;
-
-	bool res = 0;
-	__TRY
-	{
-		res = ((IDeviceAccess*)pDeviceAccss)->isInitialized();
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = false;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API int writeBlock(void* pDeviceAccss, DWORD addr, DWORD blockSize, const char *arrBlock)
-{
-	int got_resource;
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return -1;
-	}
-
-
-	int res = 0;
-	__TRY
-	{
-		LOG_MESSAGE_DEBUG(_T("start running"));
-		res = ((IDeviceAccess*)pDeviceAccss)->wb(addr, blockSize, arrBlock);
-		LOG_MESSAGE_DEBUG(_T("Leaving"));
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-WLCTPCIACSS_API int readBlock(void* pDeviceAccss, DWORD addr, DWORD blockSize, char *arrBlock)
-{
-	int got_resource;
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return -1;
-	}
-
-
-	int res = 0;
-	__TRY
-	{
-
-		LOG_MESSAGE_DEBUG(_T("start running"));
-
-		res = ((IDeviceAccess*)pDeviceAccss)->rb(addr, blockSize, arrBlock);
-		LOG_MESSAGE_DEBUG(_T("Leaving"));
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-//
-// read repeat - will read from the same address num_repeat times
-// the result will store in arrBlock. arrBlock is an array of shorts with at least num_repeat entries.
-//
-WLCTPCIACSS_API int readRepeat(void* pDeviceAccss, DWORD addr, DWORD num_repeat, DWORD *arrBlock)
-{
-	int got_resource;
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return -1;
-	}
-
-
-	int res = 0;
-	__TRY
-	{
-		LOG_MESSAGE_DEBUG(_T("start running"));
-		res = ((IDeviceAccess*)pDeviceAccss)->rr(addr, USHORT(num_repeat), arrBlock);
-		LOG_MESSAGE_DEBUG(_T("Leaving"));
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-WLCTPCIACSS_API DType getDeviceType(void* pDeviceAccss)
-{
-	return ((IDeviceAccess*)pDeviceAccss)->GetDeviceType();
-}
-
-WLCTPCIACSS_API int getDbgMsg(void* pDeviceAccss, FW_DBG_MSG** pMsg)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	__TRY
-	{
-		res = ((IDeviceAccess*)pDeviceAccss)->getFwDbgMsg(pMsg);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API int clearAllFwDbgMsg(void* pDeviceAccss)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	__TRY
-	{
-		((IDeviceAccess*)pDeviceAccss)->clearAllFwDbgMsg();
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API int card_reset(void* pDeviceAccss)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	__TRY
-	{
-		((IDeviceAccess*)pDeviceAccss)->do_reset();
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API int startSampling(void* pDeviceAccss, DWORD* pRegsArr, DWORD regArrSize, DWORD interval, DWORD maxSampling, DWORD transferMethod)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	__TRY
-	{
-		((IDeviceAccess*)pDeviceAccss)->startSampling(pRegsArr, regArrSize, interval, maxSampling, transferMethod);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API int stopSampling(void* pDeviceAccss)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	__TRY
-	{
-		((IDeviceAccess*)pDeviceAccss)->stopSampling();
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API int getSamplingData(void* pDeviceAccss, DWORD** pDataSamples)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	__TRY
-	{
-		res = ((IDeviceAccess*)pDeviceAccss)->getSamplingData(pDataSamples);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API TCHAR* getInterfaceName(void* pDeviceAccss)
-{
-	if (pDeviceAccss == NULL)
-		return NULL;
-
-	TCHAR* szInfName = NULL;
-	__TRY
-	{
-		szInfName = ((IDeviceAccess*)pDeviceAccss)->GetInterfaceName();
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-	}
-	return szInfName;
-}
-
-#ifdef _WINDOWS
-#ifndef NO_JTAG
-WLCTPCIACSS_API int WlctAccssJtagSendDR(void* pDeviceAccss, DWORD num_bits, BYTE *arr_in, BYTE *arr_out)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (isInit(pDeviceAccss))
-		{
-			if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypeJTAG)
-			{
-				if (((IDeviceAccess*)pDeviceAccss)->GetDeviceType() == MST_MARLON)
-				{
-					res = ((CJtagDeviceAccess*)pDeviceAccss)->jtag_set_dr(arr_in, arr_out, num_bits);
-				}
-			}
-		}
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	//	LOG_MESSAGE_DEBUG(_T("%S [addr 0x%X] [val %d]"), __FUNCTION__, addr, val);
-	return res;
-}
-
-WLCTPCIACSS_API int WlctAccssJtagSendIR(void* pDeviceAccss, DWORD num_bits, BYTE *arr_in)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (isInit(pDeviceAccss))
-		{
-			if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypeJTAG)
-			{
-				if (((IDeviceAccess*)pDeviceAccss)->GetDeviceType() == MST_MARLON)
-				{
-					res = ((CJtagDeviceAccess*)pDeviceAccss)->jtag_set_ir(num_bits, arr_in);
-				}
-			}
-		}
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-//	LOG_MESSAGE_DEBUG(_T("%S [addr 0x%X] [val %d]"), __FUNCTION__, addr, val);
-	return res;
-}
-
-WLCTPCIACSS_API int JtagSetClockSpeed(void* pDeviceAccss, DWORD requestedFreq, DWORD* frqSet)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	__TRY
-	{
-		((CJtagDeviceAccess*)pDeviceAccss)->set_speed(requestedFreq, frqSet);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API int JtagPutTmsTdiBits(void* pDeviceAccss, BYTE *tms, BYTE *tdi, BYTE* tdo, UINT length)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	__TRY
-	{
-		((CJtagDeviceAccess*)pDeviceAccss)->direct_control(tms, tdi, tdo, length);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-	}
-	return res;
-}
-
-WLCTPCIACSS_API int JtagTmsShiftToReset(void* pDeviceAccss)
-{
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (isInit(pDeviceAccss))
-		{
-			if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypeJTAG)
-			{
-				if (((IDeviceAccess*)pDeviceAccss)->GetDeviceType() == MST_MARLON)
-				{
-					res = ((CJtagDeviceAccess*)pDeviceAccss)->jtag_reset();
-				}
-
-				if (((IDeviceAccess*)pDeviceAccss)->GetDeviceType() == MST_SPARROW)
-				{
-					res = ((CJtagDeviceAccess*)pDeviceAccss)->jtag_reset();
-				}
-			}
-		}
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	//	LOG_MESSAGE_DEBUG(_T("%S [addr 0x%X] [val %d]"), __FUNCTION__, addr, val);
-	return res;
-}
-#else // JTAG
-
-WLCTPCIACSS_API int JtagSetClockSpeed(void* pDeviceAccss, DWORD requestedFreq, DWORD* frqSet)
-{
-	return -1;
-}
-
-WLCTPCIACSS_API int JtagPutTmsTdiBits(void* pDeviceAccss, BYTE *tms, BYTE *tdi, BYTE* tdo, UINT length)
-{
-	return -1;
-}
-
-WLCTPCIACSS_API int JtagTmsShiftToReset(void* pDeviceAccss)
-{
-	return -1;
-}
-
-#endif // ifndef NO_JTAG
-#endif /* _WINDOWS */
-
-#ifdef _WINDOWS
-WLCTPCIACSS_API int WlctAccssSendWmiCmd(void* pDeviceAccss, SEND_RECEIVE_WMI* wmi)
-{
-	LOG_MESSAGE_INFO(_T("WlctAccssSendWmiCmd: 0x%X"),  (*wmi).uCmdId);
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->send_wmi_cmd(wmi);
-		else
-			res = -1;
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-WLCTPCIACSS_API int WlctAccssRecieveWmiEvent(void* pDeviceAccss, SEND_RECEIVE_WMI* evt)
-{
-	LOG_MESSAGE_INFO(_T("WlctAccssRecieveWmiEvent"));
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->recieve_wmi_event(evt);
-		else
-			res = -1;
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-WLCTPCIACSS_API int WlctAccssMpSetDriverLogLevels(void* pDeviceAccss, ULONG logModulesEnableMsk, ULONG logModuleLevelsMsk[WILO_DRV_NUM_LOG_COMPS])
-{
-	LOG_MESSAGE_INFO(_T("WlctAccssMpDriverLogLevels"));
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->setMpDriverLogLevels(logModulesEnableMsk, logModuleLevelsMsk);
-		else
-			res = -1;
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-#endif
-
-WLCTPCIACSS_API int WlctAccssRegisterDriverMailboxEvents(void* pDeviceAccss, HANDLE* pMailboxEventHandle )
-{
-	LOG_MESSAGE_INFO(_T("WlctAccssRegisterDriverMailboxEvents"));
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->register_driver_mailbox_event(pMailboxEventHandle);
-		else
-			res = -1;
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-
-
-WLCTPCIACSS_API int WlctAccssRegisterDriverDeviceEvents(void* pDeviceAccss, INT_PTR hDnEvent, INT_PTR hUpEvent, INT_PTR hUnplugEvent, INT_PTR hSysAssertEvent )
-{
-	LOG_MESSAGE_INFO(_T("WlctAccssRegisterDriverDeviceEvents"));
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->register_driver_device_events (hDnEvent, hUpEvent, hUnplugEvent, hSysAssertEvent);
-		else
-			res = -1;
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-WLCTPCIACSS_API int WlctAccssUnregisterDriverDeviceEvents(void* pDeviceAccss){
-	LOG_MESSAGE_INFO(_T("WlctAccssUnregisterDriverDeviceEvents"));
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->unregister_driver_device_events();
-		else
-			res = -1;
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-WLCTPCIACSS_API int WlctAccssRegisterDriverEvent(void* pDeviceAccss, INT_PTR event_ptr, int eventId, int appId)
-{
-	LOG_MESSAGE_INFO(_T("WlctAccssRegisterDriverDeviceEvent"));
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		if (((IDeviceAccess*)pDeviceAccss)->GetType() == IDeviceAccess::ETypePCI)
-			res = ((CPciDeviceAccess*)pDeviceAccss)->register_driver_device_event (event_ptr, appId, eventId);
-		else
-			res = -1;
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-
-}
-
-
-WLCTPCIACSS_API int WlctAccssRegisterDeviceForUnplug2Event(void* pDeviceAccss, INT_PTR event_ptr)
-{
-
-	LOG_MESSAGE_INFO(_T("WlctAccssRegisterDeviceForUnplug2Event"));
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-			res = ((CPciDeviceAccess*)pDeviceAccss)->register_device_unplug2 (event_ptr);
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
-WLCTPCIACSS_API int WlctAccssUnregisterDeviceForUnplug2Event(void* pDeviceAccss)
-{
-
-	LOG_MESSAGE_INFO(_T("WlctAccssUnregisterDeviceForUnplug2Event"));
-
-	if (pDeviceAccss == NULL)
-		return -1;
-
-	int res = 0;
-	int got_resource;
-
-	// Get Resource
-	got_resource = Util::timedResourceInterLockExchange(  &((((IDeviceAccess*)pDeviceAccss)->m_flag_busy)), true, 1000, false);
-	if (!got_resource)
-	{
-		return res;
-	}
-
-	__TRY
-	{
-		res = ((CPciDeviceAccess*)pDeviceAccss)->unregister_device_unplug2 ();
-	}
-	__EXCEPT(EXCEPTION_ACCESS_VIOLATION == GetExceptionCode())
-	{
-		LOG_MESSAGE_ERROR(_T("got exception"));
-		res = -1;
-		((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	}
-
-	((IDeviceAccess*)pDeviceAccss)->m_flag_busy = false;
-	return res;
-}
-
diff --git a/debug-tools/lib/WlctPciAcss/WlctPciAcss.h b/debug-tools/lib/WlctPciAcss/WlctPciAcss.h
deleted file mode 100644
index f25467a..0000000
--- a/debug-tools/lib/WlctPciAcss/WlctPciAcss.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <list>
-#include <queue>
-#include "wlct_os.h"
-#include "WlctPciAcssWmi.h"
-#include "public.h"
-
-#ifdef _WINDOWS
-#include "ioctl_if.h"
-typedef struct _FW_DBG_MSG
-{
-	std::string	msg;
-	SYSTEMTIME	timeStamp;
-}FW_DBG_MSG;
-#else
-#define FW_DBG_MSG int
-#endif
-
-typedef struct _SAMPLING_REGS
-{
-	DWORD		timeStamp; // GetTickCount
-	DWORD		regArr[0];
-}SAMPLING_REGS;
-
-#define MAX_DEVICE_TYPE_SUPPORTED 2
-typedef enum DType_t
-{
-	MST_NONE,
-	MST_SPARROW,   // added here to keep backward compatibility. some tools assume MARLON == 2, we don't brake this assumption
-	MST_MARLON,
-	MST_TALYN,
-	MST_LAST
-} DType;
-
-typedef enum DEVICE_STEP_t
-{
-	STEP_NONE,
-	MARLON_STEP_A0,
-	MARLON_STEP_B0,
-	SPARROW_STEP_A0,
-	SPARROW_STEP_A1,
-	SPARROW_STEP_B0,
-	DFT_STEP,
-	STEP_LAST
-} DEVICE_STEP;
-
-#define BAUD_RATE_REGISTER 0x880050
-
-#define MAX_IF_NAME_LENGTH 32
-typedef struct _INTERFACE_NAME
-{
-	char	ifName[MAX_IF_NAME_LENGTH];
-}INTERFACE_NAME;
-
-
-#define  MAX_INTERFACES 32
-typedef struct _INTERFACE_LIST
-{
-	INTERFACE_NAME	list[MAX_INTERFACES];
-}INTERFACE_LIST;
-
-typedef struct _WLCT_DLL_VERSION
-{
-	int major;
-	int minor;
-	int maintenance;
-	int build;
-
-}WLCT_DLL_VERSION;
-
-// The following ifdef block is the standard way of creating macros which make exporting
-// from a DLL simpler. All files within this DLL are compiled with the WLCTPCIACSS_EXPORTS
-// symbol defined on the command line. this symbol should not be defined on any project
-// that uses this DLL. This way any other project whose source files include this file see
-// WLCTPCIACSS_API functions as being imported from a DLL, whereas this DLL sees symbols
-// defined with this macro as being exported.
-
-#ifdef _WINDOWS
-#ifdef WLCTPCIACSS_EXPORTS
-#define WLCTPCIACSS_API __declspec(dllexport)
-#else
-#define WLCTPCIACSS_API __declspec(dllimport)
-#endif
-#endif
-
-#if defined(__GNUC__)
-#if defined(__i386)
-#define WLCTPCIACSS_API extern "C" __attribute__((cdecl))
-#else
-#define WLCTPCIACSS_API extern "C"
-#endif
-#endif
-
-// These are needed for wlanapi.h for pre-vista targets
-
-typedef UCHAR DOT11_MAC_ADDRESS[6];
-typedef DOT11_MAC_ADDRESS * PDOT11_MAC_ADDRESS;
-
-typedef struct
-{
-	UINT32 Ready;
-	UINT32 StructVersion;
-	UINT32 RfType;
-	UINT32 BaseBandType;
-	DOT11_MAC_ADDRESS MacAddr;
-	UINT8  Padding[2];
-}USER_RGF_BL_INFO_VER_0;
-
-typedef struct
-{
-	UINT32 Ready;
-	UINT32 StructVersion;
-	UINT32 RfType;
-	UINT32 BaseBandType;
-	DOT11_MAC_ADDRESS MacAddr;
-	UINT8	VersionMajor;       // 0x880A52 BL ver. major
-	UINT8	VersionMinor;       // 0x880A53 BL ver. minor
-	UINT16	VersionSubminor;    // 0x880A54 BL ver. subminor
-	UINT16	VersionBuild;		// 0x880A56 BL ver. build
-								// valid only for version 2 and above
-	UINT16  AssertCode;         // 0x880A58 BL Assert code
-	UINT16  AssertBlink;        // 0x880A5C BL Assert Branch
-	UINT16  Reserved[22];        // 0x880A60 - 0x880AB4
-	UINT16  MagicNumber;        // 0x880AB8 BL Magic number
-}USER_RGF_BL_INFO_VER_1;
-
-#define BIT(x) (1 << (x))
-
-// Register definitions - taken from the REG files. addresses are from FW point of view
-#define USER_RGF_USAGE_6		            0x880018
-
-// Boot loader registers
-#define USER_RGF_BL_START_OFFSET            0x880A3C
-#define USER_RGF_BL_READY		            USER_RGF_BL_START_OFFSET
-#define BL_BIT_READY                    BIT(0)
-
-// reset sequence related
-#define USER_RGF_HP_CTRL			        0x88265c
-#define USER_RGF_FW_DEDICATED_REG_REV_ID    0x880a8c
-#define PCIE_RGF_MAC_HW_ID_DB1          0x1
-#define PCIE_RGF_MAC_HW_ID_DB2          0x2
-#define USER_RGF_CLKS_CTL_SW_RST_MASK_0     0x880b14
-#define USER_RGF_MAC_CPU_0                  0x8801fc
-#define USER_RGF_USER_CPU_0                 0x8801e0
-#define USER_RGF_CLKS_CTL_SW_RST_VEC_0      0x880b04
-#define USER_RGF_CLKS_CTL_SW_RST_VEC_1      0x880b08
-#define USER_RGF_CLKS_CTL_SW_RST_VEC_2      0x880b0c
-#define USER_RGF_CLKS_CTL_SW_RST_VEC_3      0x880b10
-#define USER_RGF_LOS_COUNTER_CTL            0x882dc4
-#define USER_RGF_SERIAL_BAUD_RATE           0x880050
-#define USER_RGF_SERIAL_BAUD_RATE_READY 0x15e
-#define USER_RGF_PLL_CLR_LOS_COUNTER_CTL    0x882dc4
-#define USER_RGF_HW_MACHINE_STATE           0x8801dc
-#define HW_MACHINE_BOOT_DONE                0x3FFFFFD
-#define USER_RGF_CLKS_CTL_0                 0x880abc
-#define BIT_USER_CLKS_CAR_AHB_SW_SEL	    BIT(1) /* ref clk/PLL */
-#define BIT_USER_CLKS_RST_PWGD              BIT(11)
-
-#define USER_RGF_JTAG_DEVICE_TYPE           0x880B34
-#define USER_RGF_JTAG_DEVICE_SPARROW_A0				0x0632072F
-#define USER_RGF_JTAG_DEVICE_SPARROW_A1				0x1632072F
-#define USER_RGF_JTAG_DEVICE_SPARROW_B0				0x2632072F
-#define USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_0	(0x880c18)
-#define USER_RGF_CLKS_CTL_EXT_SW_RST_VEC_1	(0x880c2c)
-#define USER_RGF_SPARROW_M_4			(0x880c50) /* Sparrow */
-#define BIT_SPARROW_M_4_SEL_SLEEP_OR_REF	BIT(2)
-
-#define USER_RGF_CAF_ICR			            0x88946c /* struct RGF_ICR */
-#define RGF_CAF_ICR_ICR                         (USER_RGF_CAF_ICR+4)
-#define RGF_CAF_ICR_IMV                         (USER_RGF_CAF_ICR+16)
-#define USER_RGF_CAF_OSC_CONTROL		        0x88afa4
-#define BIT_CAF_OSC_XTAL_EN		BIT(0)
-#define USER_RGF_CAF_PLL_LOCK_STATUS		0x88afec
-#define BIT_CAF_OSC_DIG_XTAL_STABLE	BIT(0)
-
-#define XTAL_STABLE_WAIT_MS     0x7
-
-#define ALIGN_DOWN_BY(length, alignment) \
-    (length & ~(alignment - 1))
-
-#define ALIGN_UP_BY(length, alignment) \
-    (ALIGN_DOWN_BY((length + alignment - 1), alignment))
-
-WLCTPCIACSS_API int GetMyVersion(WLCT_DLL_VERSION *pVer);
-WLCTPCIACSS_API bool wPciDisableEnable();
-WLCTPCIACSS_API int GetInterfaces(INTERFACE_LIST* ifList, int* ReturnItems);
-WLCTPCIACSS_API int StrGetInterfaces(char* ifListStr, int capacity);
-WLCTPCIACSS_API int CreateDeviceAccessHandler(const char* deviceName, DType devType, void** pDeviceAccess);
-WLCTPCIACSS_API int CloseDeviceAccessHandler(void* pDeviceAccss);
-WLCTPCIACSS_API int SwReset(void* pDeviceAccss);
-WLCTPCIACSS_API int InterfaceReset(void* pDeviceAccss);
-WLCTPCIACSS_API int WlctAccssRead(void* pDeviceAccss, DWORD addr, DWORD & val);
-WLCTPCIACSS_API int WlctAccssWrite(void* pDeviceAccss, DWORD addr, DWORD val);
-WLCTPCIACSS_API bool isInit(void* pDeviceAccss);
-WLCTPCIACSS_API int writeBlock(void* pDeviceAccss, DWORD addr, DWORD blockSize, const char *arrBlock);
-WLCTPCIACSS_API int readBlock(void* pDeviceAccss, DWORD addr, DWORD blockSize, char *arrBlock);
-WLCTPCIACSS_API int readRepeat(void* pDeviceAccss, DWORD addr, DWORD num_repeat, DWORD *arrBlock);
-WLCTPCIACSS_API int getDbgMsg(void* pDeviceAccss, FW_DBG_MSG** pMsg);
-WLCTPCIACSS_API int clearAllFwDbgMsg(void* pDeviceAccss);
-WLCTPCIACSS_API int card_reset(void* pDeviceAccss);
-WLCTPCIACSS_API TCHAR* getInterfaceName(void* pDeviceAccss);
-WLCTPCIACSS_API DType getDeviceType(void* pDeviceAccss);
-WLCTPCIACSS_API int startSampling(void* pDeviceAccss, DWORD* pRegsArr, DWORD regArrSize, DWORD interval, DWORD maxSampling, DWORD transferMethod);
-WLCTPCIACSS_API int stopSampling(void* pDeviceAccss);
-WLCTPCIACSS_API int getSamplingData(void* pDeviceAccss, DWORD** pDataSamples);
-WLCTPCIACSS_API int SetMachineSpeed(void* pComDeviceAccss, DWORD baud_rate_target);
-#ifndef _ANDROID
-WLCTPCIACSS_API int WlctAccssJtagSendDR(void* pDeviceAccss, DWORD num_bits, BYTE *arr_in, BYTE *arr_out);
-WLCTPCIACSS_API int WlctAccssJtagSendIR(void* pDeviceAccss, DWORD num_bits, BYTE *arr_in);
-WLCTPCIACSS_API int JtagTmsShiftToReset(void* pDeviceAccss);
-WLCTPCIACSS_API int JtagPutTmsTdiBits(void* pDeviceAccss, BYTE *tms, BYTE *tdi, BYTE* tdo, UINT length);
-WLCTPCIACSS_API int JtagSetClockSpeed(void* pDeviceAccss, DWORD requestedFreq, DWORD* frqSet);
-#endif
-#ifdef _WINDOWS
-WLCTPCIACSS_API int WlctAccssSendWmiCmd(void* pDeviceAccss, SEND_RECEIVE_WMI* wmi);
-WLCTPCIACSS_API int WlctAccssRecieveWmiEvent(void* pDeviceAccss, SEND_RECEIVE_WMI* evt);
-WLCTPCIACSS_API int WlctAccssMpSetDriverLogLevels(void* pDeviceAccss, ULONG logModulesEnableMsk, ULONG logModuleLevelsMsk[WILO_DRV_NUM_LOG_COMPS]);
-#endif
-WLCTPCIACSS_API int WlctAccssRegisterDriverMailboxEvents(void* pDeviceAccss, HANDLE* pMailboxEventHandle );
-WLCTPCIACSS_API int WlctAccssUnregisterDriverMailboxEvents(void* pDeviceAccss);
-WLCTPCIACSS_API int WlctAccssRegisterDriverEvent(void* pDeviceAccss, INT_PTR event_ptr, int eventId, int appId);
-WLCTPCIACSS_API int WlctAccssRegisterDeviceForUnplug2Event(void* pDeviceAccss, INT_PTR event_ptr);
-
-WLCTPCIACSS_API int WlctAccssAllocPmc(void* pDeviceAccss, DWORD size, DWORD numOfDescriptors);
-WLCTPCIACSS_API int WlctAccssRegisterDriverDeviceEvents(void* pDeviceAccss, INT_PTR hDnEvent, INT_PTR hUpEvent, INT_PTR hUnplugEvent, INT_PTR hSysAssertEvent );
-
-
-WLCTPCIACSS_API	int accssRead(void* pDeviceAccss, DWORD addr, DWORD & val);
-WLCTPCIACSS_API	int accssWrite(void* pDeviceAccss, DWORD addr, DWORD val);
-WLCTPCIACSS_API int accssClear32(void* pDeviceAccss, DWORD addr, DWORD val);
-WLCTPCIACSS_API int accssSet32(void* pDeviceAccss, DWORD addr, DWORD val);
-
-WLCTPCIACSS_API void hwCopyFromIO(void* dst, void* pDeviceAccss, DWORD src, UINT32 len);
diff --git a/debug-tools/lib/WlctPciAcss/WlctPciAcssHelper.h b/debug-tools/lib/WlctPciAcss/WlctPciAcssHelper.h
deleted file mode 100644
index 163d76c..0000000
--- a/debug-tools/lib/WlctPciAcss/WlctPciAcssHelper.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "WlctPciAcss.h"
-
-int GetSimulatorInterfaces(INTERFACE_LIST* ifList, int* ReturnItems);
-int GetPciInterfaces(INTERFACE_LIST* ifList, int* ReturnItems);
-#ifndef _ANDROID_
-int GetJtagInterfaces(INTERFACE_LIST* ifList, int* ReturnItems);
-int GetSerialInterfaces(INTERFACE_LIST* ifList, int* ReturnItems);
-#endif
-
-class CComPortDeviceAccess;
-
-void ComSetParameters(CComPortDeviceAccess* pComDeviceAccss, DType devType);
-int SetMachineSpeed(void* pDeviceAccss, DWORD baud_rate_target);
-
-uint64_t GetTimeStampMs();
-
-int GetPciAcssVersion(WLCT_DLL_VERSION *pVer);
diff --git a/debug-tools/lib/WlctPciAcss/WlctPciAcssWmi.h b/debug-tools/lib/WlctPciAcss/WlctPciAcssWmi.h
deleted file mode 100644
index 0ed10b7..0000000
--- a/debug-tools/lib/WlctPciAcss/WlctPciAcssWmi.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#define PREPACK
-#define POSTPACK
-#pragma pack(1)
-#include "wmi.h" // definition of all WMI command structures
-#pragma pack()
-
-
-/* used by IOCTL_REGISTER_WMI_RX_EVENT and IOCTL_REGISTER_DEVICE_EVENT */
-typedef struct
-{
-    HANDLE hEvent; /* use INVALID_HANDLE_VALUE to de-register */
-} REGISTER_EVENT;
-
-
-/* used by IOCTL_OPEN_USER_MODE_EVENT  */
-/*
-	original structure inside the driver is as follows:
-			typedef struct _SHARED_EVENT
-			{
-				HANDLE  hDnEvent;
-				HANDLE  hUpEvent;
-				HANDLE  unplugEvent;
-				HANDLE  sysAssertEvent;
-
-			} SHARED_EVENT, *PSHARED_EVENT;
-
-	The HANDLE type inside the driver is platform speciefic, and
-	can be either 32bit or 64bit!
-	Since our DLL is assumed to be always compiled for 32bit platforms,
-	it is a problem.
-
-	Until the HANDLE types in the driver are changed to ULONG,
-	or until this DLL will have two diffrent barnches for 32bit and 64bit platforms,
-	the following Workarround is implemented:
-	1. Diffrent structs for 32bit and 64bit platforms.
-	2. when sending the IOCTL_OPEN_USER_MODE_EVENT, dynamically descide which struct to use.
-*/
-
-
-//those structs are deprecated
-typedef struct _SHARED_EVENT_64BIT
-{
-	INT_PTR hDnEvent_l;
-	INT_PTR hDnEvent_h;
-
-	INT_PTR hUpEvent_l;
-	INT_PTR hUpEvent_h;
-
-	INT_PTR unplugEvent_l;
-	INT_PTR unplugEvent_h;
-
-	INT_PTR sysAssertEvent_l;
-	INT_PTR sysAssertEvent_h;
-
-} SHARED_EVENT_64BIT, *PSHARED_EVENT_64BIT;
-
-typedef struct _SHARED_EVENT_32BIT
-{
-	INT_PTR hDnEvent;
-	INT_PTR hUpEvent;
-	INT_PTR unplugEvent;
-	INT_PTR sysAssertEvent;
-
-} SHARED_EVENT_32BIT, *PSHARED_EVENT_32BIT;
\ No newline at end of file
diff --git a/debug-tools/lib/WlctPciAcss/linux/CommDeviceAccess.cpp b/debug-tools/lib/WlctPciAcss/linux/CommDeviceAccess.cpp
deleted file mode 100644
index fe4ce15..0000000
--- a/debug-tools/lib/WlctPciAcss/linux/CommDeviceAccess.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "CommDeviceAccess.h"
-
-CComPortDeviceAccess::CComPortDeviceAccess(const TCHAR* tchDeviceName, DType devType)
-{
-    //do something with params
-    (void)tchDeviceName;
-    (void)devType;
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-}
-
-int CComPortDeviceAccess::InitDevice()
-{
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-CComPortDeviceAccess::~CComPortDeviceAccess()
-{
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-}
-
-int CComPortDeviceAccess::GetType()
-{
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::CloseDevice()
-{
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::r2(DWORD addr, DWORD & val)
-{
-    //do something with params
-    (void)addr;
-    (void)val;
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::w2(DWORD addr, DWORD val)
-{
-    //do something with params
-    (void)addr;
-    (void)val;
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::w32(DWORD addr, DWORD val)
-{
-    //do something with params
-    (void)addr;
-    (void)val;
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::rb(DWORD addr, DWORD blockSize, char *arrBlock)
-{
-    //do something with params
-    (void)addr;
-    (void)blockSize;
-    (void)arrBlock;
-
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::wb(DWORD addr, DWORD blockSize, const char *arrBlock)
-{
-    //do something with params
-    (void)addr;
-    (void)blockSize;
-    (void)arrBlock;
-
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::rr(DWORD addr, DWORD num_repeat, DWORD *arrBlock)
-{
-    //do something with params
-    (void)addr;
-    (void)num_repeat;
-    (void)arrBlock;
-
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::getFwDbgMsg(FW_DBG_MSG** pMsg)
-{
-    //do something with params
-    (void)pMsg;
-
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::clearAllFwDbgMsg()
-{
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::do_reset(BOOL bFirstTime)
-{
-    //do something with params
-    (void)bFirstTime;
-
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::do_sw_reset()
-{
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-
-int CComPortDeviceAccess::r32(DWORD addr, DWORD & val)
-{
-    //do something with params
-    (void)addr;
-    (void)val;
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-int CComPortDeviceAccess::r4(DWORD addr, DWORD & val)
-{
-    //do something with params
-    (void)addr;
-    (void)val;
-    LOG_MESSAGE_ERROR(_T("Not Supported\n"));
-    return 0;
-}
-
-
-
diff --git a/debug-tools/lib/WlctPciAcss/linux/CommDeviceAccess.h b/debug-tools/lib/WlctPciAcss/linux/CommDeviceAccess.h
deleted file mode 100644
index cd804f1..0000000
--- a/debug-tools/lib/WlctPciAcss/linux/CommDeviceAccess.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-//using namespace std;
-
-#include "DeviceAccess.h"
-
-class CComPortDeviceAccess : public IDeviceAccess
-{
-public:
-  CComPortDeviceAccess(const TCHAR* tchDeviceName, DType devType);
-  ~CComPortDeviceAccess(void);
-
-  virtual int CloseDevice();
-  virtual int GetType();
-  virtual int r2(DWORD addr, DWORD & val);
-  virtual int r4(DWORD addr, DWORD & val);
-  virtual int w2(DWORD addr, DWORD val);
-
-  virtual int r32(DWORD addr, DWORD & val);
-  virtual int w32(DWORD addr, DWORD val);
-
-  // read block
-  virtual int rb(DWORD addr, DWORD blockSize, char *arrBlock);
-  // write block
-  virtual int wb(DWORD addr, DWORD blockSize, const char *arrBlock);
-  // read repeat
-  virtual int rr(DWORD addr, DWORD num_repeat, DWORD *arrBlock);
-
-  virtual int getFwDbgMsg(FW_DBG_MSG** pMsg);
-  virtual int clearAllFwDbgMsg();
-  virtual int do_reset(BOOL bFirstTime = TRUE);
-  virtual int do_sw_reset();
-
-  int InitDevice();
-};
diff --git a/debug-tools/lib/WlctPciAcss/linux/IoctlDev.cpp b/debug-tools/lib/WlctPciAcss/linux/IoctlDev.cpp
deleted file mode 100644
index 4473315..0000000
--- a/debug-tools/lib/WlctPciAcss/linux/IoctlDev.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "IoctlDev.h"
-#include "wlct_procfs.h"
-#include "public.h"
-#include "LoggerSupport.h"
-#include <iostream>
-#include <fstream>
-
-#include <algorithm>
-
-#define PROC_MODULES_PATH "/proc/modules"
-#define DRIVER_KEYWORD "wil6210"
-
-void CIoctlDev::FormatCDevFName(void)
-{
-    int sres = snprintf(cdevFileName, sizeof(cdevFileName),
-                        "/tmp/%s", WLCT_CDEV_NAME);
-
-    WLCT_ASSERT((size_t)sres < sizeof(cdevFileName));
-    (void)sres;
-}
-
-CIoctlDev::CIoctlDev(const TCHAR *tchDeviceName)
-    : IIoctlDev(tchDeviceName)
-{
-    if( strstr(szInterfaceName, "wEP") != NULL || strstr(szInterfaceName, "wep") != NULL ){
-	cdevFile = new CWlctCDevSocket();
-    }  else{
-        cdevFile = new CWlctCDevFile();
-    }
-    // Name in format WLCT_PCI_LDEVNAME_FMT/WLCT_PCI_RDEVNAME_FMT
-    FormatCDevFName();
-}
-
-CIoctlDev::~CIoctlDev()
-{
-    delete cdevFile;
-    Close();
-}
-
-bool CIoctlDev::IsOpened(void)
-{
-    return cdevFile->IsOpened();
-}
-
-wlct_os_err_t CIoctlDev::DebugFS(char *FileName, void *dataBuf, DWORD dataBufLen, DWORD DebugFSFlags)
-{
-    return cdevFile->DebugFS(FileName, dataBuf, dataBufLen, DebugFSFlags);
-}
-
-bool WilDriverExistForEP(TCHAR *szInterfaceName)
-{
-
-    if( strstr(szInterfaceName, "wEP") != NULL || strstr(szInterfaceName, "wep") != NULL ){
-        ifstream ifs(PROC_MODULES_PATH);
-        string DriverKey = DRIVER_KEYWORD;
-        string line;
-        while(getline(ifs, line)) {
-            if (line.find(DriverKey, 0) != string::npos) {
-                LOG_MESSAGE_INFO(_T("Found WIGIG interface [wEP0!MARLON]"));
-                return true;
-            }
-        }
-    }
-    return false;
-}
-wlct_os_err_t CIoctlDev::Open()
-{
-    wlct_os_err_t res = WLCT_OS_ERROR_GEN_FAILURE;
-
-    WLCT_ASSERT(!IsOpened());
-
-    bOldIoctls = TRUE;
-
-    if (WilDriverExistForEP(szInterfaceName))
-    {
-        // Bug fix
-        char tempInterfaceName[INTERFACE_NAME_LENGTH];
-        snprintf(tempInterfaceName, INTERFACE_NAME_LENGTH, "%s", szInterfaceName);
-
-        LOG_MESSAGE_DEBUG("Tokenizing: %s\n", tempInterfaceName);
-
-        res = cdevFile->Open(cdevFileName, tempInterfaceName);
-        if (res == WLCT_OS_ERROR_SUCCESS)
-        {
-            LOG_MESSAGE_DEBUG("Cdev file '%s' opened (uid=%u)",
-                              cdevFileName, uID);
-        }
-        else
-        {
-            LOG_MESSAGE_ERROR("Cdev file '%s' (uid=%u) opening failed (%d)",
-                              cdevFileName, uID, res);
-        }
-    }
-    else
-    {
-        LOG_MESSAGE_ERROR("Cannot get UID by PciDevName (%s)",
-                          szInterfaceName);
-        res = WLCT_OS_ERROR_NO_SUCH_ENTRY;
-    }
-
-    return res;
-}
-
-void CIoctlDev::Close()
-{
-    if (IsOpened())
-    {
-        cdevFile->Close();
-    }
-}
-
-wlct_os_err_t CIoctlDev::Ioctl(uint32_t Id,
-                               const void *inBuf, uint32_t inBufSize,
-                               void *outBuf, uint32_t outBufSize)
-{
-    wlct_os_err_t     res = WLCT_OS_ERROR_GEN_FAILURE;
-    wlct_ioctl_hdr_t *ioctlHdr = NULL;
-    uint32_t          ioctlBufSize = 0;
-
-    WLCT_ASSERT(IsOpened());
-
-    if (!inBuf || !inBufSize)
-    {
-        inBuf     = NULL;
-        inBufSize = 0;
-    }
-
-    if (!outBuf || !outBufSize)
-    {
-        outBuf     = NULL;
-        outBufSize = 0;
-    }
-
-    ioctlBufSize = sizeof(wlct_ioctl_hdr_t) + inBufSize + outBufSize;
-
-    ioctlHdr = (wlct_ioctl_hdr_t *)malloc(ioctlBufSize);
-    if (ioctlHdr)
-    {
-        uint32_t offset     = 0;
-        uint32_t ioctlFlags = 0;
-
-        memset(ioctlHdr, 0, ioctlBufSize);
-
-        ioctlHdr->deviceUID    = uID;
-        ioctlHdr->commandID    = Id;
-        ioctlHdr->dataSize     = inBufSize + outBufSize;
-        if (inBufSize)
-        {
-            ioctlHdr->inBufOffset  = offset;
-            ioctlHdr->inBufSize    = inBufSize;
-            ioctlFlags            |= WLCT_IOCTL_FLAG_SET;
-
-            memcpy(wlct_ioctl_data_in(ioctlHdr), inBuf, inBufSize);
-
-            offset += inBufSize;
-        }
-
-        if (outBufSize)
-        {
-            ioctlHdr->outBufOffset  = offset;
-            ioctlHdr->outBufSize    = outBufSize;
-            ioctlFlags             |= WLCT_IOCTL_FLAG_GET;
-
-            offset += outBufSize;
-        }
-
-        res = cdevFile->Ioctl(ioctlHdr, ioctlBufSize, ioctlFlags);
-
-        if (res != WLCT_OS_ERROR_SUCCESS)
-        {
-            LOG_MESSAGE_ERROR("IOCTL failed with error %u (id=%u)",
-                              res, Id);
-        }
-        else if (outBufSize)
-        {
-            memcpy(outBuf, wlct_ioctl_data_out(ioctlHdr), outBufSize);
-        }
-
-        free(ioctlHdr);
-    }
-    else
-    {
-        LOG_MESSAGE_ERROR("Cannot allocate IOCTL buffer of %u bytes (id=%u)",
-                          ioctlBufSize, Id);
-
-        res = WLCT_OS_ERROR_NOT_ENOUGH_MEMORY;
-    }
-
-
-    return res;
-}
diff --git a/debug-tools/lib/WlctPciAcss/linux/IoctlDev.h b/debug-tools/lib/WlctPciAcss/linux/IoctlDev.h
deleted file mode 100644
index 98c5ac5..0000000
--- a/debug-tools/lib/WlctPciAcss/linux/IoctlDev.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "IoctlDevXFace.h"
-#include "WlctCDevFile.h"
-#include "WlctCDevSocket.h"
-
-using namespace std;
-#include <string>
-
-typedef enum{
-  local = 0,
-  remote,
-  endPoint,
-}DEVICE_TYPES;
-
-class CIoctlDev : public IIoctlDev
-{
-public:
-  CIoctlDev(const TCHAR *tchDeviceName);
-  virtual ~CIoctlDev();
-
-  virtual bool          IsOpened(void);
-  virtual wlct_os_err_t	DebugFS(char *FileName, void *dataBuf, DWORD dataBufLen, DWORD DebugFSFlags);
-
-  virtual wlct_os_err_t Open();
-  virtual wlct_os_err_t Ioctl(uint32_t Id,
-                              const void *inBuf, uint32_t inBufSize,
-                              void *outBuf, uint32_t outBufSize);
-  virtual void          Close();
-
-  bool bOldIoctls;
-
-protected:
-  void                  FormatCDevFName(void);
-
-  char                 cdevFileName[128];
-  CWlctCDevFile*        cdevFile;
-  uint32_t             uID;
-};
diff --git a/debug-tools/lib/WlctPciAcss/linux/Util.cpp b/debug-tools/lib/WlctPciAcss/linux/Util.cpp
deleted file mode 100644
index 4ad5d69..0000000
--- a/debug-tools/lib/WlctPciAcss/linux/Util.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "Util.h"
-
-#ifdef NO_GCC_ATOMIC
-#error "Platform doesn't support GCC atomic built-ins"
-#endif
-
-#define InterlockedExchange __sync_lock_test_and_set
-
-BOOL Util::timedResourceInterLockExchange ( LONG* var, LONG flag_value, int timeout, bool keepWaiting )
-{
-  // perform atomic change value, to acquire resource!
-  // if VAR != FLAG_VALUE, then set VAR to FLAG_VALUE.
-  // loop until timeout (millisecond). return success in achieving resource
-  // Assumes that FLAG_VALUE should be different then current value stored in VAR
-  // turn keepWaiting on to wait infinite
-
-  LONG original_value;
-
-  int i = 0;
-  do
-  {
-    original_value = InterlockedExchange(var, flag_value);
-    if (original_value != flag_value)
-    {
-      return true;
-    }
-    if (timeout > 0 )
-    {
-      sleep_ms(1);
-    }
-    i++;
-  } while ((i < timeout) || (keepWaiting));
-
-  return false;
-}
-
-bool Util::ICHDisableEnable()
-{
-  return false;
-}
-
-DWORD Util::ReadRegistrySettings(LPCTSTR lpszRegistryPath, LPCTSTR valName)
-{
-  //do something with params
-  (void)lpszRegistryPath;
-  (void)valName;
-
-  return -1;
-}
-
-DWORD Util::WriteRegistrySettings(LPCTSTR lpszRegistryPath, LPCTSTR valName, DWORD val)
-{
-  //do something with params
-  (void)lpszRegistryPath;
-  (void)valName;
-  (void)val;
-
-  return -1;
-}
diff --git a/debug-tools/lib/WlctPciAcss/linux/WlctPciAcssHelper.cpp b/debug-tools/lib/WlctPciAcss/linux/WlctPciAcssHelper.cpp
deleted file mode 100644
index 646be85..0000000
--- a/debug-tools/lib/WlctPciAcss/linux/WlctPciAcssHelper.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "WlctPciAcssHelper.h"
-#include "PciDeviceAccess.h"
-#include <iostream>
-#include <fstream>
-#include <string>
-
-#ifdef _WINDOWS
-#include "JtagDeviceAccess.h"
-#endif
-
-#include <sys/time.h>
-
-#define WLCT_MS_PER_S  1000
-#define WLCT_US_PER_MS 1000
-#define PROC_MODULES_PATH "/proc/modules"
-#define DRIVER_KEYWORD "wil6210"
-
-#define END_POINT_RESULT_MAX_SIZE 1000
-
-using namespace std;
-
-void CreatePciInterface(const char* interfaceName, DType devType, INTERFACE_LIST* ifList, int* ReturnItems);
-void CreateMultipleInterfaces(const char* interfaceName, DType devType, INTERFACE_LIST* ifList, int* ReturnItems);
-bool GetInterfaceNameFromEP(const char* pciEndPoint, char* interfaceName);
-int GetNumberOfInterfaces();
-
-int GetSimulatorInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
-{
-    // Not supported in Linux
-    WLCT_UNREFERENCED_PARAM(ifList);
-
-    return *ReturnItems;
-}
-bool WilDriverExist()
-{
-    ifstream ifs(PROC_MODULES_PATH);
-    string DriverKey = DRIVER_KEYWORD;
-    string line;
-    while(getline(ifs, line)) {
-        if (line.find(DriverKey, 0) != string::npos) {
-            LOG_MESSAGE_INFO(_T("Found WIGIG interface [wEP0!MARLON]"));
-            return true;
-        }
-    }
-
-    return false;
-}
-
-int GetPciInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
-{
-    CreateMultipleInterfaces("wEP0L!SPARROW", MST_SPARROW, ifList, ReturnItems);
-
-    return *ReturnItems;
-}
-
-void CreateMultipleInterfaces(const char* interfaceName, DType devType, INTERFACE_LIST* ifList, int* ReturnItems)
-{
-    //do something with params
-    (void)devType;
-    // Holds the console ouput containing the current End Point
-    char pciEndPoints[END_POINT_RESULT_MAX_SIZE];
-
-    // This command retrieves the PCI endpoints enumerated
-    const char* szCmdPattern = "ls /sys/module/wil6210/drivers/pci\\:wil6210 | grep :";
-
-    FILE* pIoStream = popen(szCmdPattern, "r");
-    if (!pIoStream)
-    {
-        LOG_MESSAGE_ERROR("Failed to run command to detect End Points\n" );
-        return;
-    }
-
-    LOG_MESSAGE_DEBUG("Searching for PCI end points: %s", szCmdPattern);
-
-    while (fgets(pciEndPoints, END_POINT_RESULT_MAX_SIZE, pIoStream) != NULL)
-    {
-        // The command output contains a newline character that should be removed
-        pciEndPoints[strcspn(pciEndPoints, "\r\n")] = '\0';
-        LOG_MESSAGE_DEBUG("PCI End Point Found: %s", pciEndPoints);
-
-        // Get interface name from End Point
-        char networkInterfaceName[IFNAMSIZ] = {0};
-        GetInterfaceNameFromEP(pciEndPoints, networkInterfaceName);
-
-        // Append driver interface name
-        std::string ifName = interfaceName;
-        ifName += "!";
-        ifName += networkInterfaceName;
-
-        LOG_MESSAGE_DEBUG("Attempting to create interface named: %s", ifName.c_str());
-
-        CreatePciInterface(ifName.c_str(), MST_SPARROW, ifList, ReturnItems);
-    }
-
-    pclose(pIoStream);
-}
-
-
-bool GetInterfaceNameFromEP(const char* pciEndPoint, char* interfaceName)
-{
-    char szInterfaceCmdPattern[END_POINT_RESULT_MAX_SIZE];
-
-    // This command translates the End Point to the interface name
-    snprintf(szInterfaceCmdPattern, END_POINT_RESULT_MAX_SIZE, "ls /sys/module/wil6210/drivers/pci:wil6210/%s/net", pciEndPoint);
-
-    LOG_MESSAGE_DEBUG("Running command: %s", szInterfaceCmdPattern);
-
-    FILE* pIoStream = popen(szInterfaceCmdPattern, "r");
-    if (!pIoStream)
-    {
-        LOG_MESSAGE_ERROR("Failed to run command to detect End Points\n" );
-        return false;
-    }
-
-    while (fgets(interfaceName, IFNAMSIZ, pIoStream) != NULL)
-    {
-        // The command output contains a newline character that should be removed
-        interfaceName[strcspn(interfaceName, "\r\n")] = '\0';
-        LOG_MESSAGE_DEBUG("PCI interface found: %s", interfaceName);
-
-        return true;
-    }
-
-    pclose(pIoStream);
-    return false;
-}
-
-
-void CreatePciInterface(const char* interfaceName, DType devType, INTERFACE_LIST* ifList, int* ReturnItems)
-{
-    void* res = NULL;
-    void** tempAccess = &res;
-
-    if(!CreateDeviceAccessHandler(interfaceName, devType, tempAccess))
-    {
-        snprintf(ifList->list[(*ReturnItems)].ifName, MAX_IF_NAME_LENGTH, "%s", interfaceName);
-        (*ReturnItems) += 1;
-        LOG_MESSAGE_INFO(_T("Found WIGIG interface"));
-        if(res)
-        {
-            CloseDeviceAccessHandler(*tempAccess);
-        }
-    }
-}
-
-int GetSerialInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
-{
-    // Not supported in Linux
-    WLCT_UNREFERENCED_PARAM(ifList);
-
-    return *ReturnItems;
-}
-
-int GetJtagInterfaces(INTERFACE_LIST* ifList, int* ReturnItems)
-{
-
-#ifdef _WINDOWS
-    DType devType;
-    void* handler = NULL;
-    DWORD err;
-    uint32_t addr;
-    uint32_t val;
-    int ret = 0;
-
-    char ifName[MAX_IF_NAME_LENGTH];
-
-    //////////////////////////////////////////////////////////////////////////
-    // find all jtag channels that connect to a WIGIG card
-    //////////////////////////////////////////////////////////////////////////
-    devType = MST_MARLON;
-    addr = BAUD_RATE_REGISTER;
-
-    int cdvc = 0;
-    DVC dvc;
-    char infoSet[28];
-
-    LOG_MESSAGE_INFO(_T("scan jtag devices"));
-
-    if (!funcDmgrEnumDevices(&cdvc)) {
-        LOG_MESSAGE_INFO(_T("Error enumerating JTAG devices"));
-        cdvc = 0;
-    }
-
-    for (int idvc = 0; idvc < cdvc; idvc++) {
-
-        // DMGR API Call: funcDmgrGetDvc
-        if (!funcDmgrGetDvc(idvc, &dvc)) {
-            LOG_MESSAGE_INFO(_T("Error getting device info"));
-            break;
-        }
-        DINFO dinfo = dinfoUsrName;
-        BOOL bRes;
-        snprintf(infoSet, sizeof(infoSet), "wjtag%d", idvc);
-        bRes = funcDmgrSetInfo(&dvc, dinfo, (void*)infoSet);
-
-        WLCT_UNREFERENCED_PARAM(bRes);
-
-        snprintf(ifName, MAX_IF_NAME_LENGTH, "%s!MARLON", infoSet);
-        err = CreateDeviceAccessHandler(ifName, devType, &handler);
-        if (err == 0 && isInit(handler))
-        {
-            ret = WlctAccssRead(handler, addr, val);
-            if (ret == 0 && val > 0 && val < 0xFFFF)
-            {
-                snprintf(ifList->list[(*ReturnItems)++].ifName, MAX_IF_NAME_LENGTH, "%s", ifName);
-                LOG_MESSAGE_INFO(_T("Found JTAG WIGIG interface [%s]"),
-                                 ifName);
-            }
-            CloseDeviceAccessHandler(handler);
-            handler = NULL;
-        }
-    }
-
-    /* Clean up and get out */
-    // DMGR API Call: DmgrFreeDvcEnum
-    funcDmgrFreeDvcEnum();
-
-#endif
-//do something with params
-    WLCT_UNREFERENCED_PARAM(ifList);
-    return *ReturnItems;
-}
-
-void ComSetParameters(CComPortDeviceAccess* pComDeviceAccss, DType devType)
-{
-    // Not supported in Linux
-    WLCT_UNREFERENCED_PARAM(pComDeviceAccss);
-    WLCT_UNREFERENCED_PARAM(devType);
-}
-
-int SetMachineSpeed(void* pDeviceAccss, DWORD baud_rate_target)
-{
-    // Not supported in Linux
-    WLCT_UNREFERENCED_PARAM(pDeviceAccss);
-    WLCT_UNREFERENCED_PARAM(baud_rate_target);
-
-    return -1;
-}
-
-uint64_t GetTimeStampMs()
-{
-    struct timeval tv = {0,0};
-    if (gettimeofday(&tv, NULL) == 0)
-    {
-        return tv.tv_sec * WLCT_MS_PER_S + tv.tv_usec / WLCT_US_PER_MS;
-    }
-
-    return 0;
-}
-
-int GetPciAcssVersion(WLCT_DLL_VERSION *pVer)
-{
-    WLCT_ASSERT(pVer != NULL);
-    pVer->major       = 0;
-    pVer->minor       = 0;
-    pVer->maintenance = 0;
-    pVer->build       = 0;
-    return 0;
-}
-
diff --git a/debug-tools/lib/inc/basic_types.h b/debug-tools/lib/inc/basic_types.h
deleted file mode 100644
index 1145107..0000000
--- a/debug-tools/lib/inc/basic_types.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef BASIC_TYPES_H_
-#define BASIC_TYPES_H_
-#define EMPTY_ARRAY_SIZE
-
-#ifdef _WINDOWS
-
-#else
-typedef signed char         INT8;
-typedef signed short        INT16;
-typedef signed int          INT32;
-typedef signed long         INT64;
-typedef unsigned char       UINT8;
-typedef unsigned short      UINT16;
-typedef unsigned int        UINT32;
-typedef UINT32*             PUINT32;
-typedef unsigned long       UINT64;
-typedef UINT64              INT_PTR;
-#endif
-
-typedef UINT64 u64;
-typedef UINT32 u32;
-typedef UINT16 u16;
-typedef UINT8 u8;
-typedef INT64 s64;
-typedef INT32 s32;
-typedef INT16 s16;
-typedef INT8 s8;
-
-
-typedef u8 U08;
-typedef u16 U16;
-typedef u32 U32;
-typedef s32 S32;
-typedef s8 S08;
-typedef u8* PU08;
-typedef u16* PU16;
-
-#endif //BASIC_TYPES_H_
diff --git a/debug-tools/lib/inc/ioctl_if.h b/debug-tools/lib/inc/ioctl_if.h
deleted file mode 100644
index 3bfbbb9..0000000
--- a/debug-tools/lib/inc/ioctl_if.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "wmi.h"
-
-#define WBE_DRIVER_NAME L"wmp0"
-
-// use INVALID_HANDLE_VALUE to de-register the event
-#define INVALID_HANDLE_VALUE_LEGACY ((ULONG)(LONG_PTR)-1)
-#define INVALID_HANDLE_VALUE        ((HANDLE)(LONG_PTR)-1)
-
-// max value of the device id (user-mode application identifier) - related to WMI_DEVICE_ID
-#define IOCTL_DEVICE_ID_MAX                      0xFF
-#define IOCTL_DEVICE_ID_WBE_OLD                  0x00
-
-#define WILOCITY_DEVICE_TYPE                    FILE_DEVICE_UNKNOWN
-#define WILOCITY_IOCTL(_code_)                  CTL_CODE (WILOCITY_DEVICE_TYPE, _code_, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define WILOCITY_IOCTL_DEVICE_STATUS_EVENT    	WILOCITY_IOCTL (0x208)    // API for Monitoring tool
-#define WILOCITY_IOCTL_INDIRECT_READ            WILOCITY_IOCTL (0x210)
-#define WILOCITY_IOCTL_INDIRECT_WRITE           WILOCITY_IOCTL (0x211)
-#define WILOCITY_IOCTL_INDIRECT_READ_BLOCK      WILOCITY_IOCTL (0x212)
-#define WILOCITY_IOCTL_INDIRECT_WRITE_BLOCK     WILOCITY_IOCTL (0x214)
-#define WILOCITY_IOCTL_SEND_WMI                 WILOCITY_IOCTL (0x800)
-#define WILOCITY_IOCTL_REGISTER_EVENT_NEW       WILOCITY_IOCTL (0x850)
-#define WILOCITY_IOCTL_UNREGISTER_EVENTS        WILOCITY_IOCTL (0x851)
-#define WILOCITY_IOCTL_RECEIVE_WMI_NEW          WILOCITY_IOCTL (0x852)    // New API Not implemented yet by WBE APP
-#define WILOCITY_IOCTL_DEVICE_RESET             WILOCITY_IOCTL (0x807)
-#define WILOCITY_IOCTL_SET_MODE_NEW	            WILOCITY_IOCTL (0x808)    // New API for Concurrent mode controlling (Docking/Networking/hotspot), IOCTL_EVENT_SET_MODE_COMPLETE will be sent to UI on success
-#define WILOCITY_IOCTL_GET_MODE_NEW	            WILOCITY_IOCTL (0x809)    // API for UI to extract driver mode (example: after set mode fail, not event will be sent to UI)
-
-// Deprecated API
-#define WILOCITY_IOCTL_RECEIVE_WMI         		WILOCITY_IOCTL (0x801)
-// registration for indication of incoming WMI command.
-// Following that, client will use IOCTL_RECEIVE_WMI to get the incoming WMI command
-#define WILOCITY_IOCTL_REGISTER_WMI_RX		    WILOCITY_IOCTL (0x803)
-// Registration for driver down event
-#define WILOCITY_IOCTL_REGISTER_DEVICE    		WILOCITY_IOCTL (0x804)
-
-/**
-*    WILOCITY_IOCTL_DEVICE_STATUS_EVENT
-**/
-#pragma pack(1)
-typedef struct _DEVICE_STATUS_EVENT
-{
-    HANDLE  hDnEvent;              		// Link Down
-    HANDLE  hUpEvent; 				// Link up
-    HANDLE  unplugEvent;			// Surprise removal
-    HANDLE  sysAssertEvent;			// Device Fatal Error
-} DEVICE_STATUS_EVENT, *PDEVICE_STATUS_EVENT;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_INDIRECT_READ
-**/
-#pragma pack(1)
-typedef struct _DRIVER_READ_DWORD
-{
-    ULONG            address; // Word output will be returned in IOCTL output buffer that was allocated by application
-} DRIVER_READ_DWORD, *PDRIVER_READ_DWORD;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_INDIRECT_WRITE
-**/
-#pragma pack(1)
-typedef struct _DRIVER_WRITE_DWORD
-{
-    ULONG            address;
-    ULONG            data;
-} DRIVER_WRITE_DWORD, *PDRIVER_WRITE_DWORD;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_INDIRECT_WRITE_BLOCK
-**/
-#pragma pack(1)
-typedef struct _DRIVER_WRITE_BLOCK
-{
-    ULONG            address;
-    ULONG            size;      				// in bytes
-    ULONG            buffer[EMPTY_ARRAY_SIZE]; 	// buffer's data will be allocated by user-mode app right to the end of struct
-} DRIVER_WRITE_BLOCK, *PDRIVER_WRITE_BLOCK;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_INDIRECT_READ_BLOCK
-**/
-#pragma pack(1)
-typedef struct _DRIVER_READ_BLOCK
-{
-    ULONG            address;  					// Size is taken from IOCTL output buffer size
-} DRIVER_READ_BLOCK, *PDRIVER_READ_BLOCK;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_REGISTER_EVENT_NEW
-**/
-typedef enum _NOTIFY_EVENT {
-    IOCTL_EVENT_PCI_LINK_UP,
-    IOCTL_EVENT_PCI_PRE_LINK_DOWN,
-    IOCTL_EVENT_PCI_LINK_DOWN,
-    IOCTL_EVENT_DEVICE_READY,
-    IOCTL_EVENT_MAILBOX_MSG,
-    IOCTL_EVENT_DEBUG_MAILBOX_MSG,
-    IOCTL_EVENT_SYSASSERT,
-    IOCTL_EVENT_DRIVER_DISABLE,
-    IOCTL_EVENT_SET_MODE_COMPLETE,
-    IOCTL_EVENT_DEVICE_UNPLUG,
-    IOCTL_EVENT_ORACLE_START,
-    IOCTL_EVENT_ORACLE_STOP,
-
-    // !!!do not define any event below MAX_EVENT!!!
-    IOCTL_EVENT_MAX,
-} NOTIFY_EVENT, *PNOTIFY_EVENT;
-
-#pragma pack(1)
-typedef struct _DRIVER_REGISTER_EVENT_NEW
-{
-    ULONG           DeviceId;			// The application identifier from type WMI_DEVICE_ID
-    NOTIFY_EVENT    EventId;
-    HANDLE          UserEventHandle;    	// The application CB to be called on event
-
-} DRIVER_REGISTER_EVENT_NEW, *PDRIVER_REGISTER_EVENT_NEW;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_UNREGISTER_EVENTS
-**/
-#pragma pack(1)
-typedef struct _DRIVER_UNREGISTER_EVENTS
-{
-    ULONG           DeviceId;			// of type WMI_DEVICE_ID, driver will unregistered all APP events
-
-} DRIVER_UNREGISTER_EVENTS, *PDRIVER_UNREGISTER_EVENTS;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_REGISTER_WMI_RX_EVENT    // Used for WMI event registration
-* WILOCITY_IOCTL_REGISTER_DEVICE          // USed for driver unload event registration
-**/
-#pragma pack(1)
-typedef struct _DRIVER_REGISTER_EVENT
-{
-    ULONG UserEventHandle; // The application CB to be called on event
-
-} DRIVER_REGISTER_EVENT, *PDRIVER_REGISTER_EVENT;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_SEND_WMI
-**/
-#pragma pack(1)
-/* used by IOCTL_SEND_WMI and IOCTL_RECEIVE_WMI */
-typedef struct SEND_RECEIVE_WMI_S
-{
-    enum WMI_COMMAND_ID uCmdId;
-    U16                 uContext;
-    U08                 uDevId;
-    U16                 uBufLen;
-    U08                 uBuf[EMPTY_ARRAY_SIZE];
-} SEND_RECEIVE_WMI, *PSEND_RECEIVE_WMI;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_RECEIVE_WMI_NEW
-**/
-#pragma pack(1)
-typedef struct RECEIVE_WMI_NEW_S
-{
-    ULONG       DeviceId;                         	// The application identifier from type WMI_DEVICE_ID
-    U08         IsFilterAccordingToMyDeviceId;   	// Input param. If should pass all events (=FALSE) or only events with BCASD id or my id (=TRUE)
-    U08         Reserved[3];
-    U32         OutputBuffSize;                  	// Output param. Number of bytes written to output buffer
-    union {
-        struct {
-        U16     StartSequenceNumber;
-        U16     StartRepCount;
-        };
-        U32     Counter;                         // Input param. 32 bit counter build from 16 bit FW sequence numbers and 16 bit driver's wrap counter
-                                                 // To request first event, set counter to 0x0
-    };
-    U32         NumEventsToRead;                 // Input/Output param.
-                                                 // Input: max number of events to read. Driver reads from the currently available events (does not block if requested more than available)
-                                                 // Output: number of events written to output buffer
-} RECEIVE_WMI_NEW, *PRECEIVE_WMI_NEW;
-#pragma pack()
-
-/**
-* WILOCITY_IOCTL_SET_MODE_NEW
-* input buffer contains SET_MODE_CMD_INPUT
-* output buffer contains SET_MODE_CMD_OUTPUT
-* WILOCITY_IOCTL_GET_MODE_NEW
-* output buffer contains GET_MODE_CMD_OUTPUT
-**/
-typedef enum _DRIVER_MODE {
-    IOCTL_WBE_MODE,
-    IOCTL_WIFI_STA_MODE,
-    IOCTL_WIFI_SOFTAP_MODE,
-    IOCTL_CONCURRENT_MODE,    // This mode is for a full concurrent implementation  (not required mode switch between WBE/WIFI/SOFTAP)
-    IOCTL_SAFE_MODE,          // A safe mode required for driver for protected flows like upgrade and crash dump...
-} DRIVER_MODE, *PDRIVER_MODE;
-
-#pragma pack(1)
-typedef struct _SET_MODE_CMD_INPUT
-{
-    DRIVER_MODE mode;
-} SET_MODE_CMD_INPUT, *PSET_MODE_CMD_INPUT;
-
-typedef struct _SET_MODE_CMD_OUTPUT
-{
-    BOOLEAN result;
-    DRIVER_MODE previousMode; // relevant only if result is TRUE
-} SET_MODE_CMD_OUTPUT, *PSET_MODE_CMD_OUTPUT;
-
-typedef struct _GET_MODE_CMD_OUTPUT
-{
-    DRIVER_MODE currentMode;
-} GET_MODE_CMD_OUTPUT, *PGET_MODE_CMD_OUTPUT;
-#pragma pack()
-
-
-
diff --git a/debug-tools/lib/inc/linux/wlct_cdev_shared.h b/debug-tools/lib/inc/linux/wlct_cdev_shared.h
deleted file mode 100644
index c86aa06..0000000
--- a/debug-tools/lib/inc/linux/wlct_cdev_shared.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __WLCT_CDEV_SHARED_H__
-#define __WLCT_CDEV_SHARED_H__
-
-#include "wlct_os.h"
-
-#define WLCT_IOCTL_MAGIC 0x59076456
-
-#define WLCT_IOCTL_FLAG_SET 0x1
-#define WLCT_IOCTL_FLAG_GET 0x2
-
-typedef struct {
-  uint32_t magic;
-  uint32_t len;
-  uint32_t flags;
-} wlct_cdev_ioctl_hdr_t;
-
-#endif
-
diff --git a/debug-tools/lib/inc/linux/wlct_procfs.h b/debug-tools/lib/inc/linux/wlct_procfs.h
deleted file mode 100644
index 4267a1e..0000000
--- a/debug-tools/lib/inc/linux/wlct_procfs.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __WLCT_PROCFS_H__
-#define __WLCT_PROCFS_H__
-
-/******************************************************************
- * Linux Proc FS related definitions
- ******************************************************************/
-
-/* CDev file name*/
-#define WLCT_CDEV_NAME                      "wilocity"
-
-/* Root ProcFS dir name*/
-#define WLCT_PROCFS_DNAME                   "wilocity"
-
-/* ProcFS topology file name*/
-#define WLCT_PROCFS_TOPOLOGY_FNAME          "topology"
-
-/* ProcFS topology INI file root section definitions */
-#define WLCT_TOPOLOGY_INI_ROOT_SEC          "root"
-#define WLCT_TOPOLOGY_INI_ROOT_CDEVNAME_KEY "cdev"
-#define WLCT_TOPOLOGY_INI_ROOT_MAJOR_KEY    "major"
-#define WLCT_TOPOLOGY_INI_ROOT_NOF_DEVS_KEY "nof_devs"
-
-/* ProcFS topology INI file device specific section definitions */
-#define WLCT_TOPOLOGY_INI_DEV_SEC_PREFIX    "dev"
-#define WLCT_TOPOLOGY_INI_DEV_UID_KEY       "uid"
-#define WLCT_TOPOLOGY_INI_DEV_BUS_NO_KEY    "bus_no"
-#define WLCT_TOPOLOGY_INI_DEV_NAME_KEY      "name"
-
-#endif /* __WLCT_PROCFS_H__ */
diff --git a/debug-tools/lib/inc/public.h b/debug-tools/lib/inc/public.h
deleted file mode 100644
index 19db8ff..0000000
--- a/debug-tools/lib/inc/public.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __PUBLIC_H
-#define __PUBLIC_H
-
-#ifdef _WINDOWS
-#include <initguid.h>
-#define INITGUID
-
-
-#define FSCTL_FILTER_BASE      FILE_DEVICE_UNKNOWN
-
-#define _FILTER_CTL_CODE(_Function, _Method, _Access)  \
-						CTL_CODE(FSCTL_FILTER_BASE, _Function, _Method, _Access)
-
-#define WCLT_SAMPLING_TO_FILE_IS_SUPPORTED
-#else
-typedef unsigned long ULONG;
-#define _FILTER_CTL_CODE(_Function, _Method, _Access) (_Function)
-
-typedef struct
-{
-  DWORD deviceUID;
-  DWORD commandID;
-  DWORD dataSize; /* inBufSize + outBufSize */
-  DWORD inBufOffset;
-  DWORD inBufSize;
-  DWORD outBufOffset;
-  DWORD outBufSize;
-} wlct_ioctl_hdr_t;
-
-static __INLINE BYTE *
-wlct_ioctl_data_in(wlct_ioctl_hdr_t *h)
-{
-  return ((BYTE*)&h[1]) + h->inBufOffset;
-}
-
-static __INLINE BYTE *
-wlct_ioctl_data_out(wlct_ioctl_hdr_t *h)
-{
-  return ((BYTE*)&h[1]) + h->outBufOffset;
-}
-#endif
-
-#ifdef _WINDOWS
-// Main Driver GUID
-DEFINE_GUID (GUID_DEVINTERFACE_wDrvEp, 0x23d1c0df,0x48f9,0x4c38,0x97,0xa2,0x4a,0xba,0x44,0x97,0x36,0xd1);
-// {23D1C0DF-48F9-4C38-97A2-4ABA449736D1}
-#endif
-
-//-----------------------------------------------------------------------------------
-// Old IOCTLS
-//-----------------------------------------------------------------------------------
-#define IOCTL_FILTER_GET_CFG   \
-			_FILTER_CTL_CODE(0x202, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_FILTER_SET_CFG   \
-			_FILTER_CTL_CODE(0x203, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_FILTER_CLOSE_LOCAL_DEVICE   \
-	_FILTER_CTL_CODE(0x204, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_FILTER_CLOSE_REMOTE_DEVICE   \
-	_FILTER_CTL_CODE(0x205, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_FILTER_OPEN_LOCAL_DEVICE   \
-	_FILTER_CTL_CODE(0x206, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_FILTER_OPEN_REMOTE_DEVICE   \
-	_FILTER_CTL_CODE(0x207, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_OPEN_USER_MODE_EVENT   \
-	_FILTER_CTL_CODE(0x208, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_CLOSE_USER_MODE_EVENT   \
-	_FILTER_CTL_CODE(0x209, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_FILTER_GET_INTERRUPT_MODE   \
-	_FILTER_CTL_CODE(0x20A, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_FILTER_SET_INTERRUPT_MODE   \
-	_FILTER_CTL_CODE(0x20B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_INDIRECT_READ_OLD \
-	_FILTER_CTL_CODE(0x210, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_INDIRECT_WRITE_OLD \
-	_FILTER_CTL_CODE(0x211, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_INDIRECT_READ_BLOCK \
-	_FILTER_CTL_CODE(0x212, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_INDIRECT_READ_REPEAT \
-	_FILTER_CTL_CODE(0x213, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_INDIRECT_WRITE_BLOCK \
-	_FILTER_CTL_CODE(0x214, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-
-//-----------------------------------------------------------------------------------
-// New IOCTLS
-//-----------------------------------------------------------------------------------
-#ifdef _WINDOWS
-#define WILOCITY_DEVICE_TYPE				FILE_DEVICE_UNKNOWN
-#define WILOCITY_IOCTL(_code_)				CTL_CODE (WILOCITY_DEVICE_TYPE, _code_, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-#else
-#define WILOCITY_IOCTL(_code_)                          _FILTER_CTL_CODE (_code_, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-#define ERROR_SUCCESS                                   0L
-#endif
-
-
-/* send WMI command to device.
-   The content of pBuf is the WMI message itself. It doesn't include WMI header
-   and Marlon MBOX header. */
-#define WILOCITY_IOCTL_SEND_WMI					WILOCITY_IOCTL (0x800)
-
-/* receive WMI command from device.
-   upon return, pBuf contains the WMI message itself. It doesn't include WMI header
-   and Marlon MBOX header.
-   This IOCTL should return with error code if there is no pending Rx command */
-#define WILOCITY_IOCTL_RECEIVE_WMI				WILOCITY_IOCTL (0x801)
-
-/* registration for indication of incoming WMI command.
-   Following that, client will use IOCTL_RECEIVE_WMI to get the incoming WMI command */
-#define WILOCITY_IOCTL_REGISTER_WMI_RX_EVENT	WILOCITY_IOCTL (0x803)
-
-/* registration for user mode evnts from Driver. all events besides WMI RX Events */
-#define WILOCITY_IOCTL_REGISTER_DEVICE_EVENT	WILOCITY_IOCTL (0x804)
-#define WILOCITY_IOCTL_GET_DEVICE_EVENT			WILOCITY_IOCTL (0x805)
-#define WILOCITY_IOCTL_REGISTER_EVENT			WILOCITY_IOCTL (0x850)
-
-/* Special IOCTLS */
-#define WILOCITY_IOCTL_DEVICE_SW_RESET			WILOCITY_IOCTL (0x807)
-
-/* MiniPort driver only */
-#define WILOCITY_IOCTL_DRIVER_LOG_LEVELS_CFG	WILOCITY_IOCTL(0x900)
-
-
-
-//-----------------------------------------------------------------------------------
-// Other Definitions
-//-----------------------------------------------------------------------------------
-
-#define BASE_ADDRESS	0x880000
-
-// used to transfer address to the driver (input parameter)
-// or value from the driver (output parameter)
-// for example read register
-typedef struct _FILTER_1_ULONG_PARAM
-{
-	DWORD			param;
-
-} FILTER_1_ULONG_PARAM, *PFILTER_1_ULONG_PARAM;
-
-// used to transfer address and value to the driver (input parameter)
-// for example write register
-typedef struct _FILTER_2_ULONG_PARAMS
-{
-	DWORD			param1;
-	DWORD			param2;
-
-} FILTER_2_ULONG_PARAM, *PFILTER_2_ULONG_PARAM;
-
-#ifdef _WINDOWS
-#pragma warning( disable : 4200 ) //suppress warning
-#endif
-typedef struct _FILTER_WRITE_BLOCK
-{
-	DWORD			address;
-	DWORD			size;	// of 32 bits
-	DWORD			buffer[0];
-
-} FILTER_WRITE_BLOCK, *PFILTER_WRITE_BLOCK;
-
-typedef struct _FILTER_INTERRUPT_MODE
-{
-	BYTE			interruptMode; // 0 - Interrupt, 1 - MSI enable
-
-} FILTER_INTERRUPT_MODE, *PFILTER_INTERRUPT_MODE;
-
-
-//
-//  Structure to go with IOCTL_FILTE_OPEN_DEVICE.
-//
-typedef struct _FILTER_MAP_DEVICE
-{
-	BYTE			*userCRSAddress;
-	size_t			userCRSSize;
-
-} FILTER_MAP_DEVICE, *PFILTER_MAP_DEVICE;
-
-
-typedef struct _FILTER_GET_CFG
-{
-	DWORD			offset;
-	DWORD			value;
-
-} FILTER_GET_CFG, *PFILTER_GET_CFG;
-
-
-typedef struct _FILTER_SET_CFG
-{
-	DWORD			offset;
-	DWORD			value;
-
-} FILTER_SET_CFG, *PFILTER_SET_CFG;
-
-
-typedef struct _FILTER_OPEN_DEVICE
-{
-
-	DWORD 			reserved;
-} FILTER_OPEN_DEVICE, *PFILTER_OPEN_DEVICE;
-
-enum{
-	PCI,
-	CONF
-};
-
-
-
-/**
-* WILOCITY_IOCTL_DRIVER_LOG_LEVELS_CFG
-**/
-enum {WILO_DRV_NUM_LOG_COMPS = 32};
-
-typedef struct _DRIVER_LOGS_CFG
-{
-	ULONG logModulesEnableMsk;
-	ULONG logModuleLevelsMsk[WILO_DRV_NUM_LOG_COMPS];
-} DRIVER_LOGS_CFG, *P_DRIVER_LOGS_CFG;
-
-#ifdef _WINDOWS
-typedef struct _EVENT_HANDLE_64BIT
-{
-	ULONG	DeviceId;
-	int    EventId;
-	INT_PTR hEvent_l;
-	INT_PTR hEvent_h;
-
-} EVENT_HANDLE_64BIT, *PEVENT_HANDLE_64BIT;
-
-typedef struct _EVENT_HANDLE_32BIT
-{
-	ULONG	DeviceId;
-	int    EventId;
-	INT_PTR hEvent;
-} EVENT_HANDLE_32BIT, *PEVENT_HANDLE_32BIT;
-#endif //_WINDOWS
-
-#endif
-
diff --git a/debug-tools/lib/inc/wlct_os.h b/debug-tools/lib/inc/wlct_os.h
deleted file mode 100644
index 3c21ae0..0000000
--- a/debug-tools/lib/inc/wlct_os.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#ifdef _WINDOWS
-
-#include <windows.h>
-#include <atlbase.h>
-#include <atlstr.h>
-#include <assert.h>
-
-typedef unsigned __int8 u_int8_t;
-typedef unsigned __int16 u_int16_t;
-typedef unsigned __int32 u_int32_t;
-typedef unsigned __int64 u_int64_t;
-#if (defined(_MSC_VER) && (_MSC_VER < 1900))
-typedef __int8 int8_t;
-#endif
-typedef __int16 int16_t;
-typedef __int32 int32_t;
-typedef __int64 int64_t;
-typedef unsigned __int8 uint8_t;
-typedef unsigned __int16 uint16_t;
-typedef unsigned __int32 uint32_t;
-typedef unsigned __int64 uint64_t;
-
-typedef DWORD wlct_os_err_t;
-
-#define WLCT_OS_ERROR_SUCCESS              ERROR_SUCCESS
-#define WLCT_OS_ERROR_NOT_SUPPORTED        ERROR_NOT_SUPPORTED
-#define WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED ERROR_CALL_NOT_IMPLEMENTED
-#define WLCT_OS_ERROR_GEN_FAILURE          ERROR_GEN_FAILURE
-#define WLCT_OS_ERROR_NOT_ENOUGH_MEMORY    ERROR_NOT_ENOUGH_MEMORY
-#define WLCT_OS_ERROR_NO_SUCH_ENTRY        ERROR_FILE_NOT_FOUND
-#define WLCT_OS_ERROR_OPEN_FAILED          ERROR_OPEN_FAILED
-
-#define WLCT_ASSERT assert
-
-#define __TRY __try
-
-#define __EXCEPT __except
-
-#define sleep_ms Sleep
-
-#define WlctGetLastError GetLastError
-
-#else
-
-#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#include <string>
-
-#define WLCT_ASSERT assert
-
-#define __INLINE   __inline
-
-typedef uint8_t         BYTE;
-typedef uint16_t        WORD;
-typedef uint32_t        DWORD;
-
-typedef unsigned char   UCHAR;
-typedef unsigned int    UINT;
-typedef char            CHAR;
-typedef long            LONG;
-typedef unsigned short  USHORT;
-typedef unsigned long   ULONG;
-typedef ULONG*          ULONG_PTR;
-
-typedef char            TCHAR;
-
-typedef uint8_t         u_int8_t;
-typedef uint16_t        u_int16_t;
-typedef uint32_t        u_int32_t;
-typedef uint64_t        u_int64_t;
-
-typedef const TCHAR     *LPCTSTR;
-typedef TCHAR           *LPTSTR;
-typedef CHAR            *LPSTR;
-typedef const CHAR      *LPCSTR;
-
-typedef DWORD           HANDLE;
-
-typedef int             BOOL;
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#include <errno.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <sys/stat.h>
-#include <strings.h>
-
-typedef int wlct_os_err_t;
-
-#define WLCT_OS_ERROR_SUCCESS              0
-#define WLCT_OS_ERROR_NOT_SUPPORTED        -ENOTSUP
-#define WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED -ENOSYS
-#define WLCT_OS_ERROR_GEN_FAILURE          -EINVAL
-#define WLCT_OS_ERROR_NOT_ENOUGH_MEMORY    -ENOMEM
-#define WLCT_OS_ERROR_NO_SUCH_ENTRY        -ENOENT
-#define WLCT_OS_ERROR_OPEN_FAILED          -EBADF
-
-#define _T(x) (x)
-
-#define __TRY if (1)
-#define __EXCEPT(ignore) else if (0)
-
-#define WLCT_MSEC_IN_SEC 1000
-
-#define sleep_ms(msec) usleep(msec * WLCT_MSEC_IN_SEC)
-
-#define USES_CONVERSION
-
-#define T2A(x) (x)
-
-#define _tcscpy_s(x, y, z) snprintf((x), (y), "%s", (z))
-#define _tcslen            strlen
-#define _stprintf_s        snprintf
-#define _snprintf          snprintf
-//#define sprintf_s          sprintf
-//#define _stprintf          sprintf
-#define sscanf_s           sscanf
-#define _tcstok_s          strtok_r
-#define _tcsstr            strstr
-#define _tcsicmp           strcasecmp
-#define _vsntprintf        vsnprintf
-#define _tfopen            fopen
-
-#define WlctGetLastError() errno
-
-#endif
-
-#include "StlChar.h"
-
-
-#define WLCT_UNREFERENCED_PARAM(x)  ((x) = (x))
diff --git a/debug-tools/lib/inc/wmi.h b/debug-tools/lib/inc/wmi.h
deleted file mode 100644
index 9896a3a..0000000
--- a/debug-tools/lib/inc/wmi.h
+++ /dev/null
@@ -1,1184 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef MARLON_WMI_H_
-#define MARLON_WMI_H_
-
-#include "basic_types.h"
-
-#if defined(_MSC_VER)           // Microsoft
-#pragma pack (push, marlon_wmi, 1) /* set alignment to 1 byte boundary */
-#endif
-
-
-
-/**
- * **********************************************************************************************************************************
- *                                                          General
- * **********************************************************************************************************************************
- */
-
-#define WMI_CONTROL_MSG_MAX_LEN     	256
-#define WMI_MAC_LEN             		6               /* length of mac in bytes */
-#define WMI_PROX_RANGE_NUM              3
-
-
- enum wmi_phy_capability_e {
-    WMI_11A_CAPABILITY   = 1,
-    WMI_11G_CAPABILITY   = 2,
-    WMI_11AG_CAPABILITY  = 3,
-    WMI_11NA_CAPABILITY  = 4,
-    WMI_11NG_CAPABILITY  = 5,
-    WMI_11NAG_CAPABILITY = 6,
-	WMI_11AD_CAPABILITY  = 7,
-    // END CAPABILITY
-    WMI_11N_CAPABILITY_OFFSET = (WMI_11NA_CAPABILITY - WMI_11A_CAPABILITY),
-} ;
-
-/**
- *  Marlon Mailbox interface
- *  used for commands and events
- */
-#define WMI_GET_DEVICE_ID(info1) ((info1) & 0xF)
-typedef  struct {
-	U16	     padding;
-    U16      commandId;
-/*
- * info1 - 16 bits
- * b03:b00 - id
- * b15:b04 - unused
- */
-    U16      info1;
-    U16      reserved;      /* For alignment */
-}  WMI_CMD_HDR;
-
-
-
-/**
- * **********************************************************************************************************************************
- *                                                          WMI Commands
- * **********************************************************************************************************************************
- */
-
-/*
- * List of Commands
- */
-typedef enum {
-    WMI_CONNECT_CMDID                       = 0x0001,
-    WMI_DISCONNECT_CMDID                    = 0x0003,
-    WMI_START_SCAN_CMDID                    = 0x0007,
-    WMI_SET_BSS_FILTER_CMDID                = 0x0009,
-    WMI_SET_PROBED_SSID_CMDID               = 0x000a,
-    WMI_SET_LISTEN_INT_CMDID                = 0x000b,
-    WMI_BCON_CTRL_CMDID                     = 0x000f,
-    WMI_ADD_CIPHER_KEY_CMDID                = 0x0016,
-    WMI_DELETE_CIPHER_KEY_CMDID             = 0x0017,
-    WMI_SET_APPIE_CMDID                     = 0x003f,
-    WMI_GET_APPIE_CMDID                     = 0x0040,
-    WMI_SET_WSC_STATUS_CMDID                = 0x0041,
-    WMI_PXMT_RANGE_CFG_CMDID                = 0x0042,
-    WMI_PXMT_SNR2_RANGE_CFG_CMDID           = 0x0043,
-    WMI_FAST_MEM_ACC_MODE_CMDID 	    = 0x0300,
-    WMI_MEM_READ_CMDID			    = 0x0800,
-    WMI_MEM_WR_CMDID			    = 0x0801,
-    WMI_ECHO_CMDID			    = 0x0803,
-    WMI_DEEP_ECHO_CMDID			    = 0x0804,
-    WMI_CONFIG_MAC_CMDID		    = 0x0805,
-    WMI_CONFIG_PHY_DEBUG_CMDID              = 0x0806,
-    WMI_ADD_STATION_CMDID		    = 0x0807,
-    WMI_ADD_DEBUG_TX_PCKT_CMDID		    = 0x0808,
-    WMI_PHY_GET_STATISTICS_CMDID            = 0x0809,
-    WMI_FS_TUNE_CMDID                       = 0x080A,
-    WMI_CORR_MEASURE_CMDID                  = 0x080B,
-    WMI_TEMP_SENSE_CMDID                    = 0x080E,
-    WMI_DC_CALIB_CMDID                      = 0x080F,
-    WMI_SEND_TONE_CMDID                     = 0x0810,
-    WMI_IQ_TX_CALIB_CMDID                   = 0x0811,
-    WMI_IQ_RX_CALIB_CMDID                   = 0x0812,
-    WMI_SET_UCODE_IDLE_CMDID                = 0x0813,
-    WMI_SET_WORK_MODE_CMDID                 = 0x0815,
-    WMI_LO_LEAKAGE_CALIB_CMDID              = 0x0816,
-    WMI_MARLON_R_ACTIVATE_CMDID             = 0x0817,
-    WMI_MARLON_R_READ_CMDID                 = 0x0818,
-    WMI_MARLON_R_WRITE_CMDID                = 0x0819,
-    WMI_MARLON_R_TXRX_SEL_CMDID             = 0x081A,
-    MAC_IO_STATIC_PARAMS_CMDID              = 0x081B,
-    MAC_IO_DYNAMIC_PARAMS_CMDID             = 0x081C,
-    WMI_SILENT_RSSI_CALIB_CMDID             = 0x081D,
-    WMI_CFG_RX_CHAIN_CMDID		    = 0x0820,
-    WMI_VRING_CFG_CMDID		    	    = 0x0821,
-    WMI_RX_ON_CMDID			    = 0x0822,
-    WMI_VRING_BA_EN_CMDID		    = 0x0823,
-    WMI_VRING_BA_DIS_CMDID		    = 0x0824,
-    WMI_RCP_ADDBA_RESP_CMDID		    = 0x0825,
-    WMI_RCP_DELBA_CMDID			    = 0x0826,
-    WMI_SET_SSID_CMDID			    = 0x0827,
-    WMI_GET_SSID_CMDID			    = 0x0828,
-    WMI_SET_PCP_CHANNEL_CMDID               = 0x0829,
-    WMI_GET_PCP_CHANNEL_CMDID               = 0x082a,
-    WMI_SW_TX_REQ_CMDID			    = 0x082b,
-    WMI_READ_MAC_RXQ_CMDID                  = 0x0830,
-    WMI_READ_MAC_TXQ_CMDID                  = 0x0831,
-    WMI_WRITE_MAC_RXQ_CMDID                 = 0x0832,
-    WMI_WRITE_MAC_TXQ_CMDID                 = 0x0833,
-    WMI_WRITE_MAC_XQ_FIELD_CMDID            = 0x0834,
-    WMI_MLME_PUSH_CMDID                     = 0x0835,
-    WMI_BEAMFORMING_MGMT_CMDID              = 0x0836,
-    WMI_BF_TXSS_MGMT_CMDID                  = 0x0837,
-    WMI_BF_SM_MGMT_CMDID                    = 0x0838,
-    WMI_BF_RXSS_MGMT_CMDID                  = 0x0839,
-    WMI_SET_SECTORS_CMDID                   = 0x0849,
-    WMI_MAINTAIN_PAUSE_CMDID                = 0x0850,
-    WMI_MAINTAIN_RESUME_CMDID               = 0x0851,
-    WMI_RS_MGMT_CMDID                       = 0x0852,
-    WMI_RF_MGMT_CMDID		            = 0x0853,
-    /* Performance monitoring commands */
-    WMI_BF_CTRL_CMDID                       = 0x0862,
-    WMI_NOTIFY_REQ_CMDID                    = 0x0863,
-    WMI_GET_STATUS_CMDID                    = 0x0864,
-    WMI_UNIT_TEST_CMDID                     = 0x0900,
-    WMI_HICCUP_CMDID                        = 0x0901,
-    WMI_FLASH_READ_CMDID                    = 0x0902,
-    WMI_FLASH_WRITE_CMDID                   = 0x0903,
-    WMI_SECURITY_UNIT_TEST_CMDID            = 0x0904,
-
-    WMI_SET_MAC_ADDRESS_CMDID               = 0xF003,
-    WMI_ABORT_SCAN_CMDID                    = 0xF007,
-    WMI_SET_PMK_CMDID                       = 0xF028,
-
-    WMI_SET_PROMISCUOUS_MODE_CMDID          = 0xF041,
-    WMI_GET_PMK_CMDID                       = 0xF048,
-    WMI_SET_PASSPHRASE_CMDID                = 0xF049,
-    WMI_SEND_ASSOC_RES_CMDID                = 0xF04a,
-    WMI_SET_ASSOC_REQ_RELAY_CMDID           = 0xF04b,
-    WMI_EAPOL_TX_CMDID                      = 0xF04c,
-    WMI_MAC_ADDR_REQ_CMDID                  = 0xF04d,
-    WMI_FW_VER_CMDID 		            = 0xF04e,
-} WMI_COMMAND_ID;
-
-
-
-/*******************************************************************************************************************
- *                                              Commands data structures
- *******************************************************************************************************************/
-
-/*
- * Frame Types
- */
- enum wmi_mgmt_frame_type_e {
-    WMI_FRAME_BEACON        =   0,
-    WMI_FRAME_PROBE_REQ,
-    WMI_FRAME_PROBE_RESP,
-    WMI_FRAME_ASSOC_REQ,
-    WMI_FRAME_ASSOC_RESP,
-    WMI_NUM_MGMT_FRAME
-} ;
-
-/*
- * WMI_CONNECT_CMDID
- */
- enum wmi_network_type_e {
-    INFRA_NETWORK       = 0x01,
-    ADHOC_NETWORK       = 0x02,
-    ADHOC_CREATOR       = 0x04,
-    AP_NETWORK          = 0x10,
-    P2P_NETWORK         = 0x20,
-    WBE_NETWORK         = 0x40,
-} ;
-
- enum wmi_dot11_auth_mode_e {
-    OPEN_AUTH           = 0x01,
-    SHARED_AUTH         = 0x02,
-    LEAP_AUTH           = 0x04,
-    WSC_AUTH            = 0x08
-} ;
-
- enum wmi_auth_mode_e {
-    NONE_AUTH           = 0x01,
-    WPA_AUTH            = 0x02,
-    WPA2_AUTH           = 0x04,
-    WPA_PSK_AUTH        = 0x08,
-    WPA2_PSK_AUTH       = 0x10,
-    WPA_AUTH_CCKM       = 0x20,
-    WPA2_AUTH_CCKM      = 0x40,
-} ;
-
- enum wmi_crypto_type_e {
-    NONE_CRYPT          = 0x01,
-    WEP_CRYPT           = 0x02,
-    TKIP_CRYPT          = 0x04,
-    AES_CRYPT           = 0x08,
-    AES_GCMP_CRYPT      = 0x20
-} ;
-
-
- enum wmi_connect_ctrl_flag_bits_e {
-    CONNECT_ASSOC_POLICY_USER           = 0x0001,
-    CONNECT_SEND_REASSOC                = 0x0002,
-    CONNECT_IGNORE_WPAx_GROUP_CIPHER    = 0x0004,
-    CONNECT_PROFILE_MATCH_DONE          = 0x0008,
-    CONNECT_IGNORE_AAC_BEACON           = 0x0010,
-    CONNECT_CSA_FOLLOW_BSS              = 0x0020,
-    CONNECT_DO_WPA_OFFLOAD              = 0x0040,
-    CONNECT_DO_NOT_DEAUTH               = 0x0080,
-} ;
-
-#define WMI_MAX_SSID_LEN    32
-
- typedef PREPACK struct  {
-    U08 networkType;
-    U08 dot11AuthMode;
-    U08 authMode;
-    U08 pairwiseCryptoType;
-    U08 pairwiseCryptoLen;
-    U08 groupCryptoType;
-    U08 groupCryptoLen;
-    U08 ssidLength;
-    U08 ssid[WMI_MAX_SSID_LEN];
-    U16 channel;
-    U08 bssid[WMI_MAC_LEN];
-    U32 ctrl_flags;
-    U08 destMacAddr[WMI_MAC_LEN];
-    U16 reserved;
-}  POSTPACK WMI_CONNECT_CMD;
-
-
-/*
- * WMI_RECONNECT_CMDID
- */
- typedef PREPACK struct  {
-    U16 channel;                    /* hint */
-    U08 bssid[WMI_MAC_LEN];         /* mandatory if set */
-} POSTPACK WMI_RECONNECT_CMD;
-
-
-/*
- * WMI_SET_PMK_CMDID
- */
-
-#define WMI_MIN_KEY_INDEX   0
-#define WMI_MAX_KEY_INDEX   3
-#define WMI_MAX_KEY_LEN     32
-#define WMI_PASSPHRASE_LEN  64
-#define WMI_PMK_LEN     	32
-
-typedef PREPACK struct   {
-    U08 pmk[WMI_PMK_LEN];
-} POSTPACK WMI_SET_PMK_CMD;
-
-
-/*
- * WMI_SET_PASSPHRASE_CMDID
- */
- typedef PREPACK struct  {
-    U08 ssid[WMI_MAX_SSID_LEN];
-    U08 passphrase[WMI_PASSPHRASE_LEN];
-    U08 ssid_len;
-    U08 passphrase_len;
-} POSTPACK WMI_SET_PASSPHRASE_CMD;
-
-/*
- * WMI_ADD_CIPHER_KEY_CMDID
- */
-enum wmi_connect_key_usage_e {
-    PAIRWISE_USAGE      = 0x00,
-    GROUP_USAGE         = 0x01,
-    TX_USAGE            = 0x02,     /* default Tx Key - Static WEP only */
-} ;
-
- typedef PREPACK struct  {
-    U08     keyIndex;
-    U08     keyType;
-    U08     keyUsage;           /* wmi_connect_key_usage_e */
-    U08     keyLength;
-    U08     keyRSC[8];          /* key replay sequence counter */
-    U08     key[WMI_MAX_KEY_LEN];
-    U08     key_op_ctrl;       /* Additional Key Control information */
-    U08     key_macaddr[WMI_MAC_LEN];
-} POSTPACK WMI_ADD_CIPHER_KEY_CMD;
-
-/*
- * WMI_DELETE_CIPHER_KEY_CMDID
- */
- typedef PREPACK struct  {
-    U08     keyIndex;
-    U08     key_macaddr[WMI_MAC_LEN];
-} POSTPACK WMI_DELETE_CIPHER_KEY_CMD;
-
-
-/*
- * WMI_START_SCAN_CMD
- */
- enum wmi_scan_type_e {
-    WMI_LONG_SCAN  = 0,
-    WMI_SHORT_SCAN = 1,
-	WMI_PBC_SCAN   = 2
-} ;
-
- typedef PREPACK struct  {
-    S32	forceFgScan;
-    S32	isLegacy;               /* For Legacy Cisco AP compatibility */
-    U32	homeDwellTime;          /* Maximum duration in the home channel(milliseconds) */
-    U32	forceScanInterval;      /* Time interval between scans (milliseconds)*/
-    U08	scanType;               /* wmi_scan_type_e */
-    U08	numChannels;            /* how many channels follow */
-    U16	channelList[4];         /* channels in Mhz */
-} POSTPACK WMI_START_SCAN_CMD;
-
-/*
- * WMI_SET_PROBED_SSID_CMDID
- */
-#define MAX_PROBED_SSID_INDEX   15
-
- enum wmi_ssid_flag_e {
-    DISABLE_SSID_FLAG  = 0,                  /* disables entry */
-    SPECIFIC_SSID_FLAG = 0x01,               /* probes specified ssid */
-    ANY_SSID_FLAG      = 0x02,               /* probes for any ssid */
-} ;
-
- typedef PREPACK struct  {
-    U08     entryIndex;                     /* 0 to MAX_PROBED_SSID_INDEX */
-    U08     flag;                           /* wmi_ssid_flag_e */
-    U08     ssidLength;
-    U08     ssid[WMI_MAX_SSID_LEN];
-} POSTPACK WMI_PROBED_SSID_CMD;
-
-
-/*
- * Add Application specified IE to a management frame
- */
-#define WMI_MAX_IE_LEN  255
-
-#ifdef _WINDOWS
-#pragma warning( disable : 4200 ) //suppress warning
-#endif
-typedef PREPACK struct  {
-    U08 mgmtFrmType;  /* one of wmi_mgmt_frame_type_e */
-    U08 ieLen;    /* Length  of the IE that should be added to the MGMT frame */
-    U08 ieInfo[EMPTY_ARRAY_SIZE];
-} POSTPACK WMI_SET_APPIE_CMD;
-
-
-typedef PREPACK struct {
-	U08  destMacAddr[WMI_MAC_LEN];
-	U16 range;
-} POSTPACK WMI_PXMT_RANGE_CFG_CMD;
-
-typedef PREPACK struct {
-	S08 snr2range_arr[WMI_PROX_RANGE_NUM-1];
-} POSTPACK WMI_PXMT_SNR2_RANGE_CFG_CMD;
-
-/*
- * WMI_RF_MGMT_CMDID
- */
-typedef enum wmi_rf_mgmt_type_e {
-    WMI_RF_MGMT_W_DISABLE	= 0x0,
-    WMI_RF_MGMT_W_ENABLE	= 0x1,
-    WMI_RF_MGMT_GET_STATUS	= 0x2
-} WMI_RF_MGMT_TYPE;
-
- typedef PREPACK struct  {
-	U32	rf_mgmt_type;
-} POSTPACK WMI_RF_MGMT_CMD;
-
-
-/*
- * WMI_SET_SSID_CMDID
- */
- typedef PREPACK struct  {
-    U32	ssid_len;
-    U08	ssid[WMI_MAX_SSID_LEN];
-} POSTPACK WMI_SET_SSID_CMD;
-
-/*
- * WMI_SET_PCP_CHANNEL_CMDID
- */
- typedef PREPACK struct  {
-    U08	channel_index;
-    U08	reserved[3];
-} POSTPACK WMI_SET_PCP_CHANNEL_CMD;
-
-
-/*
- * WMI_BCON_CTRL_CMDID
- */
- typedef PREPACK struct  {
-    U16	bcon_interval;
-    U16	frag_num;
-    U32	ss_mask_low;
-    U32	ss_mask_high;
-    U16	network_type;
-    U08	disable_sec_offload;
-    U08	disable_sec;
-} POSTPACK WMI_BCON_CTRL_CMD;
-
-/*
- * WMI_SW_TX_REQ_CMDID
- */
-typedef PREPACK struct  {
-   U08	destMacAddr[WMI_MAC_LEN];
-   U16  length;
-} POSTPACK WMI_SW_TX_REQ_CMD;
-
-/*
- * WMI_VRING_CFG_CMDID
- */
-
- typedef PREPACK struct  {
-    U32	ring_mem_base_l;
-    U16	ring_mem_base_h;
-    U16	reserved0;
-    U16	ring_size;
-    U16	max_mpdu_size;
-} POSTPACK wmi_sw_ring_cfg_s;
-
-
-
-enum wmi_vring_cfg_schd_params_priority_e {
-	REGULAR = 0x0,
-	HIGH = 0x1,
-};
-
-typedef PREPACK struct  {
-    U16	priority;
-    U16	timeslot_us;
-} POSTPACK wmi_vring_cfg_schd_s;
-
-enum wmi_vring_cfg_encap_trans_type_e {
-	ENC_TYPE_802_3 = 0x0,
-	ENC_TYPE_NATIVE_WIFI = 0x1
-};
-
-enum wmi_vring_cfg_ds_cfg_e {
-	DS_PBSS_MODE = 0x0,
-	DS_STA_MODE = 0x1,
-	DS_AP_MODE = 0x2,
-	DS_ADDR4_MODE = 0x3
-};
-
-enum wmi_vring_cfg_nwifi_ds_trans_type_e {
-	NWIFI_TX_NO_TRANS_MODE = 0x0,
-	NWIFI_TX_AP2PBSS_TRANS_MODE = 0x1,
-	NWIFI_TX_STA2PBSS_TRANS_MODE = 0x2
-};
-
-typedef PREPACK struct  {
-    wmi_sw_ring_cfg_s	tx_sw_ring;
-    U08	ringid;                         /* 0-23 vrings */
-
-	#define CIDXTID_CID_POS 0
-	#define CIDXTID_CID_LEN 4
-	#define CIDXTID_CID_MSK 0xF
-	#define CIDXTID_TID_POS 4
-	#define CIDXTID_TID_LEN 4
-	#define CIDXTID_TID_MSK 0xF0
-	U08 cidxtid_byte;
-
-    U08	encap_trans_type;
-    U08	ds_cfg;                         /* 802.3 DS cfg */
-    U08	nwifi_ds_trans_type;
-
-	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_POS 0
-	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_LEN 1
-	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_MSK 0x1
-	#define VRING_CFG_MAC_CTRL_AGGR_EN_POS 1
-	#define VRING_CFG_MAC_CTRL_AGGR_EN_LEN 1
-	#define VRING_CFG_MAC_CTRL_AGGR_EN_MSK 0x2
-    U08	mac_ctrl_byte;
-
-	#define VRING_CFG_TO_RESOLUTION_VALUE_POS 0
-	#define VRING_CFG_TO_RESOLUTION_VALUE_LEN 6
-	#define VRING_CFG_TO_RESOLUTION_VALUE_MSK 0x3F
-    U08	to_resolution_byte;
-    U08	agg_max_wsize;
-    wmi_vring_cfg_schd_s	schd_params;
-} POSTPACK wmi_vring_cfg_s;
-
-
-enum wmi_vring_cfg_cmd_action_e {
-	ADD_VRING = 0x0,
-	MODIFY_VRING = 0x1,
-	DELETE_VRING = 0x2
-};
-
- typedef PREPACK struct  {
-    U32	action;
-    wmi_vring_cfg_s	vring_cfg;
-} POSTPACK WMI_VRING_CFG_CMD;
-
-
-/*
- * WMI_VRING_BA_EN_CMDID
- */
- typedef PREPACK struct  {
-    U08	ringid;
-    U08	agg_max_wsize;
-    U16	ba_timeout;
-} POSTPACK WMI_VRING_BA_EN_CMD;
-
-
-/*
- * WMI_VRING_BA_DIS_CMDID
- */
- typedef PREPACK struct  {
-    U08	ringid;
-    U08	reserved0;
-    U16	reason;
-} POSTPACK WMI_VRING_BA_DIS_CMD;
-
-/*
- * WMI_START_SCAN_CMDID
- */
-enum wmi_scan_ctrl_cmd_scan_mode_e {
-	ACTIVE_SCAN = 0x0,
-	PASSIV_SCAN = 0x1,
-	NO_SCAN = 0x2
-};
-
- typedef PREPACK struct  {
-    U16	in_channel_interval;
-    U16	num_of_channels;
-    U16	channel_list;
-    U16	scan_param;
-    U32	scan_mode;
-} POSTPACK WMI_SCAN_CTRL_CMD;
-
-/*
- * WMI_NOTIFY_REQ_CMDID
- */
- typedef PREPACK struct  {
-	U32 cid;
-	U32 interval_usec;
-} POSTPACK WMI_NOTIFY_REQ_CMD;
-
-/*
- * WMI_CFG_RX_CHAIN_CMDID
- */
-enum wmi_sniffer_cfg_mode_e {
-	SNIFFER_OFF = 0x0,
-	SNIFFER_ON = 0x1
-};
-enum wmi_sniffer_cfg_phy_info_mode_e {
-	SNIFFER_PHY_INFO_DISABLED = 0x0,
-	SNIFFER_PHY_INFO_ENABLED = 0x1
-};
-enum wmi_sniffer_cfg_phy_support_e {
-	SNIFFER_CP = 0x0,
-	SNIFFER_DP = 0x1,
-	SNIFFER_BOTH_PHYS = 0x2
-};
- typedef PREPACK struct  {
-    U32	mode;
-    U32	phy_info_mode;
-    U32	phy_support;
-    U32	channel_id;
-} POSTPACK wmi_sniffer_cfg_s;
-
-enum wmi_cfg_rx_chain_cmd_action_e {
-	ADD_RX_CHAIN = 0x0,
-	DELETE_RX_CHAIN = 0x1
-};
-enum wmi_cfg_rx_chain_cmd_decap_trans_type_e {
-	DECAP_TYPE_802_3 = 0x0,
-	DECAP_TYPE_NATIVE_WIFI = 0x1
-};
-enum wmi_cfg_rx_chain_cmd_nwifi_ds_trans_type_e {
-	NWIFI_RX_NO_TRANS_MODE = 0x0,
-	NWIFI_RX_PBSS2AP_TRANS_MODE = 0x1,
-	NWIFI_RX_PBSS2STA_TRANS_MODE = 0x2
-};
-
- typedef PREPACK struct  {
-    U32	action;
-    wmi_sw_ring_cfg_s	rx_sw_ring;
-    U08	mid;
-    U08	decap_trans_type;
-
-	#define CFG_RX_CHAIN_CMD_L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_POS 0
-	#define CFG_RX_CHAIN_CMD_L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_LEN 1
-	#define CFG_RX_CHAIN_CMD_L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_MSK 0x1
-    U08	l2_802_3_offload_ctrl_byte;
-
-	#define CFG_RX_CHAIN_CMD_L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_POS 0
-	#define CFG_RX_CHAIN_CMD_L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_LEN 1
-	#define CFG_RX_CHAIN_CMD_L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_MSK 0x1
-	#define CFG_RX_CHAIN_CMD_L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_POS 1
-	#define CFG_RX_CHAIN_CMD_L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_LEN 1
-	#define CFG_RX_CHAIN_CMD_L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_MSK 0x2
-    U08 l2_nwifi_offload_ctrl_byte;
-
-    U08	vlan_id;
-    U08	nwifi_ds_trans_type;
-
-	#define CFG_RX_CHAIN_CMD_L3_L4_CTRL_IPV4_CHECKSUM_EN_POS 0
-	#define CFG_RX_CHAIN_CMD_L3_L4_CTRL_IPV4_CHECKSUM_EN_LEN 1
-	#define CFG_RX_CHAIN_CMD_L3_L4_CTRL_IPV4_CHECKSUM_EN_MSK 0x1
-	#define CFG_RX_CHAIN_CMD_L3_L4_CTRL_TCPIP_CHECKSUM_EN_POS 1
-	#define CFG_RX_CHAIN_CMD_L3_L4_CTRL_TCPIP_CHECKSUM_EN_LEN 1
-	#define CFG_RX_CHAIN_CMD_L3_L4_CTRL_TCPIP_CHECKSUM_EN_MSK 0x2
-    U08	l3_l4_ctrl_byte;
-
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_PREFETCH_THRSH_POS 0
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_PREFETCH_THRSH_LEN 1
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_PREFETCH_THRSH_MSK 0x1
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_WB_THRSH_POS 1
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_WB_THRSH_LEN 1
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_WB_THRSH_MSK 0x2
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_ITR_THRSH_POS 2
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_ITR_THRSH_LEN 1
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_ITR_THRSH_MSK 0x4
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_HOST_THRSH_POS 3
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_HOST_THRSH_LEN 1
-	#define CFG_RX_CHAIN_CMD_RING_CTRL_OVERRIDE_HOST_THRSH_MSK 0x8
-    U08	ring_ctrl;
-
-    U16	prefetch_thrsh;
-    U16	wb_thrsh;
-    U32	itr_value;
-    U16	host_thrsh;
-    U16	reserved;
-    wmi_sniffer_cfg_s	sniffer_cfg;
-} POSTPACK WMI_CFG_RX_CHAIN_CMD;
-
-/*
- * WMI_RCP_ADDBA_RESP_CMDID
- */
- typedef PREPACK struct  {
-
-	#define CIDXTID_CID_POS 0
-	#define CIDXTID_CID_LEN 4
-	#define CIDXTID_CID_MSK 0xF
-	#define CIDXTID_TID_POS 4
-	#define CIDXTID_TID_LEN 4
-	#define CIDXTID_TID_MSK 0xF0
-	U08 cidxtid_byte;
-
-    U08	dialog_token;
-    U16	status_code;
-    U16	ba_param_set;                   /* ieee80211_ba_parameterset field to send */
-    U16	ba_timeout;
-} POSTPACK WMI_RCP_ADDBA_RESP_CMD;
-
-/*
- * WMI_RCP_DELBA_CMDID
- */
- typedef PREPACK struct  {
-
-	#define CIDXTID_CID_POS 0
-	#define CIDXTID_CID_LEN 4
-	#define CIDXTID_CID_MSK 0xF
-	#define CIDXTID_TID_POS 4
-	#define CIDXTID_TID_LEN 4
-	#define CIDXTID_TID_MSK 0xF0
-	U08 cidxtid_byte;
-
-    U08	rsvd;
-    U16	reason;
-} POSTPACK WMI_RCP_DELBA_CMD;
-
-/*
- * WMI_RCP_ADDBA_REQ_CMDID
- */
- typedef PREPACK struct  {
-
-	#define CIDXTID_CID_POS 0
-	#define CIDXTID_CID_LEN 4
-	#define CIDXTID_CID_MSK 0xF
-	#define CIDXTID_TID_POS 4
-	#define CIDXTID_TID_LEN 4
-	#define CIDXTID_TID_MSK 0xF0
-	U08 cidxtid_byte;
-
-    U08	dialog_token;
-    U16	ba_param_set;                   /* ieee80211_ba_parameterset field as it received */
-    U16	ba_timeout;
-    U16	ba_seq_ctrl;                    /* ieee80211_ba_seqstrl field as it received */
-} POSTPACK WMI_RCP_ADDBA_REQ_CMD;
-
-/**
- *  WMI_SET_MAC_ADDRESS_CMDID
- */
-typedef PREPACK struct  {
-    U08 macaddr[WMI_MAC_LEN];
-	U16 reserved;
-} POSTPACK WMI_SET_MAC_ADDRESS_CMD;
-
-
-/*
-* WMI_EAPOL_TX_CMDID
-*/
- typedef PREPACK struct  {
-	U08 dst_mac[WMI_MAC_LEN];
-	U16 eapol_len;
-	U08 eapol[EMPTY_ARRAY_SIZE];
-} POSTPACK WMI_EAPOL_TX_CMD;
-
-/*
-* WMI_ECHO_CMDID
-*/
-typedef PREPACK struct {
-    U32	value;
-} POSTPACK WMI_ECHO_CMD;
-
-/**
- * **********************************************************************************************************************************
- *                                                          WMI Events
- * **********************************************************************************************************************************
- */
-
-/*
- * List of Events (target to host)
- */
-enum WMI_EVENT_ID {
-    WMI_IMM_RSP_EVENTID			= 0x0000,
-    WMI_READY_EVENTID                   = 0x1001,
-    WMI_CONNECT_EVENTID                 = 0x1002,
-    WMI_DISCONNECT_EVENTID              = 0x1003,
-    WMI_SCAN_COMPLETE_EVENTID           = 0x100a,
-    WMI_REPORT_STATISTICS_EVENTID       = 0x100b,
-    WMI_RD_MEM_RSP_EVENTID 		= 0x1800,
-    WMI_FW_READY_EVENTID                = 0x1801,
-    WMI_EXIT_FAST_MEM_ACC_MODE_EVENTID 	= 0x0200,
-    WMI_ECHO_RSP_EVENTID		= 0x1803,
-    WMI_CONFIG_MAC_DONE_EVENTID         = 0x1805,
-    WMI_CONFIG_PHY_DEBUG_DONE_EVENTID   = 0x1806,
-    WMI_ADD_STATION_DONE_EVENTID	= 0x1807,
-    WMI_ADD_DEBUG_TX_PCKT_DONE_EVENTID  = 0x1808,
-    WMI_PHY_GET_STATISTICS_EVENTID      = 0x1809,
-    WMI_FS_TUNE_DONE_EVENTID            = 0x180A,
-    WMI_CORR_MEASURE_DONE_EVENTID       = 0x180B,
-    WMI_TEMP_SENSE_DONE_EVENTID         = 0x180E,
-    WMI_DC_CALIB_DONE_EVENTID           = 0x180F,
-    WMI_IQ_TX_CALIB_DONE_EVENTID        = 0x1811,
-    WMI_IQ_RX_CALIB_DONE_EVENTID        = 0x1812,
-    WMI_SET_WORK_MODE_DONE_EVENTID      = 0x1815,
-    WMI_LO_LEAKAGE_CALIB_DONE_EVENTID   = 0x1816,
-    WMI_MARLON_R_ACTIVATE_DONE_EVENTID  = 0x1817,
-    WMI_MARLON_R_READ_DONE_EVENTID      = 0x1818,
-    WMI_MARLON_R_WRITE_DONE_EVENTID     = 0x1819,
-    WMI_MARLON_R_TXRX_SEL_DONE_EVENTID  = 0x181A,
-    WMI_SILENT_RSSI_CALIB_DONE_EVENTID  = 0x181D,
-
-    WMI_CFG_RX_CHAIN_DONE_EVENTID	= 0x1820,
-    WMI_VRING_CFG_DONE_EVENTID		= 0x1821,
-    WMI_RX_ON_EVENTID			= 0x1822,
-    WMI_BA_STATUS_EVENTID		= 0x1823,
-    WMI_RCP_ADDBA_REQ_EVENTID		= 0x1824,
-    WMI_ADDBA_RESP_SENT_EVENTID		= 0x1825,
-    WMI_DELBA_EVENTID			= 0x1826,
-    WMI_GET_SSID_EVENTID		= 0x1828,
-    WMI_GET_PCP_CHANNEL_EVENTID        	= 0x182a,
-    WMI_SW_TX_COMPLETE_EVENTID		= 0x182b,
-
-    WMI_READ_MAC_RXQ_EVENTID		= 0x1830,
-    WMI_READ_MAC_TXQ_EVENTID		= 0x1831,
-    WMI_WRITE_MAC_RXQ_EVENTID		= 0x1832,
-    WMI_WRITE_MAC_TXQ_EVENTID		= 0x1833,
-    WMI_WRITE_MAC_XQ_FIELD_EVENTID	= 0x1834,
-
-    WMI_BEAFORMING_MGMT_DONE_EVENTID    = 0x1836,
-    WMI_BF_TXSS_MGMT_DONE_EVENTID       = 0x1837,
-    WMI_BF_RXSS_MGMT_DONE_EVENTID       = 0x1839,
-    WMI_RS_MGMT_DONE_EVENTID            = 0x1852,
-    WMI_RF_MGMT_STATUS_EVENTID	        = 0x1853,
-    WMI_BF_SM_MGMT_DONE_EVENTID         = 0x1838,
-	WMI_RX_MGMT_PACKET_EVENTID	= 0x1840,
-
-    /* Performance monitoring events */
-    WMI_DATA_PORT_OPEN_EVENTID		= 0x1860,
-    WMI_WBE_LINKDOWN_EVENTID		= 0x1861,
-
-    WMI_BF_CTRL_DONE_EVENTID            = 0x1862,
-    WMI_NOTIFY_REQ_DONE_EVENTID         = 0x1863,
-    WMI_GET_STATUS_DONE_EVENTID         = 0x1864,
-
-    WMI_UNIT_TEST_EVENTID               = 0x1900,
-    WMI_FLASH_READ_DONE_EVENTID         = 0x1902,
-    WMI_FLASH_WRITE_DONE_EVENTID        = 0x1903,
-
-
-    WMI_SET_CHANNEL_EVENTID       	= 0x9000,
-    WMI_ASSOC_REQ_EVENTID      		= 0x9001,
-    WMI_EAPOL_RX_EVENTID     		= 0x9002,
-    WMI_MAC_ADDR_RESP_EVENTID     	= 0x9003,
-	WMI_FW_VER_EVENTID      	= 0x9004,
-} ;
-
-
-
-/*******************************************************************************************************************
- *                                              Events data structures
- *******************************************************************************************************************/
-
-/*
- * WMI_RF_MGMT_STATUS_EVENTID
- */
-enum wmi_rf_status_e {
-    WMI_RF_ENABLED        	= 0x0,
-	WMI_RF_DISABLED_HW      = 0x1,
-	WMI_RF_DISABLED_SW      = 0x2,
-	WMI_RF_DISABLED_HW_SW	= 0x3
-};
-
- typedef PREPACK struct  {
-	U32	rf_status;
-} POSTPACK WMI_RF_MGMT_STATUS_EVENT;
-
-/*
- * WMI_GET_STATUS_DONE_EVENTID
- */
- typedef PREPACK struct  {
-    U32	is_associated;
-    U32	cid;
-    U16 bssid[3];
-    U16	channel;
-    U32	network_type;
-    U32	ssid_len;
-    U08	ssid[WMI_MAX_SSID_LEN];
-	U32	rf_status;
-	U32 is_secured;
-} POSTPACK WMI_GET_STATUS_DONE_EVENT;
-
-
-
-/**
- * WMI_FW_VER_EVENTID
- */
- typedef PREPACK struct  {
-    U08 major;
-    U08 minor;
-    U16 subminor;
-    U16 build;
-} POSTPACK WMI_FW_VER_EVENT;
-
-
-
-/*
-* WMI_MAC_ADDR_RESP_EVENTID
-*/
- typedef PREPACK struct  {
-	U08 mac_addr[WMI_MAC_LEN];
-    U08 auth_mode;
-    U08 crypt_mode;
-    U32 offload_mode; // 0/1
-} POSTPACK WMI_MAC_ADDR_RESP_EVENT;
-
-
-/*
-* WMI_EAPOL_RX_EVENTID
-*/
- typedef PREPACK struct  {
-	U08 src_mac[WMI_MAC_LEN];
-	U16 eapol_len;
-	U08 eapol[EMPTY_ARRAY_SIZE];
-} POSTPACK WMI_EAPOL_RX_EVENT;
-
-
-/*
-* WMI_READY_EVENTID
-*/
- typedef PREPACK struct  {
-    U32	sw_version;
-    U32	abi_version;
-    U08	macaddr[WMI_MAC_LEN];
-    U08	phyCapability;              /* wmi_phy_capability_e */
-    U08 reserved;
-    U32 extend_mem_addr;
-    U32 extend_mem_size;
-} POSTPACK WMI_READY_EVENT;
-
-
-/*
- * WMI_NOTIFY_REQ_DONE_EVENTID
- */
- typedef PREPACK struct  {
-	U32 status;
-	U32 tsf_low;
-	U32 tsf_high;
-	U32 snr_val;
-	U32 tx_tpt;
-	U32 tx_goodput;
-	U32 rx_goodput;
-	U16 bf_mcs;
-	U16 my_rx_sector;
-	U16 my_tx_sector;
-	U16 other_rx_sector;
-	U16 other_tx_sector;
-	U16 range;
-} POSTPACK WMI_NOTIFY_REQ_DONE_EVENT;
-
-/*
- * WMI_CONNECT_EVENTID
- */
- typedef PREPACK struct  {
-    U16	channel;
-    U08	bssid[WMI_MAC_LEN];
-    U16	listenInterval;
-    U16	beaconInterval;
-    U32	networkType;
-    U08	beaconIeLen;
-    U08	assocReqLen;
-    U08	assocRespLen;
-    U08	cid;
-    U08	reserved0;
-    U16	reserved1;
-    U08	assocInfo[EMPTY_ARRAY_SIZE];
-} POSTPACK WMI_CONNECT_EVENT;
-
-
-
-/*
- * WMI_DISCONNECT_EVENTID
- */
-enum wmi_disconnect_reason_e {
-    NO_NETWORK_AVAIL        = 0x01,
-    LOST_LINK               = 0x02,     /* bmiss */
-    DISCONNECT_CMD          = 0x03,
-    BSS_DISCONNECTED        = 0x04,
-    AUTH_FAILED             = 0x05,
-    ASSOC_FAILED            = 0x06,
-    NO_RESOURCES_AVAIL      = 0x07,
-    CSERV_DISCONNECT        = 0x08,
-    INVALID_PROFILE         = 0x0a,
-    DOT11H_CHANNEL_SWITCH   = 0x0b,
-    PROFILE_MISMATCH        = 0x0c,
-    CONNECTION_EVICTED      = 0x0d,
-    IBSS_MERGE              = 0xe
-};
-
- typedef PREPACK struct  {
-    U16	protocolReasonStatus;  /* reason code, see 802.11 spec. */
-    U08	bssid[WMI_MAC_LEN];    /* set if known */
-    U08	disconnectReason ;      /* see wmi_disconnect_reason_e */
-    U08	assocRespLen;
-    U08	assocInfo[EMPTY_ARRAY_SIZE];
-} POSTPACK WMI_DISCONNECT_EVENT;
-
-
-/*
- * WMI_SCAN_COMPLETE_EVENTID
- */
- typedef PREPACK struct  {
-    U32 status;
-} POSTPACK WMI_SCAN_COMPLETE_EVENT;
-
-/*
- * WMI_BA_STATUS_EVENTID
- */
-enum wmi_vring_ba_status_e {
-	AGREED = 0x0,
-	NON_AGREED = 0x1,
-} ;
-
- typedef PREPACK struct  {
-    U16	status;
-    U16	reserved0;
-    U08	ringid;
-    U08	agg_wsize;
-    U16	ba_timeout;
-} POSTPACK WMI_VRING_BA_STATUS_EVENT;
-
-
-/*
- * WMI_DELBA_EVENTID
- */
- typedef PREPACK struct  {
-
-	#define CIDXTID_CID_POS 0
-	#define CIDXTID_CID_LEN 4
-	#define CIDXTID_CID_MSK 0xF
-	#define CIDXTID_TID_POS 4
-	#define CIDXTID_TID_LEN 4
-	#define CIDXTID_TID_MSK 0xF0
-	U08 cidxtid_byte;
-
-    U08	from_initiator;
-    U16	reason;
-} POSTPACK WMI_DELBA_EVENT;
-
-/*
- * WMI_VRING_CFG_DONE_EVENTID
- */
-enum wmi_vring_cfg_status {
-	VRING_CFG_SUCCESS = 0x0,
-	VRING_CFG_FAILURE = 0x1
-};
-
- typedef PREPACK struct  {
-    U08	ringid;
-    U08	status;
-    U16	reserved;
-    U32	tx_vring_tail_ptr;
-} POSTPACK WMI_VRING_CFG_DONE_EVENT;
-
-
-/*
- * WMI_ADDBA_RESP_SENT_EVENTID
- */
-enum wmi_rcp_addba_resp_sent_event_status_e {
-	SUCCESS = 0x0,
-	FAIL = 0x1
-};
-
- typedef PREPACK struct  {
-
-	#define CIDXTID_CID_POS 0
-	#define CIDXTID_CID_LEN 4
-	#define CIDXTID_CID_MSK 0xF
-	#define CIDXTID_TID_POS 4
-	#define CIDXTID_TID_LEN 4
-	#define CIDXTID_TID_MSK 0xF0
-	U08 cidxtid_byte;
-
-    U08	rsvd;
-    U16	status;
-} POSTPACK WMI_RCP_ADDBA_RESP_SENT_EVENT;
-
-/*
- * WMI_RCP_ADDBA_REQ_EVENTID
- */
- typedef PREPACK struct  {
-
-	#define CIDXTID_CID_POS 0
-	#define CIDXTID_CID_LEN 4
-	#define CIDXTID_CID_MSK 0xF
-	#define CIDXTID_TID_POS 4
-	#define CIDXTID_TID_LEN 4
-	#define CIDXTID_TID_MSK 0xF0
-	U08 cidxtid_byte;
-
-    U08	dialog_token;
-    U16	ba_param_set;                   /* ieee80211_ba_parameterset field as it received */
-    U16	ba_timeout;
-    U16	ba_seq_ctrl;                    /* ieee80211_ba_seqstrl field as it received */
-} POSTPACK WMI_RCP_ADDBA_REQ_EVENT;
-
-/*
- * WMI_CFG_RX_CHAIN_DONE_EVENTID
- */
-enum wmi_cfg_rx_chain_done_event_status_e {
-	CFG_RX_CHAIN_SUCCESS = 0x1,
-};
-
- typedef PREPACK struct  {
-    U32	rx_ring_tail_ptr;               /* Rx V-Ring Tail pointer */
-    U32	status;
-} POSTPACK WMI_CFG_RX_CHAIN_DONE_EVENT;
-
-
-/*
- * WMI_WBE_LINKDOWN_EVENTID
- */
-enum wmi_wbe_link_down_event_reason_e {
-	USER_REQUEST = 0x0,
-	RX_DISASSOC = 0x1,
-	BAD_PHY_LINK = 0x2,
-};
-
- typedef PREPACK struct  {
-    U08	cid;
-    U08	reserved[3];
-    U32	reason;
-} POSTPACK WMI_WBE_LINK_DOWN_EVENT;
-
-/*
- * WMI_DATA_PORT_OPEN_EVENTID
- */
- typedef PREPACK struct  {
-    U08	cid;
-    U08	reserved0[3];
-} POSTPACK WMI_DATA_PORT_OPEN_EVENT;
-
-
-/*
- * WMI_GET_PCP_CHANNEL_EVENTID
- */
- typedef PREPACK struct  {
-    U08	channel_index;
-    U08	reserved[3];
-} POSTPACK WMI_GET_PCP_CHANNEL_EVENT;
-
-/*
- * WMI_SW_TX_COMPLETE_EVENTID
- */
-enum wmi_sw_tx_status_e {
-	TX_SW_STATUS_SUCCESS				= 0x0,
-	TX_SW_STATUS_FAILED_NO_RESOURCES	= 0x1,
-	TX_SW_STATUS_FAILED_TX				= 0x2
-};
-
-typedef PREPACK struct  {
-   U08	status;
-   U08	reserved[3];
-} POSTPACK WMI_SW_TX_COMPLETE_EVENT;
-
-/*
- * WMI_GET_SSID_EVENTID
- */
- typedef PREPACK struct  {
-    U32	ssid_len;
-    U08	ssid[WMI_MAX_SSID_LEN];
-} POSTPACK WMI_GET_SSID_EVENT;
-
-/*
- * WMI_RX_MGMT_PACKET_EVENTID
- */
- typedef PREPACK struct  {
-    U08	mcs;
-	S08 snr;
-	U16 range;
-    U16	stype;
-    U16	status;
-    U32	length;
-    U08	qid;                            /* Not resolved when == 0xFFFFFFFF  ==> Broadcast to all MIDS */
-    U08	mid;                            /* Not resolved when == 0xFFFFFFFF  ==> Broadcast to all MIDS */
-    U08	cid;
-    U08	channel;                        /* From Radio MNGR */
-} POSTPACK wmi_rx_mgmt_info_s;
-
-
-typedef PREPACK struct  {
-    wmi_rx_mgmt_info_s	info;
-    U32	payload;//[EMPTY_ARRAY_SIZE];
-} POSTPACK WMI_RX_MGMT_PACKET_EVENT;
-
-/*
- * WMI_ECHO_RSP_EVENTID
- */
-typedef PREPACK struct {
-    U32	echoed_value;
-} POSTPACK WMI_ECHO_EVENT;
-
-
-#if defined(_MSC_VER)           // Microsoft
-#pragma pack (pop, marlon_wmi)  /* restore original alignment from stack */
-#endif
-
-
-#endif /* MARLON_WMI_H_ */
diff --git a/debug-tools/lib/utils/Android.mk b/debug-tools/lib/utils/Android.mk
deleted file mode 100644
index 87b5650..0000000
--- a/debug-tools/lib/utils/Android.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libwigig_utils
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CPPFLAGS := -Wall -lpthread
-
-LOCAL_C_INCLUDES += \
-	$(LOCAL_PATH) \
-	$(LOCAL_PATH)/../inc \
-	$(LOCAL_PATH)/../inc/linux \
-	$(LOCAL_PATH)/linux
-
-LOCAL_SRC_FILES := $(shell find $(LOCAL_PATH) -name '*.cpp' | sed s:^$(LOCAL_PATH)::g )
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/debug-tools/lib/utils/DebugLogger.cpp b/debug-tools/lib/utils/DebugLogger.cpp
deleted file mode 100644
index 003be67..0000000
--- a/debug-tools/lib/utils/DebugLogger.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "wlct_os.h"
-#include "DebugLogger.h"
-#include "LoggerSupport.h"
-#include "Thread.h"
-
-#ifdef _WINDOWS
-#define TRACING_REGISTRY_PATH _T("Software\\QualcommAtheros\\WIGIG\\Tracing")
-#endif
-
-using namespace std;
-
-CDebugLogger g_Logger(_T("WLCT"));
-
-CDebugLogger *g_pLogger = &g_Logger;
-
-static const int WLCT_MAX_DEBUG_MSG_LEN = 512;
-
-const TCHAR *g_szMessageType[] =
-{
-   _T("ERROR"),
-   _T("WARN"),
-   _T("INFO"),
-   _T("DEBUG"),
-   _T("TRACE"),
-   _T("VERBOSE")
-};
-
-#ifdef _WINDOWS
-void ReadSettingsThread(void *pLogger)
-{
-	LOG_MESSAGE_DEBUG(_T("start running"));
-	CDebugLogger *pDebugLogger = (CDebugLogger*)pLogger;
-	pDebugLogger->m_bExit = false;
-
-	CRegKey regCofig;
-	if ( ERROR_SUCCESS == regCofig.Open(HKEY_LOCAL_MACHINE, TRACING_REGISTRY_PATH, KEY_READ))
-	{
-		// key found, reset settings
-//		pDebugLogger->SetDefaultSettings();
-
-		DWORD dwTraceLevel;
-		if ( ERROR_SUCCESS == regCofig.QueryDWORDValue( _T("TraceLevel"), dwTraceLevel ) )
-		{
-			pDebugLogger->m_eTraceLevel = (COsDebugLogger::E_LOG_LEVEL)dwTraceLevel;
-		}
-
-		DWORD dwLogToFile;
-		if ( ERROR_SUCCESS == regCofig.QueryDWORDValue( _T("LogToFile"), dwLogToFile ) )
-		{
-			TCHAR szPath[MAX_PATH] = { 0 };
-			ULONG ulChars = MAX_PATH;
-			if ( ERROR_SUCCESS == regCofig.QueryStringValue( _T("LogFilePath"), szPath, &ulChars ) )
-			{
-				pDebugLogger->m_sLogFilePath = szPath;
-				//m_bLogToFile   = TRUE;
-			}
-		}
-	}
-
-	// Create an event.
-	pDebugLogger->hNotifyEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-	if (pDebugLogger->hNotifyEvent == NULL)
-	{
-		_tprintf(TEXT("Error in CreateEvent (%d).\n"), GetLastError());
-		return;
-	}
-
-	LONG lErrorCode = 0;// regCofig.NotifyChangeKeyValue(FALSE, REG_NOTIFY_CHANGE_LAST_SET, pDebugLogger->hNotifyEvent, TRUE);
-	if (lErrorCode != ERROR_SUCCESS)
-	{
-		//_tprintf(TEXT("Error in RegNotifyChangeKeyValue (%d).\n"), lErrorCode);
-		return;
-	}
-
-	do
-	{
-		if (WaitForSingleObject(pDebugLogger->hNotifyEvent, INFINITE) == WAIT_FAILED)
-		{
-			_tprintf(TEXT("Error in WaitForSingleObject (%d).\n"), GetLastError());
-		}
-
-		DWORD dwTraceLevel;
-		if ( ERROR_SUCCESS == regCofig.QueryDWORDValue( _T("TraceLevel"), dwTraceLevel ) )
-		{
-			pDebugLogger->m_eTraceLevel = (COsDebugLogger::E_LOG_LEVEL)dwTraceLevel;
-		}
-
-	} while (!pDebugLogger->m_bExit);
-
-	CloseHandle(pDebugLogger->hNotifyEvent);
-	regCofig.Close();
-}
-#endif
-
-CDebugLogger::CDebugLogger(const TCHAR *tag, bool logToConsole) :
-  COsDebugLogger(logToConsole)
-{
-	m_sTag = tag;
-	SetDefaultSettings();
-
-// 	ReadTraceSettings( TRACING_REGISTRY_PATH );
-//
-// 	// override settings
-// 	CString sRegKeyPath;
-// 	sRegKeyPath.Format(_T("%s\\%s"), TRACING_REGISTRY_PATH, lpszTag );
-//
-// 	ReadTraceSettings(lpszTag);
-
-	// start the read tread
-#ifdef _WINDOWS
-	m_hThread = (HANDLE)_beginthread(ReadSettingsThread, 0, this);
-#endif
-}
-
-CDebugLogger::~CDebugLogger(void)
-{
-#ifdef _WINDOWS
-	m_bExit = true;
-	SetEvent(hNotifyEvent);
-	if (WaitForSingleObject(m_hThread, 1000) == WAIT_TIMEOUT)
-	{
-		TerminateThread(m_hThread, 1);
-	}
-#endif
-}
-
-void CDebugLogger::SetDefaultSettings(void)
-{
-	m_bLogToFile   = false;
-	m_eTraceLevel = E_LOG_LEVEL_DEBUG;
-	m_sLogFilePath = _T("");
-}
-
-#ifdef _WINDOWS
-void CDebugLogger::ReadTraceSettings( LPCTSTR lpszRegistryPath )
-{
-	CRegKey regCofig;
-	if ( ERROR_SUCCESS == regCofig.Open(HKEY_LOCAL_MACHINE,	lpszRegistryPath, KEY_READ))
-	{
-		// key found, reset settings
-		SetDefaultSettings();
-
-		DWORD dwTraceLevel;
-		if ( ERROR_SUCCESS == regCofig.QueryDWORDValue( _T("TraceLevel"), dwTraceLevel ) )
-		{
-			m_eTraceLevel = (COsDebugLogger::E_LOG_LEVEL)dwTraceLevel;
-		}
-
-		DWORD dwLogToFile;
-		if ( ERROR_SUCCESS == regCofig.QueryDWORDValue( _T("LogToFile"), dwLogToFile ) )
-		{
-			TCHAR szPath[MAX_PATH] = { 0 };
-			ULONG ulChars = MAX_PATH;
-			if ( ERROR_SUCCESS == regCofig.QueryStringValue( _T("LogFilePath"), szPath, &ulChars ) )
-			{
-				m_sLogFilePath = szPath;
-//				m_bLogToFile   = TRUE;
-			}
-		}
-	}
-}
-#endif
-
-void CDebugLogger::LogGlobalDebugMessage(CDebugLogger::E_LOG_LEVEL eTraceLevel,
-  S_LOG_CONTEXT *pCtxt, const TCHAR *fmt, ...)
-{
-  if (!g_pLogger)
-  {
-    return;
-  }
-
-  va_list args;
-  va_start(args, fmt);
-  g_pLogger->LogDebugMessageV(eTraceLevel, pCtxt, fmt, args);
-  va_end(args);
-}
-
-DWORD CDebugLogger::GetGlobalTraceLevel()
-{
-	if (!g_pLogger)
-	{
-		return 0;
-	}
-
-	return g_pLogger->GetGlobalTraceLevel();
-}
-
-void CDebugLogger::LogDebugMessage( CDebugLogger::E_LOG_LEVEL eTraceLevel,
-  S_LOG_CONTEXT *pCtxt, const TCHAR *fmt, ...)
-{
-  va_list args;
-
-  if (eTraceLevel > m_eTraceLevel)
-  {
-    return;
-  }
-
-  va_start(args, fmt);
-  LogDebugMessageV(eTraceLevel, pCtxt, fmt, args);
-  va_end(args);
-}
-
-void CDebugLogger::LogDebugMessageV( CDebugLogger::E_LOG_LEVEL eTraceLevel,
-  S_LOG_CONTEXT *pCtxt, const TCHAR *fmt, va_list args)
-{
-  TCHAR msg[WLCT_MAX_DEBUG_MSG_LEN] = {0};
-  int bytes_written = 0;
-
-	if (eTraceLevel > m_eTraceLevel)
-	{
-		return;
-	}
-
-  bytes_written = _stprintf_s(msg, WLCT_MAX_DEBUG_MSG_LEN,
-	_T("%s(%d): %s: [%s]; pid:%d; tid:%d; err=%d; f=[%s]; "),
-     (pCtxt ? pCtxt->funcName : _T("unknown")),
-    (pCtxt ? pCtxt->line : 0), m_sTag.c_str(), g_szMessageType[eTraceLevel],
-    CWlctThread::getCurrentProcessID(), CWlctThread::getCurrentThreadID(),
-    WlctGetLastError(), (pCtxt ? pCtxt->funcName : _T("unknown")));
-
-  bytes_written += _vsntprintf(msg + bytes_written,
-    WLCT_MAX_DEBUG_MSG_LEN - bytes_written, fmt, args);
-
-  _stprintf_s(msg + bytes_written, WLCT_MAX_DEBUG_MSG_LEN - bytes_written, _T("\n"));
-
-  print(msg);
-
-
-  if (m_bLogToFile)
-  {
-    FILE *fp = 0;
-    fp = _tfopen(m_sLogFilePath.c_str(), _T("a"));
-    if (NULL != fp)
-    {
-      fprintf(fp, "%s", msg);
-      fclose(fp);
-    }
-  }
-}
-
diff --git a/debug-tools/lib/utils/DebugLogger.h b/debug-tools/lib/utils/DebugLogger.h
deleted file mode 100644
index efcff11..0000000
--- a/debug-tools/lib/utils/DebugLogger.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "OsDebugLogger.h"
-
-class WLCT_API CDebugLogger : public COsDebugLogger
-{
-public:
-	struct WLCT_API S_LOG_CONTEXT
-	{
-		const TCHAR *funcName;
-		const TCHAR *fileName;
-		DWORD       line;
-	};
-
-	CDebugLogger(const TCHAR *tag, bool logToConsole = false);
-	~CDebugLogger(void);
-	COsDebugLogger::E_LOG_LEVEL GetTraceLevel() const
-	{
-		return m_eTraceLevel;
-	}
-
-	void LogDebugMessage(COsDebugLogger::E_LOG_LEVEL eTraceLevel,
-	S_LOG_CONTEXT *pCtxt, const TCHAR *tmt, ...);
-	void LogDebugMessageV(COsDebugLogger::E_LOG_LEVEL eTraceLevel,
-	S_LOG_CONTEXT *pCtxt, const TCHAR *fmt, va_list args);
-
-	static DWORD GetGlobalTraceLevel(void);
-	static void LogGlobalDebugMessage(COsDebugLogger::E_LOG_LEVEL eTraceLevel,
-	S_LOG_CONTEXT *pCtxt, const TCHAR *fmt, ...);
-
-private:
-	void ReadTraceSettings(const TCHAR *fileName);
-	void SetDefaultSettings();
-
-private:
-#ifdef _WINDOWS
-#pragma warning( disable : 4251 ) //suppress warning - it is OK on private members
-#endif
-	tstring m_sTag;
-	bool    m_bLogToFile;
-#ifdef _WINDOWS
-#pragma warning( disable : 4251 ) //suppress warning - it is OK on private members
-#endif
-	tstring m_sLogFilePath;
-#ifdef _WINDOWS
-	HANDLE	m_hThread;
-	bool	m_bExit;
-	HANDLE	hNotifyEvent;
-
-	friend void ReadSettingsThread(void *pLogger);
-#endif
-};
-
-extern CDebugLogger *g_pLogger;
diff --git a/debug-tools/lib/utils/LoggerSupport.h b/debug-tools/lib/utils/LoggerSupport.h
deleted file mode 100644
index f85e386..0000000
--- a/debug-tools/lib/utils/LoggerSupport.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "DebugLogger.h"
-
-#define LOG_MESSAGE( level, format, ...) \
-	{\
-		CDebugLogger::S_LOG_CONTEXT _logContext = { _T(__FUNCTION__), _T(__FILE__), __LINE__ }; \
-		CDebugLogger::LogGlobalDebugMessage( level, &_logContext, format,##__VA_ARGS__ );\
-	}
-
-#define LOG_MESSAGE_ERROR( format,...)	LOG_MESSAGE(COsDebugLogger::E_LOG_LEVEL_ERROR, format,##__VA_ARGS__ )
-#define LOG_MESSAGE_WARN( format,...)	LOG_MESSAGE(COsDebugLogger::E_LOG_LEVEL_WARN, format,##__VA_ARGS__ )
-#define LOG_MESSAGE_INFO( format,...)	LOG_MESSAGE(COsDebugLogger::E_LOG_LEVEL_INFO, format,##__VA_ARGS__ )
-#define LOG_MESSAGE_DEBUG( format,...)	LOG_MESSAGE(COsDebugLogger::E_LOG_LEVEL_DEBUG, format,##__VA_ARGS__ )
-#define LOG_MESSAGE_TRACE( format,...)	LOG_MESSAGE(COsDebugLogger::E_LOG_LEVEL_TRACE, format,##__VA_ARGS__ )
-#define LOG_MESSAGE_VERBOSE( format,...)	LOG_MESSAGE(COsDebugLogger::E_LOG_LEVEL_VERBOSE, format,##__VA_ARGS__ )
-#define LOG_STACK_ENTER LOG_MESSAGE(COsDebugLogger::E_LOG_LEVEL_VERBOSE, _T("Enter."))
-#define LOG_STACK_LEAVE LOG_MESSAGE(COsDebugLogger::E_LOG_LEVEL_VERBOSE, _T("Leave."))
diff --git a/debug-tools/lib/utils/Makefile b/debug-tools/lib/utils/Makefile
deleted file mode 100644
index b648bfc..0000000
--- a/debug-tools/lib/utils/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
--include $(TOPDIR)/rules.mk
-
-CFLAGS := -fPIC -Wall -g -MMD
-LDFLAGS := -shared -fPIC
-
-LIB := libwigig_utils.so
-
-.DEFAULT_GOAL = all
-
-
-ifneq ($(CONFIG_TARGET_ipq)$(CONFIG_TARGET_ipq806x),)
-is_ipq806x = 1
-endif
-
-ifeq ($(is_ipq806x), 1)
-ifneq ($(strip $(TOOLPREFIX)),)
-CROSS:=$(TOOLPREFIX)
-endif
-endif
-
-CC = $(CROSS)gcc
-CXX = $(CROSS)g++
-
-INCLUDES = -I . \
-	   -I ../inc/linux \
-           -I ../inc \
-           -I ./linux \
-
-
-all: $(LIB)
-
-
-CPP_FILES := $(shell find . -type f -name '*.cpp')
-C_FILES := $(shell find . -type f -name '*.c')
-
-OBJ_FILES :=  $(CPP_FILES:.cpp=.o)
-OBJ_FILES +=  $(C_FILES:.c=.o)
-
-$(LIB): $(OBJ_FILES)
-	$(CXX) $(LDFLAGS) -o $(LIB) $(OBJ_FILES)
-
-%.o : %.cpp
-	$(CXX) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-%.o : %.c
-	$(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-
-
-
-clean:
-	rm -rf $(LIB)
-	find . -type f \( -name "*.d" -o -name "*.o" \) -delete
-
-
--include $(OBJ_FILES:%.o=%.d)
diff --git a/debug-tools/lib/utils/OsDebugLogger.h b/debug-tools/lib/utils/OsDebugLogger.h
deleted file mode 100644
index 4377f82..0000000
--- a/debug-tools/lib/utils/OsDebugLogger.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "wlct_os.h"
-
-#if defined WLCTPCIACSS_EXPORTS && defined _WINDOWS
-#define WLCT_API __declspec(dllexport)
-#else
-#define WLCT_API
-#endif
-
-class WLCT_API COsDebugLogger {
-  public:
-    enum E_LOG_LEVEL
-    {
-      E_LOG_LEVEL_ERROR,
-      E_LOG_LEVEL_WARN,
-      E_LOG_LEVEL_INFO,
-      E_LOG_LEVEL_DEBUG,
-      E_LOG_LEVEL_TRACE,
-      E_LOG_LEVEL_VERBOSE
-    };
-
-  protected:
-    COsDebugLogger(bool logToConsole);
-    ~COsDebugLogger();
-    void print(const TCHAR *msg);
-
-  protected:
-    E_LOG_LEVEL m_eTraceLevel;
-    bool m_bLogToConsole;
-};
-
diff --git a/debug-tools/lib/utils/StlChar.h b/debug-tools/lib/utils/StlChar.h
deleted file mode 100644
index 4ae7bf6..0000000
--- a/debug-tools/lib/utils/StlChar.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <string>
-#include <map>
-#include <vector>
-#include <sstream>
-
-#define WSTR_ARG(s) ToWString(s).c_str()
-#define TSTR_ARG(s) ToTString(s).c_str()
-
-#if defined(UNICODE) || defined(_UNICODE)
-typedef std::wstring         tstring;
-typedef std::wstringstream   tstringstream;
-typedef std::wostringstream  tostringstream;
-#else
-typedef std::string          tstring;
-typedef std::stringstream    tstringstream;
-typedef std::ostringstream   tostringstream;
-#endif
-
-typedef std::map<tstring, tstring> TStringMap;
-typedef std::vector<std::string> TStringList;
-
-inline std::wstring ToWString(const char *str)
-{
-  std::wostringstream s;
-  s << str;
-  return s.str();
-}
-
-inline std::wstring ToWString(const wchar_t *str)
-{
-  return str;
-}
-
-inline tstring ToTString(const char *str)
-{
-  tostringstream s;
-  s << str;
-  return s.str();
-}
-
-// printf format specifiers
-//
-//| Format Specifier | Win printf | Win wprintf | Lin printf | Lin wprintf |
-//|------------------|------------| ----------- | ---------- | ----------- |
-//|      %s          | char*      | wchar_t*    | char*      | char*       |
-//|      %ls         | wchar_t*   | wchar_t*    | wchar_t*   | wchar_t*    |
-//|      %hs         | char*      | char*       |       NOT SUPPORTED      |
-//|      $S          | wchar_t*   | char*       | wchar_t*   | wchar_t*    |
-//|------------------|------------| ----------- | ---------- | ----------- |
diff --git a/debug-tools/lib/utils/ThreadXFace.h b/debug-tools/lib/utils/ThreadXFace.h
deleted file mode 100644
index 8d119f2..0000000
--- a/debug-tools/lib/utils/ThreadXFace.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "wlct_os.h"
-
-typedef void (*IWlctThreadThreadProc)(void *p);
-
-class IWlctThread
-{
-public:
-  IWlctThread(IWlctThreadThreadProc tProc, void *tCtx)
-    : threadProc(tProc), threadCtx(tCtx) {}
-  virtual ~IWlctThread() {}
-
-  bool ShouldStop()
-  {
-    return shouldStop;
-  }
-
-  virtual wlct_os_err_t Start()     = 0;
-  virtual void          Stop()      = 0;
-
-protected:
-  IWlctThreadThreadProc threadProc;
-  void                 *threadCtx;
-  volatile bool         shouldStop;
-};
diff --git a/debug-tools/lib/utils/linux/OsDebugLogger.cpp b/debug-tools/lib/utils/linux/OsDebugLogger.cpp
deleted file mode 100644
index 916f2bf..0000000
--- a/debug-tools/lib/utils/linux/OsDebugLogger.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "OsDebugLogger.h"
-#include <syslog.h>
-
-COsDebugLogger::COsDebugLogger(bool logToConsole) : m_bLogToConsole(logToConsole)
-{
-  openlog("WLCT", m_bLogToConsole ? LOG_PERROR : 0, LOG_USER);
-}
-
-COsDebugLogger::~COsDebugLogger()
-{
-  closelog();
-}
-
-void COsDebugLogger::print(const char *msg)
-{
-  syslog(LOG_USER, "%s", msg);
-}
-
diff --git a/debug-tools/lib/utils/linux/Thread.cpp b/debug-tools/lib/utils/linux/Thread.cpp
deleted file mode 100644
index 3bdfc4e..0000000
--- a/debug-tools/lib/utils/linux/Thread.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "Thread.h"
-#include "wlct_os.h"
-
-
-void *CWlctThread::GlobalThreadMain(void *p)
-{
-  CWlctThread *threadObj = (CWlctThread *)p;
-
-  threadObj->ThreadMain();
-
-  pthread_exit(&threadObj->threadResult);
-}
-
-void CWlctThread::ThreadMain(void)
-{
-  threadProc(threadCtx);
-}
-
-CWlctThread::CWlctThread(IWlctThreadThreadProc tProc, void *tCtx)
-  : IWlctThread(tProc, tCtx),
-    threadResult(0)
-{
-  memset(&threadObj, 0, sizeof(threadObj));
-}
-
-CWlctThread::~CWlctThread()
-{
-  Stop();
-}
-
-wlct_os_err_t CWlctThread::Start()
-{
-  shouldStop = false;
-
-  pthread_attr_t attr;
-
-  pthread_attr_init(&attr);
-  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
-
-  threadResult = pthread_create(&threadObj,
-                                &attr,
-                                GlobalThreadMain,
-                                this);
-
-  pthread_attr_destroy(&attr);
-
-  return threadResult;
-}
-
-void CWlctThread::Stop()
-{
-  void *tres = NULL;
-  shouldStop = true;
-  /* Wait for the notification thread to process the signal */
-  pthread_join(threadObj, &tres);
-}
-
-uint32_t CWlctThread::getCurrentThreadID()
-{
-  return (uint32_t)pthread_self();
-}
-
-uint32_t CWlctThread::getCurrentProcessID()
-{
-  return (uint32_t)getpid();
-}
-
diff --git a/debug-tools/lib/utils/linux/Thread.h b/debug-tools/lib/utils/linux/Thread.h
deleted file mode 100644
index 438816e..0000000
--- a/debug-tools/lib/utils/linux/Thread.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "ThreadXFace.h"
-#include <pthread.h>
-
-class CWlctThread : public IWlctThread
-{
-public:
-  CWlctThread(IWlctThreadThreadProc tProc, void *tCtx);
-  virtual ~CWlctThread();
-
-  virtual wlct_os_err_t Start();
-  virtual void          Stop();
-
-  static uint32_t getCurrentThreadID();
-  static uint32_t getCurrentProcessID();
-
-protected:
-  static void *GlobalThreadMain(void *p);
-  void         ThreadMain();
-
-  pthread_t    threadObj;
-  int          threadResult;
-};
diff --git a/debug-tools/lib/utils/linux/WlctCDevFile.cpp b/debug-tools/lib/utils/linux/WlctCDevFile.cpp
deleted file mode 100644
index 4078148..0000000
--- a/debug-tools/lib/utils/linux/WlctCDevFile.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "wlct_os.h"
-#include "WlctCDevFile.h"
-#include "LoggerSupport.h"
-
-extern "C" {
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <unistd.h>
-};
-
-const int CWlctCDevFile::INVALID_FD = -1;
-
-CWlctCDevFile::CWlctCDevFile(): fd(INVALID_FD)
-{
-}
-
-CWlctCDevFile::~CWlctCDevFile()
-{
-  Close();
-}
-
-wlct_os_err_t CWlctCDevFile::Open(const char *fName, const char* interfaceName)
-{
-  //do something with params
-  (void)interfaceName;
-  wlct_os_err_t res = WLCT_OS_ERROR_GEN_FAILURE;
-
-  WLCT_ASSERT(IsOpened() == false);
-  WLCT_ASSERT(fName != NULL);
-
-  devFileName = fName;
-
-  LOG_MESSAGE_DEBUG("Char device file %s opening...", devFileName.c_str());
-
-  fd = open(devFileName.c_str(), 0);
-  if (INVALID_FD == fd)
-  {
-    res = errno;
-    LOG_MESSAGE_ERROR("Failed to open file %s (%d)", devFileName.c_str(), res);
-    goto Exit;
-  }
-
-  LOG_MESSAGE_DEBUG("Char device file opened: fd=%d", fd);
-
-  res = WLCT_OS_ERROR_SUCCESS;
-
-Exit:
-  if (res != WLCT_OS_ERROR_SUCCESS)
-  {
-    Close();
-  }
-
-  return res;
-}
-
-void CWlctCDevFile::Close()
-{
-  if (fd != INVALID_FD)
-  {
-    close(fd);
-    fd = INVALID_FD;
-  }
-
-  devFileName.erase();
-}
-
-wlct_os_err_t CWlctCDevFile::Ioctl(void *dataBuf,
-                                   DWORD dataBufLen,
-                                   DWORD ioctlFlags)
-{
-  wlct_os_err_t res = WLCT_OS_ERROR_GEN_FAILURE;
-  wlct_cdev_ioctl_hdr_t *ioctl_hdr = NULL;
-
-  WLCT_ASSERT(IsOpened() == true);
-  WLCT_ASSERT(dataBuf != NULL);
-  WLCT_ASSERT(dataBufLen != 0);
-
-  ioctl_hdr = (wlct_cdev_ioctl_hdr_t *)malloc((sizeof *ioctl_hdr) + dataBufLen);
-  if (NULL == ioctl_hdr)
-  {
-    LOG_MESSAGE_ERROR("Allocation failed (data of %u bytes)\n", dataBufLen);
-    res = WLCT_OS_ERROR_NOT_ENOUGH_MEMORY;
-    goto Exit;
-  }
-
-  ioctl_hdr->magic = WLCT_IOCTL_MAGIC;
-  ioctl_hdr->len = dataBufLen;
-  ioctl_hdr->flags = ioctlFlags;
-
-  if (ioctlFlags & WLCT_IOCTL_FLAG_SET)
-    memcpy(ioctl_hdr + 1, dataBuf, dataBufLen);
-
-  res = ioctl(fd, 0, ioctl_hdr);
-  if (0 != res)
-  {
-    res = errno;
-    LOG_MESSAGE_ERROR("ioctl failed with error code %d", res);
-    goto Exit;
-  }
-
-  if (ioctlFlags & WLCT_IOCTL_FLAG_GET)
-    memcpy(dataBuf, ioctl_hdr + 1, dataBufLen);
-
-Exit:
-  if (NULL != ioctl_hdr)
-    free(ioctl_hdr);
-
-  return res;
-}
diff --git a/debug-tools/lib/utils/linux/WlctCDevFile.h b/debug-tools/lib/utils/linux/WlctCDevFile.h
deleted file mode 100644
index f1427f3..0000000
--- a/debug-tools/lib/utils/linux/WlctCDevFile.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "wlct_cdev_shared.h"
-#include "wlct_os.h"
-
-#include <string>
-
-class CWlctCDevFile
-{
-public:
-  CWlctCDevFile();
-  virtual ~CWlctCDevFile();
-
-  virtual wlct_os_err_t Open(const char *fName, const char* interfaceName);
-  virtual void          Close();
-  virtual wlct_os_err_t Ioctl(void *dataBuf, DWORD dataBufLen, DWORD ioctlFlags);
-  virtual wlct_os_err_t DebugFS(char *FileName, void *dataBuf, DWORD dataBufLen, DWORD DebugFSFlags)
-  {
-    //do something with params
-    (void)FileName;
-    (void)dataBuf;
-    (void)dataBufLen;
-    (void)DebugFSFlags;
-
-    return WLCT_OS_ERROR_CALL_NOT_IMPLEMENTED;
-  }
-
-  bool          IsOpened() const
-  {
-    return (fd != INVALID_FD);
-  }
-
-protected:
-
-  int  fd;
-  static const int INVALID_FD;
-
-private:
-
-  std::string devFileName;
-
-};
-
diff --git a/debug-tools/lib/utils/linux/WlctCDevSocket.cpp b/debug-tools/lib/utils/linux/WlctCDevSocket.cpp
deleted file mode 100644
index 5f0b091..0000000
--- a/debug-tools/lib/utils/linux/WlctCDevSocket.cpp
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "WlctCDevSocket.h"
-#include "LoggerSupport.h"
-#include "public.h"
-
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <linux/sockios.h>
-#include <linux/if.h>
-#include <sys/ioctl.h>
-#include <stdint.h>
-#include <iostream>
-#include <fstream>
-#include <string.h>
-
-
-//insted of "ioctl_if.h"
-#define WILOCITY_IOCTL_INDIRECT_READ IOCTL_INDIRECT_READ_OLD
-#define WILOCITY_IOCTL_INDIRECT_WRITE IOCTL_INDIRECT_WRITE_OLD
-#define WILOCITY_IOCTL_INDIRECT_READ_BLOCK IOCTL_INDIRECT_READ_BLOCK
-#define WILOCITY_IOCTL_INDIRECT_WRITE_BLOCK IOCTL_INDIRECT_WRITE_BLOCK
-
-#define EP_OPERATION_READ 0
-#define EP_OPERATION_WRITE 1
-#define WIL_IOCTL_MEMIO (SIOCDEVPRIVATE + 2)
-
-const char* DEBUGFS_ROOT = "/sys/kernel/debug/ieee80211/";
-
-CWlctCDevSocket::CWlctCDevSocket():CWlctCDevFile()
-{
-}
-
-int sendRWIoctl(wil_memio & io,int fd, char* interfaceName, bool activateLogs = true)
-{
-    int ret;
-    struct ifreq ifr;
-    ifr.ifr_data = &io;
-
-    snprintf(ifr.ifr_name, IFNAMSIZ, "%s", interfaceName);
-    ifr.ifr_name[IFNAMSIZ - 1] = 0;
-
-    ret = ioctl(fd, WIL_IOCTL_MEMIO, &ifr);
-    if (ret < 0 && activateLogs)
-    {
-        perror("ioctl");
-    }
-
-    return ret;
-}
-
-// Receives interface name (wigig#, wlan#) and checks if it is responding
-bool setInterfaceName(const char* interfaceName, int fd)
-{
-    if (interfaceName == NULL)
-    {
-        LOG_MESSAGE_ERROR("Invalid interface name (NULL)");
-        return false;
-    }
-
-    wil_memio io;
-    io.addr = 0x880050; //baud rate
-    io.op = EP_OPERATION_READ;
-
-    LOG_MESSAGE_DEBUG("Checking interface name: %s", interfaceName);
-
-    int ret = sendRWIoctl(io, fd, (char*)interfaceName, false);
-    if(ret == 0)
-    {
-        LOG_MESSAGE_DEBUG("Successfuly set interface name: %s", interfaceName);
-	return true;
-    }
-
-
-    return false;
-}
-
-wlct_os_err_t CWlctCDevSocket::Open(const char *fName, const char* ifName)
-{
-    wlct_os_err_t res = WLCT_OS_ERROR_GEN_FAILURE;
-
-    WLCT_ASSERT(IsOpened() == false);
-    WLCT_ASSERT(strlen(fName) < WLCT_CDEV_FILE_MAX_NAME_LEN);
-
-    LOG_MESSAGE_DEBUG("Char device file %s opening...", fName);
-
-    fd = socket(AF_INET, SOCK_DGRAM, 0);
-    if (INVALID_FD == fd || fd < 0)
-    {
-	res = errno;
-	LOG_MESSAGE_ERROR("Failed to open socket to device");
-	Close();
-        return res;
-    }
-
-    LOG_MESSAGE_DEBUG("Trying to open socket to driver, device name: %s", ifName);
-
-    const TCHAR* const delimit = _T("!");
-
-    TCHAR* token;
-    TCHAR *next_token = NULL;
-
-    token = _tcstok_s( (char*)ifName, delimit, &next_token);
-    if (NULL == token)
-    {
-        LOG_MESSAGE_ERROR("No token found in %s", ifName);
-        Close();
-        return -1;
-    }
-
-    LOG_MESSAGE_DEBUG(_T("token: %s"), token);
-
-    // SPARROW
-    token = _tcstok_s( NULL, delimit, &next_token);
-    if (NULL == token)
-    {
-        LOG_MESSAGE_ERROR("No card token found in %s", ifName);
-        Close();
-        return -1;
-    }
-
-    LOG_MESSAGE_DEBUG(_T("token: %s"), token);
-
-    // wlan# or wigig#
-    token = _tcstok_s( NULL, delimit, &next_token);
-    if (NULL == token)
-    {
-        LOG_MESSAGE_ERROR("No interface token found in %s", ifName);
-        Close();
-        return -1;
-    }
-    LOG_MESSAGE_DEBUG(_T("token: %s"), token);
-
-    snprintf(interfaceName, IFNAMSIZ, "%s", token);
-
-    // Validate interface is 11ad interface
-    if(!setInterfaceName(interfaceName, fd))
-    {
-        LOG_MESSAGE_ERROR("Failed to query interface %s", interfaceName);
-        Close();
-        return res;
-    }
-
-    LOG_MESSAGE_DEBUG("Char device socket opened: fd=%d", fd);
-    LOG_MESSAGE_DEBUG("Looking for wil6210 in %s", DEBUGFS_ROOT);
-
-    const char* szCmdPattern = "find /sys/kernel/debug/ieee80211/ -name wil6210";
-    FILE* pIoStream = popen(szCmdPattern, "r");
-    if (!pIoStream)
-    {
-        LOG_MESSAGE_ERROR("Failed to run command to detect DebugFS\n" );
-        Close();
-        return res;
-    }
-
-    bool debugFsFound = false;
-    while (fgets(debugFSPath, WLCT_CDEV_FILE_MAX_NAME_LEN, pIoStream) != NULL)
-    {
-        // The command output contains a newline character that should be removed
-        debugFSPath[strcspn(debugFSPath, "\r\n")] = '\0';
-        LOG_MESSAGE_DEBUG("Found DebugFS Path: %s", debugFSPath);
-        if (debugFsFound)
-        {
-            // TODO - support DebugFS with Multiple interfaces for PMC
-            LOG_MESSAGE_INFO("DebugFS for Multiple WIGIG cards is not currently supported\n");
-            //Close();
-            //return res;
-        }
-        debugFsFound = true;
-    }
-
-    pclose(pIoStream);
-    return WLCT_OS_ERROR_SUCCESS;
-}
-
-
-wlct_os_err_t CWlctCDevSocket::Ioctl(void *dataBuf, DWORD dataBufLen, DWORD ioctlFlags)
-{
-    // doing something with unused params:
-    (void)dataBufLen;
-    (void)ioctlFlags;
-
-    wlct_ioctl_hdr_t *header = (wlct_ioctl_hdr_t*)dataBuf;
-    int32_t* inBuf = (int32_t*)((char*)dataBuf + sizeof(wlct_ioctl_hdr_t));
-    int32_t* outBuf = (int32_t*)((char*)dataBuf + sizeof(wlct_ioctl_hdr_t) + header->outBufOffset);
-    int32_t outBufferSize = header->outBufSize;
-    int Id = header->commandID;
-    int ret = 0;
-
-    //init for switch section
-    wil_memio io;
-    int numReads;
-    int32_t sizeToWrite;
-    PFILTER_WRITE_BLOCK inParam;
-    int i;
-    //end init for switch section
-
-
-    switch(Id){
-    case IOCTL_INDIRECT_READ_OLD:
-        //case WILOCITY_IOCTL_INDIRECT_READ:
-        //read is allways 32 bytes
-        io.addr = inBuf[0];
-        io.val = outBuf[0];
-        io.op = EP_OPERATION_READ;
-        ret = sendRWIoctl(io, fd, interfaceName);
-        *outBuf = io.val;
-        break;
-    case IOCTL_INDIRECT_WRITE_OLD:
-        //case WILOCITY_IOCTL_INDIRECT_WRITE:
-        //write parameters are passed only throgth "in param"
-        io.addr = inBuf[0];
-        io.val = inBuf[1];
-        io.op = EP_OPERATION_WRITE;
-        ret = sendRWIoctl(io, fd, interfaceName);
-        break;
-        //rb and wb are temporary! they should be replaced by a driver Ioctl
-    case WILOCITY_IOCTL_INDIRECT_READ_BLOCK:
-        //blocks must be 32bit alligned!
-        numReads = outBufferSize / 4;
-        io.op = EP_OPERATION_READ;
-        io.addr = inBuf[0];
-        for(i = 0 ; i < numReads ; i++){
-            ret = sendRWIoctl(io, fd, interfaceName);
-            if(ret != 0){
-                return -2;
-            }
-            outBuf[i] = io.val;
-            io.addr += sizeof(int32_t);
-        }
-        break;
-    case WILOCITY_IOCTL_INDIRECT_WRITE_BLOCK:
-        //blocks must be 32bit alligned!
-        inParam = reinterpret_cast<PFILTER_WRITE_BLOCK>(inBuf);
-        io.addr = inParam->address;
-        sizeToWrite = inParam->size / 4;
-        io.op = EP_OPERATION_WRITE;
-        for(i = 0 ; i < sizeToWrite ; i++){
-            io.val = inParam->buffer[i];
-            ret = sendRWIoctl(io, fd, interfaceName);
-            if(ret != 0){
-                return -3;
-            }
-            io.addr += sizeof(int32_t);
-        }
-        break;
-    default:
-        return -1;
-    }
-
-    return ret;
-
-}
-
-wlct_os_err_t CWlctCDevSocket::DebugFS(char *FileName, void *dataBuf, DWORD dataBufLen, DWORD DebugFSFlags)
-{
-    //doing somethin with unused params:
-    (void)dataBufLen;
-    (void)DebugFSFlags;
-    char file_to_open[WLCT_CDEV_FILE_MAX_NAME_LEN] ;
-    int *dataBuf_debugFS = (int*) dataBuf;
-    int num_desc = *dataBuf_debugFS;
-    dataBuf_debugFS++;
-    int size_desc = *dataBuf_debugFS;
-
-    LOG_MESSAGE_INFO(_T("DebugFS: %s"), FileName);
-
-    if(strlen(debugFSPath) == 0) return WLCT_OS_ERROR_OPEN_FAILED;
-
-    snprintf( file_to_open, WLCT_CDEV_FILE_MAX_NAME_LEN, "%s/%s", debugFSPath, FileName);
-    std::ofstream debugFSFile;
-    debugFSFile.open(file_to_open);
-
-    if ( (debugFSFile.rdstate() & std::ifstream::failbit ) != 0 ){
-        std::cout << "error while writing to debugfs! trying to write to address : ";
-        std::cout << file_to_open << std::endl;
-        return WLCT_OS_ERROR_GEN_FAILURE;
-    }
-    if(num_desc != 0 && size_desc != 0)	debugFSFile << "alloc " << num_desc << " " << size_desc;
-    else debugFSFile << "free";
-    debugFSFile.close();
-
-    return WLCT_OS_ERROR_SUCCESS;
-}
-
-CWlctCDevSocket::~CWlctCDevSocket(){}
diff --git a/debug-tools/lib/utils/linux/WlctCDevSocket.h b/debug-tools/lib/utils/linux/WlctCDevSocket.h
deleted file mode 100644
index d2998dd..0000000
--- a/debug-tools/lib/utils/linux/WlctCDevSocket.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "wlct_os.h"
-#include "WlctCDevFile.h"
-
-#include <sys/socket.h>
-#include <linux/if.h>
-
-
-#define WLCT_CDEV_FILE_MAX_NAME_LEN 225
-
-class CWlctCDevSocket : public CWlctCDevFile
-{
-public:
-  CWlctCDevSocket();
-  virtual ~CWlctCDevSocket();
-
-  virtual wlct_os_err_t Ioctl(void *dataBuf,
-                                   DWORD dataBufLen,
-                                   DWORD ioctlFlags);
-  virtual wlct_os_err_t Open(const char *fName, const char* interfaceName);
-  virtual wlct_os_err_t DebugFS(char *FileName, void *dataBuf, DWORD dataBufLen, DWORD DebugFSFlags);
-
-private:
-
-  char interfaceName[IFNAMSIZ];
-  char debugFSPath[WLCT_CDEV_FILE_MAX_NAME_LEN];
-};
-
-typedef struct {
-  uint32_t op;
-  uint32_t addr; /* should be 32-bit aligned */
-  uint32_t val;
-} wil_memio;
-
-
diff --git a/debug-tools/remoteserver/Android.mk b/debug-tools/remoteserver/Android.mk
deleted file mode 100644
index 9a215a8..0000000
--- a/debug-tools/remoteserver/Android.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := wigig_remoteserver
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CPPFLAGS := -Wall -lpthread -fexceptions
-
-LOCAL_C_INCLUDES += \
-	$(LOCAL_PATH)/../lib/WlctPciAcss \
-	$(LOCAL_PATH)/../lib/inc \
-	$(LOCAL_PATH)/../lib/utils
-
-LOCAL_SHARED_LIBRARIES := \
-	libwigig_utils \
-	libwigig_pciaccess
-
-LOCAL_SRC_FILES := $(shell find $(LOCAL_PATH) -name '*.cpp' | sed s:^$(LOCAL_PATH)::g )
-LOCAL_SRC_FILES += parser.l
-
-
-include $(BUILD_EXECUTABLE)
-
diff --git a/debug-tools/remoteserver/Makefile b/debug-tools/remoteserver/Makefile
deleted file mode 100644
index e9bef43..0000000
--- a/debug-tools/remoteserver/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
--include $(TOPDIR)/rules.mk
-
-CFLAGS := -fPIE -Wall -g -MMD -Wno-unused-function
-LDFLAGS := -pie -fPIE -pthread -lwigig_pciaccess -lwigig_utils
-
-ifneq ($(CONFIG_TARGET_ipq)$(CONFIG_TARGET_ipq806x),)
-is_ipq806x = 1
-endif
-
-ifeq ($(is_ipq806x), 1)
-ifneq ($(strip $(TOOLPREFIX)),)
-CROSS:=$(TOOLPREFIX)
-endif
-endif
-
-CC := $(CROSS)gcc
-CXX := $(CROSS)g++
-
-.DEFAULT_GOAL = all
-PROG = wigig_remoteserver
-
-INCLUDES = -I ../lib/WlctPciAcss \
-           -I ../lib/inc \
-           -I ../lib/utils \
-
-LIBS = -L../lib/WlctPciAcss \
-       -L../lib/utils \
-
-all: $(PROG)
-
-CPP_FILES = $(shell find . -type f -name '*.cpp')
-C_FILES = $(shell find . -type f -name '*.c')
-LEX_FILES = $(shell find . -type f -name '*.l')
-
-
-GENERATED_C_FILES=$(LEX_FILES:.l=.c)
-OBJ_FILES=  $(CPP_FILES:.cpp=.o)
-OBJ_FILES += $(C_FILES:.c=.o)
-OBJ_FILES += $(GENERATED_C_FILES:.c=.o)
-
-.PRECIOUS: $(GENERATED_C_FILES)
-
-$(PROG): $(OBJ_FILES)
-	$(CXX) -o $@ $^ $(LIBS) $(LDFLAGS)
-
-%.o : %.c
-	$(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-%.o : %.cpp
-	$(CXX) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-%.c : %.l
-	flex -o $@ $<
-
-
-
-clean:
-	rm -rf $(PROG) $(GENERATED_C_FILES)
-	find . -type f \( -name "*.d" -o -name "*.o" \) -delete
-
-
--include $(OBJ_FILES:%.o=%.d)
diff --git a/debug-tools/remoteserver/cmdiface.cpp b/debug-tools/remoteserver/cmdiface.cpp
deleted file mode 100644
index b00c2d0..0000000
--- a/debug-tools/remoteserver/cmdiface.cpp
+++ /dev/null
@@ -1,652 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sstream>
-#include <iostream>
-#include <fstream>
-
-#include "cmdiface.h"
-#include "parser.h"
-#include "debug.h"
-#include "WlctPciAcss.h"
-#include "pmc_file.h"
-#include "udp_server.h"
-
-
-struct open_interface_s *CmdIface::open_interfaces = NULL;
-pthread_mutex_t CmdIface::open_interfaces_mutex = PTHREAD_MUTEX_INITIALIZER;
-int CmdIface::interface_id = 0;
-
-/*
-*/
-void *CmdIface::get_interface(const char *name)
-{
-    struct open_interface_s *s = open_interfaces;
-    LOG_DEBUG << "Looking for interface: " << name << std::endl;
-
-    while(s != NULL)
-    {
-        LOG_VERBOSE << "Checking interface for match: " << s->interface << std::endl;
-        if(0 == strncasecmp(name, s->interface, MAX_INTERFACE_NAME))
-        {
-            LOG_VERBOSE << "Match found" << std::endl;
-            return s->handler;
-        }
-        s = s->next;
-    }
-
-    return NULL;
-}
-
-/*
-*/
-void *CmdIface::add_interface(const char *name, void *handler)
-{
-    LOG_DEBUG << "Adding interface: " << name << std::endl;
-
-    void *h = get_interface(name);
-    if(h != NULL)
-    {
-        LOG_DEBUG << "The interface is already open" << std::endl;
-        return h;			// Interface already opened
-    }
-
-    // Add interface to the list
-    struct open_interface_s *s = new struct open_interface_s;
-    if(s == NULL)
-    {
-        return NULL;
-    }
-
-    snprintf(s->interface, MAX_INTERFACE_NAME, "%s", name);
-    s->handler = handler;
-    pthread_mutex_lock(&open_interfaces_mutex);
-    s->next = open_interfaces;
-    open_interfaces = s;
-    pthread_mutex_unlock(&open_interfaces_mutex);
-
-    return handler;
-}
-
-/*
-*/
-void CmdIface::del_interface(void *handler)
-{
-    LOG_DEBUG << "Deleting interfaces by handler" << std::endl;
-
-    struct open_interface_s *s = open_interfaces;
-    struct open_interface_s *prev = NULL;
-
-    while(s != NULL) {
-        if(handler == s->handler)  {
-            // Remove the interface from the list
-            pthread_mutex_lock(&open_interfaces_mutex);
-            if(prev != NULL)
-                prev->next = s->next;
-            else
-                open_interfaces = s->next;
-            pthread_mutex_unlock(&open_interfaces_mutex);
-            delete s;
-        }
-        prev = s;
-        s = s->next;
-    }
-}
-
-/*
-*/
-int CmdIface::cmd_get_interfaces()
-{
-    INTERFACE_LIST interfaces;
-    int num_interfaces;
-    int rc;
-
-    LOG_DEBUG << "Getting active WIGIG card interfaces" << std::endl;
-
-    rc = GetInterfaces(&interfaces, &num_interfaces);
-    LOG_DEBUG << "Found " << num_interfaces << " interfaces" << std::endl;
-
-    std::ostringstream replyBuilder;
-
-    if(rc == 0)
-    {
-        for(int i=0; i < num_interfaces; i++)
-        {
-            replyBuilder << interfaces.list[i].ifName << ' ';
-        }
-    }
-
-    replyBuilder << "\r\n";
-    m_Reply = replyBuilder.str();
-
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_open_interface(char *interface)
-{
-    void *handler = NULL;
-    int rc=0;
-
-    LOG_DEBUG << "Opening an interface: " << interface << std::endl;
-
-    if( strstr(interface, "SPARROW")|| strstr(interface, "sparrow")){
-	rc = CreateDeviceAccessHandler(interface, MST_SPARROW, &handler);
-    }
-    else if(strstr(interface, "MARLON") || strstr(interface, "marlon")){
-	rc = CreateDeviceAccessHandler(interface, MST_MARLON, &handler);
-    }
-    else{
-        m_Reply = "0xDEAD\r\n";
-    }
-    if(rc != 0)
-        m_Reply = "0xDEADDEAD\r\n";
-    else {
-
-        std::ostringstream replyBuilder;
-
-        replyBuilder << interface << '_' << interface_id;
-        add_interface(replyBuilder.str().c_str(), handler);
-        replyBuilder << "\r\n";
-        m_Reply = replyBuilder.str();
-        interface_id++;                     // TODO: Should be protected by a mutex? I didn't see it's being used in the application
-    }
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_close_interface(char *interface)
-{
-    LOG_DEBUG << "Closing interface: " << interface << std::endl;
-
-    void *handler = get_interface(interface);
-
-    if(handler != NULL)
-    {
-        del_interface(handler);
-        interface_id--;
-    }
-    else
-    {
-        LOG_WARNING << "Interface " << interface << " wasn't opened" << std::endl;
-    }
-
-    m_Reply = "0\r\n";
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_r(char *interface, unsigned int address)
-{
-    unsigned int val = 0xDEADDEAD;
-    void *handler = get_interface(interface);
-
-    std::ostringstream replyBuilder;
-    if(handler == NULL)
-    {
-        m_Reply = "0xDEADDEAD";
-    }
-    else
-    {
-        int rc = WlctAccssRead(handler, address, val);
-        (void)rc;
-        replyBuilder << val;
-    }
-
-    replyBuilder << "\r\n";
-    m_Reply = replyBuilder.str();
-
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_w(char *interface, unsigned int address, unsigned int data)
-{
-    int rc;
-    void *handler = get_interface(interface);
-
-    std::ostringstream replyBuilder;
-
-    if(handler == NULL)
-    {
-        replyBuilder << "0xDEADDEAD";
-    }
-    else
-    {
-        rc = WlctAccssWrite(handler, address, data);
-        if(rc == 0)
-            replyBuilder << "0";
-        else
-            replyBuilder << "ERROR";
-    }
-
-    replyBuilder << "\r\n";
-    m_Reply = replyBuilder.str();
-
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_alloc_pmc(char *interface, unsigned int desc_size, unsigned int desc_num)
-{
-    int rc;
-    LOG_DEBUG << "Allocating PMC descriptors:"
-              << " interface = " << interface
-              << " size = " << desc_size
-              << " number = " << desc_num
-              << std::endl;
-
-    std::ostringstream replyBuilder;
-
-    void *handler = get_interface(interface);
-    if(handler == NULL)
-    {
-        LOG_DEBUG << "Cannot get handler for interface " << interface << std::endl;
-        replyBuilder << "0xDEADDEAD";
-    }
-    else
-    {
-	rc = WlctAccssAllocPmc(handler, desc_size, desc_num);
-
-	if(rc == 0)
-        {
-            LOG_DEBUG << "Successfully allocated PMC descriptors" << std::endl;
-            replyBuilder << "0";
-        }
-        else
-        {
-            LOG_ERROR << "Error allocating PMC descriptors" << std::endl;
-            replyBuilder << "ERROR";
-        }
-    }
-
-    replyBuilder << "\r\n";
-    m_Reply = replyBuilder.str();
-
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_read_pmc(char *interface, unsigned int ref_number)
-{
-    LOG_DEBUG << "Reading PMC data:"
-              << " interface = " << interface
-              << " reference number = " << ref_number
-              << std::endl;
-
-    void *handler = get_interface(interface);
-
-    if(handler == NULL)
-    {
-        LOG_ERROR << "No interface found: " << interface << std::endl;
-        m_Reply = "0xDEADDEAD\r\n";
-        return 0;
-    }
-
-    PmcFile pmcFile(ref_number);
-    PmcFileWriter pmcFileWriter(pmcFile);
-    bool status = pmcFileWriter.WriteFile();
-    if (false == status)
-    {
-        LOG_ERROR << "Error creating PMC data file" << std::endl;
-        m_Reply = "0xDEADDEAD\r\n";
-        return 0;
-    }
-
-    // Reply with file size
-    size_t pmcFileSize = pmcFileWriter.GetFileSize();
-
-    std::ostringstream replyBuilder;
-    replyBuilder << pmcFileSize << "\r\n";
-    m_Reply = replyBuilder.str();
-
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_read_pmc_file(unsigned int ref_number)
-{
-    LOG_DEBUG << "Reading PMC File #" << ref_number << std::endl;
-
-    PmcFile pmcFile(ref_number);
-
-    if (NULL == pmcFile.GetFileName())
-    {
-        LOG_ERROR << "Error getting PMC data file #" << ref_number << std::endl;
-        m_Reply = "0xDEADDEAD\r\n";
-        return 0;
-    }
-
-    // Note: No \r\n is needed here, the file name won't be sent to a clientls
-    m_Reply = pmcFile.GetFileName();
-	replyType = REPLY_TYPE_FILE;
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_rb(char *interface, unsigned int address, unsigned int num_regs)
-{
-    void *handler = get_interface(interface);
-
-    if((handler == NULL) || (num_regs > MAX_REGS_LEN))
-    {
-        m_Reply = "0xDEADDEAD\r\n";
-        return 0;
-    }
-
-    unsigned int *val = new unsigned int[num_regs];
-
-    if (!val)
-    {
-        m_Reply = "0xDEADDEAD\r\n";
-        return 0;
-    }
-
-    int rc = readBlock(handler, address, num_regs*sizeof(unsigned int), (char*)val);
-
-    if (rc == 0)
-    {
-        std::ostringstream replyBuilder;
-        replyBuilder << std::hex;
-
-        for(unsigned int i=0; i < num_regs; i++)
-        {
-            replyBuilder << "0x" << val[i];
-            if(i < num_regs -1 )
-            {
-                replyBuilder << ' ';
-            }
-        }
-
-        replyBuilder << "\r\n";
-        m_Reply = replyBuilder.str();
-    }
-    else
-    {
-        m_Reply = "0xDEADDEAD\r\n";
-    }
-
-    delete[] val;
-    return 0;
-}
-
-/*
-*/
-int CmdIface::cmd_wb(char *interface, unsigned int address, unsigned int len, const char *block)
-{
-    void *handler = get_interface(interface);
-
-    if((handler == NULL) || (len > MAX_REGS_LEN))
-    {
-        m_Reply = "0xDEADDEAD\r\n";
-        return 0;
-    }
-
-    LOG_VERBOSE << "current WB is " << block << " length is " << len << std::endl;
-    int rc = writeBlock(handler, address, len, block);
-    if(rc == 0)
-    {
-        m_Reply = "0\r\n";
-    }
-    else
-    {
-        m_Reply = "ERROR\r\n";
-    }
-
-    return 0;
-}
-
-
-int CmdIface::cmd_interface_reset(char *interface)
-{
-    void *handler = get_interface(interface);
-    if(handler == NULL)
-    {
-        m_Reply = "0xDEADDEAD\r\n";
-	}
-    else
-	{
-        int rc = InterfaceReset(handler);
-        if(rc == 0)
-		{
-            m_Reply = "OK\r\n";
-		}
-        else
-		{
-            m_Reply = "0xDEADDEAD\r\n";
-		}
-    }
-
-    return 0;
-}
-
-
-int CmdIface::cmd_sw_reset(char *interface)
-{
-	void *handler = get_interface(interface);
-	if (handler == NULL)
-	{
-		m_Reply = "0xDEADDEAD\r\n";
-	}
-	else
-	{
-		int rc = SwReset(handler);
-		if (rc == 0)
-		{
-			m_Reply = "OK\r\n";
-		}
-		else
-		{
-			m_Reply = "0xDEADDEAD\r\n";
-		}
-	}
-
-	return 0;
-}
-
-int CmdIface::cmd_set_host_alias(char* alias)
-{
-	std::ofstream fd(UdpServer::host_details_file_name.c_str());
-	if (!fd.is_open())
-	{
-		m_Reply = "FAIL : Coudn't set the new alias: failed to open the configuration file";
-		LOG_VERBOSE << m_Reply << std::endl;
-		return -1;
-	}
-	fd << alias;
-	if (fd.bad())
-	{
-		m_Reply = "FAIL : Coudn't set the new alias: failed to write the new alias to the configuration file";
-		LOG_VERBOSE << m_Reply << std::endl;
-		fd.close();
-		return -2;
-	}
-	fd.close();
-
-	UdpServer::SetHostAlias(alias);
-	UdpServer::SendAll(UdpServer::GetHostDetails());
-	return 0;
-}
-
-
-/*
- Execute command received from a remote client
- The command of length 'len' is in 'buf'. 'outlen' has
- the max output buffer size.
- On return, 'outbuf' may have a reply to be sent to the client,
- 'outlen' should have the reply length or 0 if no reply required.
- Returns KEEPALIVE_OK if ok, KEEPALIVE_CLOSE to close the connection, KEEPALIVE_SHUTDOWN to shutdown the server (debug mode)
-*/
-int CmdIface::do_command(const char *buf, int len)
-{
-    servercmd_t s;
-    int result = KEEPALIVE_OK;
-    replyType = REPLY_TYPE_BUFFER;
-
-    ((char*)buf)[len] = '\0';	// Make a zero-terminated string
-
-    // Parse the command
-    parse_line(buf, &s);
-    dump_parser(&s);
-
-    // Check for the parser error. Note, not all the commands in the original protocol report about errors. so we check the error
-    // for selected commands only TODO: verify the commands list reporting the error
-    if(s.cmd == CMD_OPEN_INTERFACE || s.cmd == CMD_R || s.cmd == CMD_RB || s.cmd == CMD_W || s.cmd == CMD_WB)
-    {
-        if(s.error != 0)
-        {
-            LOG_ERROR << "Command line parsing error" << std::endl;
-            m_Reply = "0xDEADDEAD\r\n";    // TODO: or should it be "dmtools_error"??
-            return result;
-        }
-    }
-
-    switch(s.cmd)
-    {
-    case CMD_GET_INTERFACES:
-        cmd_get_interfaces();
-        break;
-    case CMD_OPEN_INTERFACE:
-        cmd_open_interface(s.interface);
-        break;
-    case CMD_CLOSE_INTERFACE:
-        cmd_close_interface(s.interface);
-        break;
-    case CMD_R:
-        cmd_r(s.interface, s.address);
-        break;
-    case CMD_RB:
-        cmd_rb(s.interface, s.address, s.value);
-        break;
-    case CMD_W:
-        cmd_w(s.interface, s.address, s.value);
-        break;
-    case CMD_WB:
-        // hexdata_len is in dwords, cmd_wb works in bytes. (hence * 4)
-        cmd_wb(s.interface, s.address, s.hexdata_len * 4, (const char*)s.hexdata);
-        break;
-    case CMD_INTERFACE_RESET:
-        cmd_interface_reset(s.interface);
-        break;
-    case CMD_SW_RESET:
-	cmd_sw_reset(s.interface);
-	break;
-    case CMD_EXIT:
-        result = KEEPALIVE_CLOSE;   // Terminate the connection
-        break;
-    case CMD_ALLOC_PMC:
-        cmd_alloc_pmc(s.interface, s.address, s.value);
-        break;
-    case CMD_READ_PMC:
-        cmd_read_pmc(s.interface, s.address);
-        break;
-    case CMD_READ_PMC_FILE:
-        cmd_read_pmc_file(s.address);
-        break;
-	case CMD_SET_HOST_ALIAS:
-		cmd_set_host_alias(s.interface);
-		break;
-    case CMD_COMMAND_UNKNOWN:
-    default:
-        m_Reply = "dmtools_error\r\n";
-
-    }
-    return result;
-}
-
-/*
- Dump the parser structure, for debugging only
-*/
-void CmdIface::dump_parser(servercmd_t *s)
-{
-    if(s->error)
-    {
-        LOG_ERROR << "Parser error in comand parsing."
-            << " Error: " << s->error
-            << " Message: " << parser_error_to_string(s->error)
-            << std::endl;
-
-        return;
-    }
-
-    LOG_VERBOSE << "Parsed Command: " << command_to_string(s->cmd)
-                << " Interface: " <<  s->interface  << std::endl;
-
-    if(s->address != (unsigned int)-1)
-    {
-        LOG_VERBOSE << "Address: " << s->address << std::endl;
-    }
-    if(s->value != (unsigned int)-1)
-    {
-        LOG_VERBOSE << "Value: " << s->value << std::endl;
-    }
-    if(s->hexdata_len)
-    {
-        for(int i=0; i < s->hexdata_len && i < MAX_REGS_LEN; i++)
-            LOG_VERBOSE << std::hex << "0x" << s->hexdata[i] << std::dec << std::endl;
-    }
-}
-
-/*
-*/
-int CmdIface::get_reply_len()
-{
-    return m_Reply.size();
-}
-
-/*
-*/
-void CmdIface::to_lower(char* string)
-{
-    for (int i = 0; string[i]; i++)
-    {
-	string[i] = tolower(string[i]);
-    }
-
-    return;
-}
-
-/*
-*/
-CmdIface::CmdIface()
-    : replyType(REPLY_TYPE_BUFFER)
-{
-}
diff --git a/debug-tools/remoteserver/cmdiface.h b/debug-tools/remoteserver/cmdiface.h
deleted file mode 100644
index a58864e..0000000
--- a/debug-tools/remoteserver/cmdiface.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __interface_h
-#define __interface_h
-
-#include <pthread.h>
-#include <string>
-
-extern "C"
-{
-#include "parser.h"
-}
-
-struct open_interface_s {
-    char interface[MAX_INTERFACE_NAME];
-    void *handler;
-    struct open_interface_s *next;
-};
-
-#define KEEPALIVE_OK    0    // keep the connection
-#define KEEPALIVE_CLOSE 1    // close the connection
-#define KEEPALIVE_SHUTDOWN 2 // close the connection and shutdown the server. For debugging only, remove from the production
-
-
-// Max buffer size for a command and a reply. We should consider the longest command/data sequence to fit in a buffer.
-// rb reading 1024 (MAX_REGS_LEN) registers: rb HHHHHHHH HHHH 1024*(0xHHHHHHHH) = 17 + 1024*10 = 10257 bytes
-// wb writing 1024 (MAX_REGS_LEN) hex values: wb HHHHHHHH "1024*HH" = 14+1024*2 = 2062 bytes
-#define MAX_INPUT_BUF (11*MAX_REGS_LEN)
-
-// The reply data may be generated in several ways, the data is expected to be obtained according to this type
-enum REPLY_TYPE
-{
-    REPLY_TYPE_NONE,
-    REPLY_TYPE_BUFFER,
-    REPLY_TYPE_FILE
-};
-
-
-class CmdIface
-{
-public:
-    CmdIface();
-
-    int do_command(const char *buf, int len);
-    const char *get_reply() const { return m_Reply.c_str(); };
-    int   get_reply_len();
-    REPLY_TYPE get_reply_type() const { return replyType; }
-
-private:
-
-    static struct open_interface_s *open_interfaces;
-    static pthread_mutex_t open_interfaces_mutex;
-    static int interface_id;                        // Interface id counter returned in open_interface
-
-    void *get_interface(const char *name);
-    void *add_interface(const char *name, void *handler);
-    void del_interface(void *handler);
-
-    int cmd_get_interfaces();
-    int cmd_open_interface(char *interface);
-    int cmd_close_interface(char *interface);
-    int cmd_r(char *interface, unsigned int address);
-    int cmd_rb(char *interface, unsigned int address, unsigned int num_regs);
-    int cmd_w(char *interface, unsigned int address, unsigned int data);
-    int cmd_wb(char *interface, unsigned int address, unsigned int len, const char *block);
-    int cmd_interface_reset(char *interface);
-    int cmd_sw_reset(char *interface);
-    int cmd_alloc_pmc(char *interface, unsigned int desc_size, unsigned int desc_num);
-    int cmd_read_pmc(char *interface, unsigned int ref_number);
-    int cmd_read_pmc_file(unsigned int ref_number);
-    void dump_parser(servercmd_t *s);
-    int cmd_set_host_alias(char *alias);
-
-    void to_lower(char* string);
-
-    REPLY_TYPE replyType;
-    std::string m_Reply;
-
-};
-
-#endif // interface_h
-
diff --git a/debug-tools/remoteserver/debug.cpp b/debug-tools/remoteserver/debug.cpp
deleted file mode 100644
index 7a3502d..0000000
--- a/debug-tools/remoteserver/debug.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "debug.h"
-#include <stdio.h>
-
-// *************************************************************************************************
-
-LogConfig g_LogConfig(LOG_SEV_INFO, false);
-
-// *************************************************************************************************
-
-LogConfig::LogConfig(LogSeverity maxSeverity, bool bPrintLocation)
-    : m_MaxSeverity(maxSeverity), m_PrintLocation(bPrintLocation)
-{
-}
-
-void LogConfig::SetMaxSeverity(int traceLevel)
-{
-    if (traceLevel > LOG_SEV_VERBOSE)
-    {
-        fprintf(stderr, "Invalid trace level, setting %d\n", LOG_SEV_VERBOSE);
-        m_MaxSeverity = LOG_SEV_VERBOSE;
-    }
-    else
-    {
-        m_MaxSeverity = static_cast<LogSeverity>(traceLevel);
-        fprintf(stdout, "Setting trace level to %d\n", m_MaxSeverity);
-    }
-}
-
-// *************************************************************************************************
-
-const char* LogMsgPrefix::SeverityToString(LogSeverity sev)
-{
-    static const char* const pSeverityToString[] = { "ERR", "WRN", "INF", "DBG", "VRB" };
-
-    size_t index = static_cast<size_t>(sev);
-    if (index >= sizeof(pSeverityToString)/sizeof(pSeverityToString[0]))
-    {
-        return "---";
-    }
-
-    return pSeverityToString[index];
-}
-
-std::ostream& operator<<(std::ostream& os, const LogMsgPrefix& prefix)
-{
-    os << '[' << LogMsgPrefix::SeverityToString(prefix.Severity) << "] ";
-    if (!g_LogConfig.ShouldPrintLocation()) return os;
-    return os << "(" << prefix.File << ':' << prefix.Line << ") ";
-}
diff --git a/debug-tools/remoteserver/debug.h b/debug-tools/remoteserver/debug.h
deleted file mode 100644
index d3c99bf..0000000
--- a/debug-tools/remoteserver/debug.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __debug_h
-#define __debug_h
-
-#include <iostream>
-
-// Severity values are expected to raise from zero
-enum LogSeverity
-{
-    LOG_SEV_ERROR   = 0,   // Unexpected input/events that may cause server misbehavior
-    LOG_SEV_WARNING = 1,   // Suspicious events
-    LOG_SEV_INFO    = 2,   // Events like command/response
-    LOG_SEV_DEBUG   = 3,   // Detailed functionality
-    LOG_SEV_VERBOSE = 4    // Excessive debug
-};
-
-#define TRACE_WITH_PREFIX(SEV)    \
-    g_LogConfig.ShouldPrint(SEV) && std::cout << LogMsgPrefix(SEV, __FILE__, __LINE__)
-
-#define LOG_ERROR   TRACE_WITH_PREFIX(LOG_SEV_ERROR)
-#define LOG_WARNING TRACE_WITH_PREFIX(LOG_SEV_WARNING)
-#define LOG_INFO    TRACE_WITH_PREFIX(LOG_SEV_INFO)
-#define LOG_DEBUG   TRACE_WITH_PREFIX(LOG_SEV_DEBUG)
-#define LOG_VERBOSE TRACE_WITH_PREFIX(LOG_SEV_VERBOSE)
-
-// *************************************************************************************************
-
-struct LogConfig
-{
-public:
-    LogConfig(LogSeverity maxSeverity, bool bPrintLocation);
-    void SetMaxSeverity(int traceLevel);
-
-    bool ShouldPrint(LogSeverity sev) const { return sev <= m_MaxSeverity; }
-    bool ShouldPrintLocation() const { return m_PrintLocation; }
-
-private:
-
-    LogSeverity m_MaxSeverity;
-    const bool m_PrintLocation;
-
-};
-
-// *************************************************************************************************
-
-extern LogConfig g_LogConfig;
-
-// *************************************************************************************************
-
-class LogMsgPrefix
-{
-    friend std::ostream& operator<<(std::ostream& os, const LogMsgPrefix& prefix);
-
-public:
-
-    LogMsgPrefix(LogSeverity severity, const char* pFile, int line)
-        : Severity(severity), File(pFile), Line(line) {}
-
-private:
-
-    static const char* SeverityToString(LogSeverity sev);
-
-    const LogSeverity Severity;
-    const char* const File;
-    const int Line;
-};
-
-
-// *************************************************************************************************
-// Stream Formatters
-// *************************************************************************************************
-
-// Print a boolean value as a string
-struct BoolStr
-{
-    explicit BoolStr(bool value): Value(value) {}
-    const bool Value;
-};
-
-inline std::ostream& operator<<(std::ostream& os, const BoolStr& boolStr)
-{
-    return os << std::boolalpha << boolStr.Value << std::noboolalpha;
-}
-
-// *************************************************************************************************
-
-// Print a string while displaying newline characters
-struct PlainStr
-{
-    explicit PlainStr(const std::string& value): Value(value) {}
-    const std::string& Value;
-};
-
-inline std::ostream& operator<<(std::ostream& os, const PlainStr& plainStr)
-{
-    for (std::string::const_iterator it = plainStr.Value.begin(); it != plainStr.Value.end(); ++it)
-    {
-        switch (*it)
-        {
-        case '\r': os << "\\r"; break;
-        case '\n': os << "\\n"; break;
-        case '\t': os << "\\t"; break;
-        default:   os << *it; break;
-        }
-    }
-
-    return os;
-}
-
-
-#endif
diff --git a/debug-tools/remoteserver/file_reader.cpp b/debug-tools/remoteserver/file_reader.cpp
deleted file mode 100644
index 526c67c..0000000
--- a/debug-tools/remoteserver/file_reader.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "file_reader.h"
-#include "debug.h"
-
-#include <cstring>
-#include <cerrno>
-#include <stdio.h>
-
-// *************************************************************************************************
-
-FileReader::FileReader(const char* pFileName)
-    : m_FileName(pFileName ? pFileName : "")
-    , m_pFile(NULL)
-    , m_FileSize(0)
-    , m_ReadTillNow(0)
-    , m_IsCompleted(false)
-    , m_IsError(false)
-{
-    if (NULL == pFileName)
-    {
-        LOG_ERROR << "No file name provided" << std::endl;
-        return;
-    }
-
-    LOG_DEBUG << "Opening file reader for: " << m_FileName << std::endl;
-    m_pFile = fopen(pFileName, "rb");
-
-    if (NULL == m_pFile)
-    {
-        int lastErrno = errno;
-        LOG_ERROR << "Error opening file."
-                  << " Name: " << pFileName
-                  << " Error: " << lastErrno
-                  << " Message: " << strerror(lastErrno)
-                  << std::endl;
-        return;
-    }
-
-    fseek (m_pFile, 0, SEEK_END);
-    m_FileSize = ftell(m_pFile);
-    rewind(m_pFile);
-
-    LOG_DEBUG <<"Get file size for " << pFileName << ": " << m_FileSize << "B" << std::endl;
-}
-
-// *************************************************************************************************
-
-FileReader::~FileReader()
-{
-    if (m_pFile)
-    {
-        LOG_DEBUG << "Closing the file: " << m_FileName << std::endl;
-        fclose (m_pFile);
-        m_pFile = NULL;
-    }
-}
-
-// *************************************************************************************************
-
-bool FileReader::CanReadFromFile(char* pBuf, size_t availableSpace)
-{
-    if (!pBuf)
-    {
-        LOG_ERROR << "Cannot read from file " << m_FileName << ": "
-                  << "No buffer is provided" << std::endl;
-        return false;
-    }
-
-    if (0 == availableSpace)
-    {
-        LOG_ERROR << "Cannot read from file " << m_FileName << ": "
-                  << "No buffer space is provided" << std::endl;
-        return false;
-    }
-
-    if (NULL == m_pFile)
-    {
-        LOG_ERROR << "Cannot read from file " << m_FileName << ": "
-                  << "No file handle is available" << std::endl;
-        return false;
-    }
-
-    if (m_IsCompleted)
-    {
-        LOG_ERROR << "Unexpected read from file " << m_FileName << ": "
-                  << "EoF is reached" << std::endl;
-        return false;
-    }
-
-    if (m_IsError)
-    {
-        LOG_ERROR << "Unexpected read from file " << m_FileName << ": "
-                  << "Error occured" << std::endl;
-        return false;
-    }
-
-    return true;
-
-}
-
-// *************************************************************************************************
-
-size_t FileReader::ReadChunk(char* pBuf, size_t availableSpace)
-{
-    LOG_DEBUG << "Reading a chunk."
-              << " File Name: "     << m_FileName
-              << " File Size: "     << m_FileSize << "B"
-              << " Read till now: " << m_ReadTillNow << "B"
-              << " Buffer: "        << availableSpace << "B"
-              << " Completed: "     << BoolStr(m_IsCompleted)
-              << " Error: "         << BoolStr(m_IsError)
-              << std::endl;
-
-    if (false == CanReadFromFile(pBuf, availableSpace))
-    {
-        LOG_ERROR << "Cannot read from file: " << m_FileName
-                  << " Check previous errors/status" << std::endl;
-        m_IsError = true;
-        return 0;
-    }
-
-    // Read up to availableSpace. Reading less means either EoF is reached or read error occured
-    size_t readBytes = fread(pBuf, 1, availableSpace, m_pFile);
-    m_ReadTillNow += readBytes;
-
-    if (feof(m_pFile))
-    {
-        LOG_DEBUG << "EOF reached" << std::endl;
-        m_IsCompleted = true;
-    }
-
-    if (ferror(m_pFile))
-    {
-        int lastErrno = errno;
-        m_IsError = true;
-        LOG_ERROR << "Cannot read file"
-                  << " Name: "   << m_FileName
-                  << " Error: "  << lastErrno
-                  << " Message:" << strerror(lastErrno)
-                  << std::endl;
-    }
-
-    LOG_VERBOSE << "Got a chunk."
-                << " File Name: "     << m_FileName
-                << " File Size: "     << m_FileSize << "B"
-                << " Read till now: " << m_ReadTillNow << "B"
-                << " Buffer: "        << availableSpace << "B"
-                << " Completed: "     << BoolStr(m_IsCompleted)
-                << " Error: "         << BoolStr(m_IsError)
-                << std::endl;
-
-    return readBytes;
-
-}
diff --git a/debug-tools/remoteserver/file_reader.h b/debug-tools/remoteserver/file_reader.h
deleted file mode 100644
index 2b7b12f..0000000
--- a/debug-tools/remoteserver/file_reader.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _FILE_READER_H_
-#define _FILE_READER_H_
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string>
-
-// *************************************************************************************************
-
-// Reads a file from the file system and exports its content to a buffer provided by the caller.
-// If the file is larger than a provide bugffer, it is delivered by chunks of the buffer size.
-// The last chunk may occupy less than the whole buffer. It's a caller's responsibility to allocate
-// the buffer and call the FileReader API untill the file is fully exported.
-
-class FileReader
-{
-public:
-
-    explicit FileReader(const char* pFileName);
-    ~FileReader();
-
-    size_t ReadChunk(char* pBuf, size_t availableSpace);
-
-    bool IsCompleted() const { return m_ReadTillNow == m_FileSize; }
-    bool IsError() const { return m_IsError; }
-
-    size_t ReadTillNow() const { return m_ReadTillNow; }
-    size_t GetFileSize() const { return m_FileSize; }
-
-private:
-
-    bool CanReadFromFile(char* pBuf, size_t availableSpace);
-
-    const std::string m_FileName;        // File name - cached for tracing
-    FILE* m_pFile;                       // File Handler - open for read
-    size_t m_FileSize;                   // File Size
-    size_t m_ReadTillNow;                // Bytes read till now
-    bool m_IsCompleted;                  // Set to true when OEF is reached
-    bool m_IsError;                      // Error flag
-
-};
-
-
-#endif    // _FILE_READER_H_
diff --git a/debug-tools/remoteserver/main.cpp b/debug-tools/remoteserver/main.cpp
deleted file mode 100644
index dae1030..0000000
--- a/debug-tools/remoteserver/main.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <unistd.h>     // getopt
-#include <stdlib.h>     // atoi
-#include <signal.h>	// SIGQUIT handling
-#include "parser.h"
-#include "server.h"
-#include "udp_server.h"
-#include "debug.h"
-
-#define WILSERVER_VERSION 0x0100
-#define DEFAULT_SERVER_PORT 12348
-#define DEFAULT_UDP_LOCAL_SERVER_PORT_IN 12349
-#define DEFAULT_UDP_REMOTE_SERVER_PORT_IN 12350
-
-UdpServer us;
-Server s;
-
-void sig_quit_handler(int signum)
-{
-    if (signum == SIGQUIT)
-    {
-        printf("Exiting Wilserver as per user request\n");
-        us.stop();
-        s.stop();
-        exit(signum);
-    }
-}
-
-int main(int argc, char* argv[])
-{
-    // Register for SIGQUIT signal
-    signal(SIGQUIT, sig_quit_handler);
-
-    int opt;
-    int port=DEFAULT_SERVER_PORT;
-    int localUdpPortIn = DEFAULT_UDP_LOCAL_SERVER_PORT_IN;
-    int remoteUdpPortIn = DEFAULT_UDP_REMOTE_SERVER_PORT_IN;
-    int traceLevel = LOG_SEV_WARNING;
-
-    while ((opt = getopt(argc, argv, "d:vp:")) != -1) {
-        switch (opt) {
-        case 'd':
-            traceLevel = atoi(optarg);
-            g_LogConfig.SetMaxSeverity(traceLevel);
-            break;
-        case 'p':
-            port = atoi(optarg);
-            if(port == 0)  {
-                LOG_ERROR << "Invalid port specified" << optarg << std::endl;
-                exit(EXIT_FAILURE);
-            }
-            break;
-        default:
-            fprintf(stderr, "Usage: %s [-d debug_level] | [-p port]\n", argv[0]);
-            exit(EXIT_FAILURE);
-        }
-    }
-
-    LOG_INFO << "Starting WIGIG Remote Server" << std::endl;
-    us.start(localUdpPortIn, remoteUdpPortIn);
-    s.start(port);
-    return 0;
-}
-
-
diff --git a/debug-tools/remoteserver/parser.h b/debug-tools/remoteserver/parser.h
deleted file mode 100644
index 112f90f..0000000
--- a/debug-tools/remoteserver/parser.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __parser_h
-#define __parser_h
-
-#include "servercmd.h"
-
-
-int parse_line(const char *line, servercmd_t *s);
-
-#endif /* __parser_h */
diff --git a/debug-tools/remoteserver/parser.l b/debug-tools/remoteserver/parser.l
deleted file mode 100644
index e4d0507..0000000
--- a/debug-tools/remoteserver/parser.l
+++ /dev/null
@@ -1,211 +0,0 @@
-%{
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "servercmd.h"
-
-static int acc_byte = 0;
-static int acc_len =  0;
-
-%}
-%option noyywrap
-%option nounput
-/* We need reentratnt scanner for multiple connections */
-%option reentrant
-/* %option c++ */
-%x str
-DIGIT		[0-9]
-HEXDIGIT	[0-9A-Fa-f]
-
-ID		[A-Za-z_!][A-Za-z_!0-9]*
-
-%%
-"get_interfaces"  {
-		if(cb_cmd(yyextra, CMD_GET_INTERFACES))
-			yyterminate();
-		}
-"open_interface"	{
-		if(cb_cmd(yyextra, CMD_OPEN_INTERFACE))
-			yyterminate();
-		}
-"close_interface" {
-		if(cb_cmd(yyextra, CMD_CLOSE_INTERFACE))
-			yyterminate();
-		}
-"r"		{
-		if(cb_cmd(yyextra, CMD_R))
-			yyterminate();
-		}
-"rb"		{
-		if(cb_cmd(yyextra, CMD_RB))
-			yyterminate();
-		}
-"w"		{
-		if(cb_cmd(yyextra, CMD_W))
-			yyterminate();
-		}
-"wb"		{
-		if(cb_cmd(yyextra, CMD_WB))
-			yyterminate();
-		}
-"alloc_pmc"	{
-		if(cb_cmd(yyextra, CMD_ALLOC_PMC))
-			yyterminate();
-		}
-"read_pmc"	{
-		if(cb_cmd(yyextra, CMD_READ_PMC))
-			yyterminate();
-		}
-"read_pmc_file" {
-		if(cb_cmd(yyextra, CMD_READ_PMC_FILE))
-			yyterminate();
-		}
-"interface_reset" {
-		if(cb_cmd(yyextra, CMD_INTERFACE_RESET))
-			yyterminate();
-		}
-
-"sw_reset"      {
-		if(cb_cmd(yyextra, CMD_SW_RESET))
-			yyterminate();
-		}
-"exit"  {
-        if(cb_cmd(yyextra, CMD_EXIT))
-            yyterminate();
-        }
-"set_host_alias"  {
-        if(cb_cmd(yyextra, CMD_SET_HOST_ALIAS))
-            yyterminate();
-        }
-{DIGIT}+	{
-		/* A decimal number represents the address/value */
-		if(cb_number(yyextra, yytext))
-			yyterminate();
-		}
-
-{ID}		{
-		/* The protocol doesn't separate between interface id and command */
-		if(cb_id(yyextra, yytext))
-			yyterminate();
-		}
-\"		{
-		/* Start of string */
-		BEGIN(str);
-		acc_byte = 0;
-		acc_len = 0;
-		}
-<str>\"		{
-		/* End of string */
-		if(acc_len > 0) {
-			if(cb_hexbyte(yyextra, acc_byte))
-				yyterminate();
-		}
-		/* Callback for end of hex string */
-		if(cb_endhex(yyextra))
-			yyterminate();
-		BEGIN(INITIAL);
-		}
-<str>{HEXDIGIT}	{
-		/* We get hex bytes in the string */
-		if(acc_len == 10)  {
-			cb_error(yyextra, ERR_BAD_HEX_VALUE, "");
-			yyterminate();
-		}else if(acc_len <= 1){
-			acc_len++;
-		// do nothing on the 0x
-		}
-		else  {
-			acc_len++;
-			acc_byte = acc_byte * 16 +  hexdigit(yytext[0]);
-			}
-		}
-<str>[ \t]	{
-		/* Hex bytes separated by spaces */
-			if(acc_len > 0) {
-				if(cb_hexbyte(yyextra, acc_byte))
-					yyterminate();
-				acc_len = 0;
-				acc_byte = 0;
-			}
-		}
-<str><<EOF>>	{
-		/* Check the end of string with unterminated quote */
-		cb_error(yyextra, ERR_UNTERMINATED_STRING, "");
-		yyterminate();
-		}
-<str>x		{
-		/* if we ancounter 0x, remove the x and continue */
-			if(acc_len != 1){
-				cb_error(yyextra, ERR_BAD_HEX_VALUE, "");
-			}
-			acc_len++;
-		}
-<str>.		{
-		/* Anything except the hex bytes is not allowed in the string parameter */
-		cb_error(yyextra, ERR_BAD_HEX_VALUE, "");
-		yyterminate();
-		}
-
-[ \t\r\n]+	{
-		/* Whitespace */
-		if(cb_separator(yyextra))
-			yyterminate();
-		}
-.		{
-		cb_error(yyextra, ERR_BAD_TOKEN, yytext);
-		yyterminate();
-		}
-%%
-
-/*
- Parses the input line
-*/
-int parse_line(const char *line, servercmd_t *s)
-{
-	yyscan_t scanner;
-	YY_BUFFER_STATE bs;
-	cb_parser_start(s);
-        yylex_init(&scanner);
-
-        if (!scanner)
-        {
-            return 1;
-        }
-
-	yyset_extra(s, scanner);
-	bs = yy_scan_string(line, scanner);
-	yylex(scanner);
-	yy_delete_buffer(bs, scanner);
-	yylex_destroy(scanner);
-	cb_parser_end(s);
-	return s->error;
-}
-
-
-
diff --git a/debug-tools/remoteserver/pmc_file.cpp b/debug-tools/remoteserver/pmc_file.cpp
deleted file mode 100644
index e449739..0000000
--- a/debug-tools/remoteserver/pmc_file.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "pmc_file.h"
-#include "debug.h"
-
-#include <cstring>
-#include <cerrno>
-#include <sstream>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-// *************************************************************************************************
-#ifdef __ANDROID__
-#define PMC_DATA_DIRECTORY "/data/pmc"
-#else
-#define PMC_DATA_DIRECTORY "/var/pmc"
-#endif
-
-// PMC directory and file name pattern should be managed separately as directory is required as a
-// separate variable.
-
-const char* const PmcFile::s_pDirectory = PMC_DATA_DIRECTORY;
-const char* const PmcFile::s_pFileNamePrefix = "pmc_data_";
-
-// *************************************************************************************************
-
-PmcFile::PmcFile(int fileId)
-    : m_FileId(fileId)
-{
-    std::stringstream ss;
-    ss << s_pDirectory << '/' << s_pFileNamePrefix << fileId;
-    m_FileName = ss.str();
-
-    LOG_DEBUG << "PMC file name #" << fileId << " generated: " << m_FileName << std::endl;
-}
-
-std::ostream& operator<<(std::ostream& os, const PmcFile& pmcFile)
-{
-    return os << "PMC file #" << pmcFile.GetFileId() << " (" << pmcFile.GetFileName() << ')';
-}
-
-// *************************************************************************************************
-
-PmcFileWriter::PmcFileWriter(const PmcFile& pmcFile)
-    : m_PmcFile(pmcFile)
-{
-}
-
-// *************************************************************************************************
-
-bool PmcFileWriter::CreateDirectoryIfNeeded() const
-{
-    // Create a PMC directory if does not exist
-    struct stat st = {};
-    if (stat(m_PmcFile.GetDirectory(), &st) != -1)
-    {
-        LOG_DEBUG << "PMC directory " << m_PmcFile.GetDirectory()
-                  << " exists for " << m_PmcFile.GetFileName() << std::endl;
-        return true;
-    }
-
-    LOG_DEBUG << "Creating a PMC directory: " << m_PmcFile.GetDirectory() << std::endl;
-
-    int status = mkdir(m_PmcFile.GetDirectory(), 0700);
-    if (0 != status)
-    {
-        int lastErrno = errno;
-        LOG_ERROR << "Cannot create PMC directory."
-                  << " Path: "    << m_PmcFile.GetDirectory()
-                  << " Error:"    <<  lastErrno
-                  << " Message: " << strerror(lastErrno)
-                  << std::endl;
-
-        return false;
-    }
-
-    return true;
-}
-
-// *************************************************************************************************
-
-bool PmcFileWriter::WriteFile() const
-{
-    if (false == CreateDirectoryIfNeeded())
-    {
-        LOG_ERROR << "Cannot create a PMC directory for " << m_PmcFile << std::endl;
-        return false;
-    }
-
-    // Create a PMC file
-    const char* pCmdPrefix =
-        "D=$(find /sys/kernel/debug/ieee80211/ -name wil6210); cat $D/pmcdata >> ";
-    std::stringstream ss;
-    ss << pCmdPrefix << m_PmcFile.GetFileName();
-
-    system(ss.str().c_str());
-    return true;
-
-}
-
-// *************************************************************************************************
-
-size_t PmcFileWriter::GetFileSize() const
-{
-    FILE *pFile = fopen(m_PmcFile.GetFileName(), "r");
-
-    if (NULL == pFile)
-    {
-        int lastErrno = errno;
-        LOG_ERROR << "Cannot open " << m_PmcFile << " for writing."
-                  << " Error: "   << lastErrno
-                  << " Message: " << strerror(lastErrno)
-                  << std::endl;
-        return 0;
-    }
-
-    fseek (pFile, 0, SEEK_END);
-    size_t fileSize = ftell(pFile);
-    fclose(pFile);
-
-    LOG_DEBUG << "Get PMC file size for " << m_PmcFile
-              << ": " << fileSize << "B" << std::endl;
-
-    return fileSize;
-}
diff --git a/debug-tools/remoteserver/pmc_file.h b/debug-tools/remoteserver/pmc_file.h
deleted file mode 100644
index b7af0b7..0000000
--- a/debug-tools/remoteserver/pmc_file.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _PMC_FILE_H_
-#define _PMC_FILE_H_
-
-#include <stdio.h>
-#include <string>
-
-// *************************************************************************************************
-
-// Generates a PMC file name from its ID.
-class PmcFile
-{
-public:
-
-    explicit PmcFile(int fileId);
-
-    int GetFileId() const { return m_FileId; }
-    const char* GetFileName() const { return m_FileName.c_str(); }
-
-    static const char* GetDirectory() { return s_pDirectory; }
-
-private:
-
-    static const char* const s_pDirectory;
-    static const char* const s_pFileNamePrefix;
-
-    const int m_FileId;        // File ID (expected to be unique)
-    std::string m_FileName;    // File Name Buffer
-
-};
-
-std::ostream& operator<<(std::ostream& os, const PmcFile& pmcFile);
-
-// *************************************************************************************************
-
-// Creates a PMC data file according to a provided ID.
-class PmcFileWriter
-{
-public:
-
-    explicit PmcFileWriter(const PmcFile& pmcFile);
-
-    bool WriteFile() const;
-    size_t GetFileSize() const;
-
-private:
-
-    bool CreateDirectoryIfNeeded() const;
-
-    const PmcFile& m_PmcFile;
-
-};
-
-
-#endif    // PMC_FILE_H_
diff --git a/debug-tools/remoteserver/server.cpp b/debug-tools/remoteserver/server.cpp
deleted file mode 100644
index 0f8cdb9..0000000
--- a/debug-tools/remoteserver/server.cpp
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <cerrno>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <fstream>
-#include "server.h"
-#include "cmdiface.h"
-#include "debug.h"
-#include "pmc_file.h"
-#include "file_reader.h"
-
-// Thread parameters structure
-typedef struct {
-    int sock;
-    struct sockaddr address;
-    int addr_len;
-} connection_par_t;
-
-volatile int Server::shutdown_flag = 0;
-volatile int Server::running_threads = 0;
-pthread_mutex_t Server::threads_counter_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-void *Server::server_process(void *ptr)
-{
-    char *buf;
-    CmdIface *iface;
-    int rw;
-
-    if(ptr == NULL)
-    {
-        pthread_exit(0);
-    }
-
-    connection_par_t *par = (connection_par_t*)ptr;
-    iface = new CmdIface();
-    buf = new char[MAX_INPUT_BUF+1];
-    if (!buf)
-    {
-        LOG_ERROR << "Cannot allocate server receive buffer" << std::endl;
-        pthread_exit(0);
-    }
-
-    memset(buf, 0, MAX_INPUT_BUF+1);
-    rw = read(par->sock, buf, MAX_INPUT_BUF);
-
-    while(rw > 0)
-    {
-        // Got some data
-        if(rw)
-        {
-            buf[rw] = '\0';
-            LOG_INFO << "Client Command: " << PlainStr(buf) << std::endl;
-            int cmdKeepalive = iface->do_command((const char*)buf, rw);
-            LOG_DEBUG << "Command handling keepalive: " << cmdKeepalive << std::endl;
-
-            // Check for keepalive return value
-            int replyKeepalive = reply(par->sock, iface);
-
-            if(cmdKeepalive == KEEPALIVE_CLOSE || replyKeepalive == KEEPALIVE_CLOSE)
-            {
-                // Handler asked to close the connection
-                rw = 0;
-                break;
-            }
-        }
-        rw = read(par->sock, buf, MAX_INPUT_BUF);
-    }
-
-    // if 0 - connection is closed, <0 - error
-    LOG_DEBUG << "Closing connection. Read result: " << rw << std::endl;
-    close(par->sock);
-    delete[] buf;
-    delete iface;
-    delete par;
-    pthread_mutex_lock(&threads_counter_mutex);
-    running_threads--;
-    pthread_mutex_unlock(&threads_counter_mutex);
-    pthread_exit(0);
-}
-
-int Server::reply(int sock, CmdIface* iface)
-{
-    LOG_INFO << "Reply: " << PlainStr(iface->get_reply()) << std::endl;
-
-    switch (iface->get_reply_type())
-    {
-    case REPLY_TYPE_BUFFER:
-        return reply_buffer(sock, iface->get_reply(), iface->get_reply_len());
-
-    case REPLY_TYPE_FILE:
-        return reply_file(sock, iface->get_reply());
-
-    default:
-        LOG_ERROR << "Unexpected reply type: " << iface->get_reply_type() << std::endl;
-        return KEEPALIVE_CLOSE;
-    }
-}
-
-int Server::reply_buffer(int sock, const char* pBuf, size_t len)
-{
-    LOG_DEBUG << "Replying from a buffer (" << len << "B) Content: " << PlainStr(pBuf) << std::endl;
-
-    if (0 == len)
-    {
-        LOG_ERROR << "No reply generated by a command handler - connection will be closed" << std::endl;
-        return KEEPALIVE_CLOSE;
-    }
-
-    if (false == send_buffer(sock, pBuf, len))
-    {
-        return KEEPALIVE_CLOSE;
-    }
-
-    return KEEPALIVE_OK;
-}
-
-int Server::reply_file(int sock, const char* pFileName)
-{
-    LOG_DEBUG << "Replying from a file: " << pFileName << std::endl;
-
-    FileReader fileReader(pFileName);
-    size_t fileSize = fileReader.GetFileSize();
-
-    if (0 == fileSize)
-    {
-        LOG_ERROR << "No file content is available for reply" << std::endl;
-        return KEEPALIVE_CLOSE;
-    }
-
-    static const size_t BUF_LEN = 64 * 1024;
-
-    char* pBuf = new char[BUF_LEN];
-    size_t chunkSize = 0;
-    bool isError = false;
-
-    do
-    {
-        LOG_VERBOSE << "Requesting for a file chunk" << std::endl;
-
-        chunkSize = fileReader.ReadChunk(pBuf, BUF_LEN);
-        if (chunkSize > 0)
-        {
-            if (false == send_buffer(sock, pBuf, chunkSize))
-            {
-                LOG_ERROR << "Send error detected" << std::endl;
-                isError = true;
-                break;
-            }
-        }
-
-        // Error/Completion may occur with non-zero chunk as well
-        if (fileReader.IsError())
-        {
-            LOG_ERROR << "File read error detected" << std::endl;
-            isError = true;
-            break;
-        }
-
-        if (fileReader.IsCompleted())
-        {
-            LOG_DEBUG << "File completion detected" << std::endl;
-            break;
-        }
-
-        LOG_DEBUG << "File Chunk Delivered: " << chunkSize << "B" << std::endl;
-    }
-    while (chunkSize > 0);
-
-    delete[] pBuf;
-
-    if (isError)
-    {
-        LOG_ERROR << "Error occured while replying file content" << std::endl;
-        return KEEPALIVE_CLOSE;
-    }
-    else
-    {
-        LOG_DEBUG << "File Content successfully delivered" << std::endl;
-        return KEEPALIVE_OK;
-    }
-}
-
-bool Server::send_buffer(int sock, const char* pBuf, size_t len)
-{
-    if (!pBuf)
-    {
-        LOG_ERROR << "Cannot reply to a command - No buffer is provided" << std::endl;
-        return false;
-    }
-
-    size_t sentTillNow = 0;
-
-    while(sentTillNow < len)
-    {
-        ssize_t sentBytes = write(sock, pBuf, len);
-        if (sentBytes < 0)
-        {
-            int lastErrno = errno;
-            LOG_ERROR << "Cannot send response buffer."
-                      << " Error:" << lastErrno
-                      << " Message: " << strerror(lastErrno)
-                      << std::endl;
-            return false;
-        }
-
-        sentTillNow += sentBytes;
-        LOG_DEBUG << "Sent response chunk."
-                  << " Chunk Size: "      << sentBytes
-                  << " Sent till now: "   << sentTillNow
-                  << " Response Length: " <<  len
-                  << std::endl;
-    }
-
-    LOG_DEBUG << "Response buffer fully sent" << std::endl;
-    return true;
-}
-
-/*
-  Close the server to allow un-bind te socket - allowing future connections without delay
-*/
-int Server::stop()
-{
-    LOG_INFO << "Stopping the server" << std::endl;
-    shutdown(sock, SHUT_RDWR);
-    return 0;
-}
-
-/*
-  Initialize server on the given port. The function returns in case of error,
-  otherwise it doesn't return
-*/
-int Server::start(int port)
-{
-    LOG_INFO << "Starting the server on port " << port << std::endl;
-
-    struct sockaddr_in address;
-    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-
-    if(sock < 0)
-    {
-        LOG_ERROR << "Cannot create a socket on port " << port << std::endl;
-        return -1;
-    }
-
-    address.sin_family = AF_INET;
-    address.sin_addr.s_addr = INADDR_ANY;
-    address.sin_port = htons(port);
-
-    // Set the "Re-Use" socket option - allows reconnections after wilserver exit
-    int reuse = 1;
-    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int));
-
-    if(bind(sock, (struct sockaddr *)&address, sizeof(struct sockaddr_in)) < 0)
-    {
-        LOG_ERROR << "Cannot bind socket to port " << port << std::endl;
-        return -2;
-    }
-
-    if (listen(sock, 5) < 0)
-    {
-        LOG_ERROR << "Cannot listen on port " << port << std::endl;
-        return -3;
-    }
-
-    shutdown_flag = 0;
-    while (shutdown_flag == 0)  {
-        pthread_t thread;
-        connection_par_t *par = new connection_par_t;
-        par->sock = accept(sock, &par->address, (socklen_t*)&par->addr_len);
-        if(par->sock < 0)
-            delete par;
-        else {
-            pthread_mutex_lock(&threads_counter_mutex);
-            running_threads++;
-            pthread_mutex_unlock(&threads_counter_mutex);
-            pthread_create(&thread, 0, &Server::server_process, (void *)par);
-            pthread_detach(thread);
-        }
-
-    }
-    // Wait till all the threads are done in case we ever exit the loop above
-    while(running_threads > 0)
-        sleep(1);
-
-    LOG_INFO << "Server shutdown" << std::endl;
-
-    return 0; // Wont get here, just to avoid the warning
-}
diff --git a/debug-tools/remoteserver/server.h b/debug-tools/remoteserver/server.h
deleted file mode 100644
index 01cd080..0000000
--- a/debug-tools/remoteserver/server.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __server_h
-#define __server_h
-#include <pthread.h>
-#include <string>
-
-class CmdIface;
-
-class Server
-{
-public:
-
-    int start(int port);
-    int stop();
-
-    static int get_shutdown_flag() { return shutdown_flag; }
-
-
-private:
-
-    static volatile int shutdown_flag;
-    static volatile int running_threads;
-    static pthread_mutex_t threads_counter_mutex;
-    int sock;
-
-    static void *server_process(void *ptr);
-    static bool send_buffer(int sock, const char* pBuf, size_t len);
-    static int reply(int sock, CmdIface* iface);
-    static int reply_buffer(int sock, const char* pBuf, size_t len);
-    static int reply_file(int sock, const char* pFileName);
-};
-
-#endif // server_h
-
diff --git a/debug-tools/remoteserver/servercmd.cpp b/debug-tools/remoteserver/servercmd.cpp
deleted file mode 100644
index bfc180b..0000000
--- a/debug-tools/remoteserver/servercmd.cpp
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sstream>
-
-#include "servercmd.h"
-#include "debug.h"
-
-#define EXP_NON		0
-#define EXP_CMD		(-1)
-#define EXP_IFC		1
-#define EXP_NUM		2
-#define EXP_HEX		3
-#define EXP_SEP		4
-#define EXP_END		5
-
-const char* parser_state_to_string(int parserState)
-{
-    switch (parserState)
-    {
-    case EXP_NON: return "EXP_NON";
-    case EXP_CMD: return "EXP_CMD";
-    case EXP_IFC: return "EXP_IFC";
-    case EXP_NUM: return "EXP_NUM";
-    case EXP_HEX: return "EXP_HEX";
-    case EXP_SEP: return "EXP_SEP";
-    case EXP_END: return "EXP_END";
-    default:      return "<unknown>";
-    }
-}
-
-
-static int states_table[][5] =
-{
-    { EXP_END, 0,       0,       0,       0 },      // 0 - get_interfaces
-    { EXP_IFC, EXP_END, 0,       0,       0 },      // 1 - open_interface name
-    { EXP_IFC, EXP_END, 0,       0,       0 },      // 2 - close_interface name
-    { EXP_IFC, EXP_NUM, EXP_END, 0,       0 },      // 3 - r name address
-    { EXP_IFC, EXP_NUM, EXP_NUM, EXP_END, 0 },      // 4 - rb name address count
-    { EXP_IFC, EXP_NUM, EXP_NUM, EXP_END, 0 },      // 5 - w name address value
-    { EXP_IFC, EXP_NUM, EXP_HEX, EXP_END, 0 },      // 6 - wb name address hexstring
-    { EXP_IFC, EXP_END, 0,       0,       0 },      // 7 - interface_reset name
-    { EXP_IFC, EXP_END, 0,       0,       0 },      // 8 - sw_reset name
-    { EXP_END, 0,       0,       0,       0 },      // 9 - exit
-    { EXP_IFC, EXP_NUM, EXP_NUM, EXP_END, 0 },      // 10 - Alloc_PMC name number_of_descriptors size_of_descriptors
-    { EXP_IFC, EXP_NUM, EXP_END, 0,       0 },      // 11 - read_pmc interface requestReferenceNumber
-    { EXP_NUM, EXP_END, 0,       0,       0 },      // 12 - read_pmc_file requestReferenceNumber
-    { EXP_IFC, EXP_END, 0, 		 0, 	  0 }, 		// 13 - set_host_alias
-};
-
-
-// The return value is copied because std::stringstream::str() returns a temporary object
-std::string parser_state_machine_to_string(int* pStateMachine)
-{
-    if (!pStateMachine)
-    {
-        return std::string("{}");
-    }
-
-    std::stringstream ss;
-
-    ss << "{ ";
-
-    size_t numStates = sizeof(states_table[0])/sizeof(int);
-    for (size_t i = 0; i < numStates; ++i)
-    {
-        ss << parser_state_to_string(pStateMachine[i]) << " ";
-    }
-    ss << "}";
-
-    return ss.str();
-}
-
-
-const char* command_to_string(int cmdCode)
-{
-    switch (cmdCode)
-    {
-    case CMD_COMMAND_UNKNOWN: return "CMD_COMMAND_UNKNOWN";
-    case CMD_GET_INTERFACES:  return "CMD_GET_INTERFACES";
-    case CMD_OPEN_INTERFACE:  return "CMD_OPEN_INTERFACE";
-    case CMD_CLOSE_INTERFACE: return "CMD_CLOSE_INTERFACE";
-    case CMD_R:               return "CMD_R";
-    case CMD_RB:              return "CMD_RB";
-    case CMD_W:               return "CMD_W";
-    case CMD_WB:              return "CMD_WB";
-    case CMD_INTERFACE_RESET: return "CMD_INTERFACE_RESET";
-    case CMD_SW_RESET:        return "CMD_SW_RESET";
-    case CMD_EXIT:            return "CMD_EXIT";
-    case CMD_ALLOC_PMC:       return "CMD_ALLOC_PMC";
-    case CMD_READ_PMC:        return "CMD_READ_PMC";
-    case CMD_READ_PMC_FILE:   return "CMD_READ_PMC_FILE";
-    case CMD_SET_HOST_ALIAS:  return "CMD_SET_HOST_ALIAS";
-    default:                  return "<unknown>";
-    }
-}
-
-
-const char* parser_error_to_string(int parserError)
-{
-    switch (parserError)
-    {
-    case ERR_BAD_TOKEN:           return "ERR_BAD_TOKEN";
-    case ERR_BAD_VALUE:           return "VALUE";
-    case ERR_UNTERMINATED_STRING: return "ERR_UNTERMINATED_STRING";
-    case ERR_BAD_HEX_VALUE:       return "ERR_BAD_HEX_VALUE";
-    case ERR_CMD_NOT_EXPECTED:    return "ERR_CMD_NOT_EXPECTED";
-    case ERR_IFACE_NOT_EXPECTED:  return "ERR_IFACE_NOT_EXPECTED";
-    case ERR_VALUE_NOT_EXPECTED:  return "ERR_VALUE_NOT_EXPECTED";
-    case ERR_HEX_NOT_EXPECTED:    return "ERR_HEX_NOT_EXPECTED";
-    case ERR_END_NOT_EXPECTED:    return "ERR_END_NOT_EXPECTED";
-    default:                      return "<unknown>";
-    }
-}
-
-
-
-/*
-  Callback on parser start.
-  Returns the handler to be used in all subsequent callbacks
-  or NULL in case of error, the parsing will be aborted then
-*/
-void cb_parser_start(servercmd_t *s)
-{
-    s->states = NULL;
-    s->state = EXP_CMD;	// We start with expecting a command
-    s->cmd = CMD_COMMAND_UNKNOWN;
-    s->error = 0;
-    s->address = (unsigned int)-1;
-    s->value = (unsigned int)-1;
-    s->hexdata_len = 0;
-    s->hexdata = (unsigned int*)malloc (sizeof(int)*MAX_REGS_LEN);
-}
-
-/*
-  Callback on a command. Gets the command code.
-  Returns 0 if ok, 1 if error, the parsing will be aborted then
-*/
-int  cb_cmd(servercmd_t *s, int cmd)
-{
-    LOG_VERBOSE <<"cb_cmd(" << cmd << ") state index = " << s->state << std::endl;
-    LOG_VERBOSE << "State Machine: " << parser_state_machine_to_string(s->states) << std::endl;
-
-    if(s->state != EXP_CMD)  {
-        s->error = ERR_CMD_NOT_EXPECTED;
-        LOG_ERROR << "Command not expected, expecting " << s->state << std::endl;
-        return -1;
-    }
-    LOG_VERBOSE << "Parsed Command: " << cmd << "(" << command_to_string(cmd) << ")" << std::endl;
-    s->cmd = cmd;
-    s->states = states_table[cmd];
-    s->state++;
-
-    return 0;
-}
-
-
-/*
-  Returns 0 if ok, 1 if error, the parsing will be aborted then
-*/
-int  cb_id(servercmd_t *s, const char *id)
-{
-    LOG_VERBOSE << "cb_id(" << id << ") state index = " << s->state << std::endl;
-    LOG_VERBOSE << "State Machine: " << parser_state_machine_to_string(s->states) << std::endl;
-
-    if((s->states == NULL) || (s->states[s->state] != EXP_IFC)) {
-        s->error = ERR_IFACE_NOT_EXPECTED;
-        LOG_ERROR << "Interface not expected, expecting: "
-                  << (s->states?s->states[s->state]:-1) << std::endl;
-        return -1;
-    }
-
-    LOG_VERBOSE << "Interface id: " << id << std::endl;
-    snprintf(s->interface, MAX_INTERFACE_NAME, "%s", id);
-    s->state++;
-    return 0;
-}
-
-/*
-  Returns 0 if ok, 1 if error, the parsing will be aborted then
-*/
-int  cb_number(servercmd_t *s, const char *id)
-{
-    LOG_VERBOSE << "cb_number(" << id << ") state index = " << s->state << std::endl;
-    LOG_VERBOSE << "State Machine: " << parser_state_machine_to_string(s->states) << std::endl;
-
-    if((s->states == NULL) || (s->states[s->state] != EXP_NUM))  {
-        s->error = ERR_VALUE_NOT_EXPECTED;
-        LOG_ERROR << "Number not expected, expecting " << (s->states?s->states[s->state]:-1) << std::endl;
-        return -1;
-    }
-
-    // A hack now. if address already set, the number is for data
-    LOG_VERBOSE << "string number " << id << std::endl;
-
-    if(s->address != (unsigned int)-1){
-        sscanf(id, "%u", &(s->value));
-        //s->value = strtoul(id, tmp, 10); //10 is the base for conversion
-	//	dprint("str to uint Parsed val %u\n",  strtoul(id, tmp, 10));
-	//	dprint("str to int Parsed val %u\n", atol(id));//s->value = atol(id);
-        LOG_VERBOSE << "scanf Parsed value: " << s->value << std::endl;
-    }
-    else{
-	//	s->address = atol(id);
-        sscanf(id, "%u", &(s->address));
-        LOG_VERBOSE << "Parsed addr " << s->address << std::endl;
-    }
-    s->state++;
-    return 0;
-}
-
-/*
-  Callback on hex data
-  Returns 0 if ok, 1 if error, the parsing will be aborted then
-*/
-int  cb_hexbyte(servercmd_t *s, int b)
-{
-    LOG_VERBOSE << "cb_hexbyte(0x" << std::hex << b << std::dec << ") state index = " << s->state << std::endl;
-    LOG_VERBOSE << "State Machine: " << parser_state_machine_to_string(s->states) << std::endl;
-
-    if((s->states == NULL) || (s->states[s->state] != EXP_HEX)) {
-        s->error = ERR_HEX_NOT_EXPECTED;
-        LOG_ERROR << "Hex not expected, expecting " << (s->states?s->states[s->state]:-1) << std::endl;
-        return -1;
-    }
-    if(s->hexdata_len == MAX_REGS_LEN) {
-        s->error = ERR_BAD_HEX_VALUE;
-        LOG_ERROR << "Too long hex data" << std::endl;
-        return -1;
-    }
-    LOG_VERBOSE << "Hex byte 0x" << std::hex << b << std::dec << std::endl;
-    s->hexdata[s->hexdata_len] = b;
-    s->hexdata_len++;
-    // Do not change the s->state here, we are still expecting hex data. cb_endhex will change the state
-    return 0;
-}
-
-/*
-  Callback on end of hex data string
-  Returns 0 if ok, 1 if error, the parsing will be aborted then
-*/
-
-int cb_endhex(servercmd_t *s)
-{
-    LOG_VERBOSE << "cb_endhex() state index = " << s->state << std::endl;
-    LOG_VERBOSE << "State Machine: " << parser_state_machine_to_string(s->states) << std::endl;
-
-    if((s->states == NULL) || (s->states[s->state] != EXP_HEX)) {
-        s->error = ERR_HEX_NOT_EXPECTED;
-        LOG_ERROR << "Hex not expected, expecting " << (s->states?s->states[s->state]:-1) << std::endl;
-        return -1;
-    }
-    s->state++;
-    return 0;
-}
-
-/*
-  Callback on a separator, not used.
-  Returns 0 if ok, 1 if error, the parsing will be aborted then
-*/
-int  cb_separator(servercmd_t *s)
-{
-    (void)s;
-    return 0;
-}
-
-/*
-  Callback on the parser end
-  Returns the parser result: 0 if ok, error otherwise
-*/
-void  cb_parser_end(servercmd_t *s)
-{
-    LOG_VERBOSE << "cb_parser_end() state index = " << s->state << std::endl;
-    LOG_VERBOSE << "State Machine: " << parser_state_machine_to_string(s->states) << std::endl;
-
-    if((s->error == 0) && ((s->states == NULL) || (s->states[s->state] != EXP_END)))  {
-        LOG_ERROR << "End of parser while still expecting " << (s->states?s->states[s->state]:-1) << std::endl;
-        s->error = ERR_END_NOT_EXPECTED;
-    }
-
-    free(s->hexdata);
-}
-
-/*
-  Callback on parser error
-*/
-void cb_error(servercmd_t *s, int error, const char *str)
-{
-    (void)str;
-    s->error = error;
-    LOG_ERROR << "Parser error: " << error << std::endl;
-}
-
-/*
-  Service function. Converting a hex digit from a character.
-*/
-int hexdigit(char d)
-{
-    if((d >= '0') && (d <= '9'))
-        return d-'0';
-    else if((d >= 'A') && (d <= 'F'))
-        return d-'A'+10;
-    else if((d >- 'a') && (d <= 'f'))
-        return d-'a'+10;
-    else	// This shouldn't happen, it's the parser's responsibility to parse valid hex digits
-        return 0;
-}
diff --git a/debug-tools/remoteserver/servercmd.h b/debug-tools/remoteserver/servercmd.h
deleted file mode 100644
index c63e3c7..0000000
--- a/debug-tools/remoteserver/servercmd.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __servercmd_h
-#define __servercmd_h
-
-// This header is included by the parser, which is flex-generated C code
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Commands list
-#define CMD_COMMAND_UNKNOWN     (-1)
-#define CMD_GET_INTERFACES      0
-#define CMD_OPEN_INTERFACE      1
-#define CMD_CLOSE_INTERFACE     2
-#define CMD_R                   3
-#define CMD_RB                  4
-#define CMD_W                   5
-#define CMD_WB                  6
-#define CMD_INTERFACE_RESET     7
-#define CMD_SW_RESET            8
-#define CMD_EXIT                9  // debug command
-#define CMD_ALLOC_PMC           10
-#define CMD_READ_PMC            11
-#define CMD_READ_PMC_FILE       12
-#define CMD_SET_HOST_ALIAS		13
-
-
-const char* command_to_string(int cmdCode);
-
-#define MAX_INTERFACE_NAME 32          // TODO: better to include WlctPciAcss.h that defines MAX_IF_NAME_LENGTH==32
-#define MAX_REGS_LEN    (256* 1024)    // Max registers to read/write at once
-
-// Parser errors
-#define ERR_BAD_TOKEN (-1)
-#define ERR_BAD_VALUE (-2)
-#define ERR_UNTERMINATED_STRING (-3)
-#define ERR_BAD_HEX_VALUE (-4)
-#define ERR_CMD_NOT_EXPECTED (-5)
-#define ERR_IFACE_NOT_EXPECTED (-6)
-#define ERR_VALUE_NOT_EXPECTED (-7)
-#define ERR_HEX_NOT_EXPECTED (-8)
-#define ERR_END_NOT_EXPECTED (-9)
-
-const char* parser_error_to_string(int parserError);
-
-
-/*
- Parser result/state structure
-*/
-typedef struct {
-	int state;
-	int cmd;
-	int *states;
-	char interface[MAX_INTERFACE_NAME+1];
-	unsigned int address;
-	unsigned int value;
-	unsigned int* hexdata;
-	int hexdata_len;
-	int error;
-} servercmd_t;
-
-
-
-/*
- Parser callbacks
-*/
-void cb_parser_start(servercmd_t *s);
-int  cb_cmd(servercmd_t *s, int cmd);
-int  cb_id(servercmd_t *s, const char *id);
-int  cb_number(servercmd_t *s, const char *id);
-int  cb_hexbyte(servercmd_t *s, int b);
-int  cb_endhex(servercmd_t *s);
-int  cb_separator(servercmd_t *s);
-void cb_parser_end(servercmd_t *s);
-void cb_error(servercmd_t *s, int error, const char *str);
-
-/* helper functions */
-int hexdigit(char d);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // servercmd_h
diff --git a/debug-tools/remoteserver/udp_server.cpp b/debug-tools/remoteserver/udp_server.cpp
deleted file mode 100644
index fafa2be..0000000
--- a/debug-tools/remoteserver/udp_server.cpp
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <cerrno>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <fstream>
-#include "server.h"
-#include "cmdiface.h"
-#include "debug.h"
-#include "pmc_file.h"
-#include "file_reader.h"
-#include "udp_server.h"
-
-const std::string UdpServer::local_host = "127.0.0.1";
-const std::string UdpServer::host_details_file_name = "/etc/wigig_remoteserver_details";
-const std::string UdpServer::cmd_get_host_identity = "GetHostIdentity";
-const std::string UdpServer::cmd_delimiter = ";";
-
-std::string UdpServer::host_broadcast_ip = "";
-std::string UdpServer::host_ip = "";
-std::string UdpServer::host_alias = "";
-int UdpServer::sock_in = 0;
-int UdpServer::sock_out = 0;
-int UdpServer::port_in = 0;
-int UdpServer::port_out = 0;
-
-int UdpServer::SendAll(std::string message)
-{
-    int result = -1;
-
-    struct sockaddr_in dstAddress;
-    dstAddress.sin_family = AF_INET;
-    inet_pton(AF_INET , host_broadcast_ip.c_str(), &dstAddress.sin_addr.s_addr);
-    dstAddress.sin_port = htons(UdpServer::port_out);
-    int messageSize = message.length() * sizeof(char);
-    result = sendto(UdpServer::sock_out, message.c_str(), messageSize, 0, (sockaddr*)&dstAddress, sizeof(dstAddress));
-    LOG_DEBUG << "INFO : sendto with sock_out=" << UdpServer::sock_out << ", message=" << message << " messageSize=" << messageSize << " returned with " << result << std::endl;
-    if (result < 0)
-    {
-        LOG_DEBUG << "ERROR : Cannot send udp broadcast message, error " << errno << ": " << strerror(errno)  << std::endl;
-        return -4;
-    }
-
-    return 0;
-}
-
-int UdpServer::HandleRequest(char* buf)
-{
-    if(NULL == buf)
-    {
-        return 0;
-    }
-
-    LOG_DEBUG << "INFO : Client Command: " << PlainStr(buf) << std::endl;
-
-    std::string cmd(buf);
-    std::string answer;
-
-    if (UdpServer::local_host == host_ip)
-    {
-        LOG_DEBUG << "WARNING : There is no support in UDP srevices when using local host" << std::endl;
-        return 0;
-    }
-
-    if (UdpServer::cmd_get_host_identity == cmd)
-    {
-        answer = GetHostDetails();
-    }
-    else
-    {
-        LOG_DEBUG << "ERROR : Unkonwn UDP command" << std::endl;
-    }
-
-    // send back response in broadcast
-    // For the time being, all requests will have broadcast response
-    // All responses will use the same outgoing communication port
-    LOG_DEBUG << "INFO : Answer is: " << PlainStr(answer.c_str()) << std::endl;
-    SendAll(answer);
-
-    return 0;
-}
-
-
-/*
-  Close the server to allow un-bind te socket - allowing future connections without delay
-*/
-int UdpServer::stop()
-{
-    LOG_DEBUG << "INFO : Stopping the UDP server" << std::endl;
-    shutdown(UdpServer::sock_in, SHUT_RDWR);
-    return 0;
-}
-
-/*
-  Initialize UPD server on the given port. The function returns in case of error,
-  otherwise it doesn't return
-*/
-int UdpServer::start(int localUdpPortIn, int remoteUdpPortIn)
-{
-    LOG_DEBUG << "INFO : Starting UDP server on port " << localUdpPortIn << std::endl;
-    LOG_DEBUG << "INFO : Sending broadcast answers to port " << remoteUdpPortIn << std::endl;
-
-    //  open the UDP server on a new thread
-    UdpServer::port_in = localUdpPortIn;
-    UdpServer::port_out = remoteUdpPortIn;
-    pthread_t thread;
-    pthread_create(&thread, 0, start_udp_server, NULL);
-    pthread_detach(thread);
-
-    return 0;
-}
-
-void* UdpServer::start_udp_server(void* unused)
-{
-    (void)unused;
-    if (LoadHostDetails() < 0)
-    {
-        return NULL;
-    }
-
-    // Create outgoing response socket
-    UdpServer::sock_out = socket(AF_INET, SOCK_DGRAM, 0);
-    if (UdpServer::sock_out < 0)
-    {
-        LOG_DEBUG << "ERROR : Cannot open udp broadcast outgoing socket" << std::endl;
-        return NULL;
-    }
-
-    int enabled = 1;
-    int result;
-    result = setsockopt(UdpServer::sock_out, SOL_SOCKET, SO_BROADCAST, (char*)&enabled, sizeof(enabled));
-    if (result < 0)
-    {
-        LOG_DEBUG << "ERROR : Cannot set broadcast option for udp socket, error " << errno << ": " << strerror(errno) << std::endl;
-        shutdown(UdpServer::sock_out, SHUT_RDWR);
-        return NULL;
-    }
-
-    // Create incoming request socket
-    struct sockaddr_in address;
-    UdpServer::sock_in = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-    if(UdpServer::sock_in < 0)
-    {
-        LOG_DEBUG << "ERROR : Cannot create a socket on port " << UdpServer::port_in << std::endl;
-        return NULL;
-    }
-
-    address.sin_family = AF_INET;
-    address.sin_addr.s_addr = INADDR_ANY;
-    address.sin_port = htons(UdpServer::port_in);
-    // Set the "Re-Use" socket option - allows reconnections after wilserver exit
-    int reuse = 1;
-    setsockopt(UdpServer::sock_in, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int));
-    if(bind(UdpServer::sock_in, (struct sockaddr *)&address, sizeof(struct sockaddr_in)) < 0)
-    {
-        LOG_DEBUG << "ERROR : Cannot bind socket to port " << UdpServer::port_in << ", error " << errno << ": " << strerror(errno)  << std::endl;
-        return NULL;
-    }
-
-    char* buf = new char[MAX_INPUT_BUF];
-    if (!buf)
-    {
-        LOG_ERROR << "Cannot allocate receive buffer for UDP messages" << std::endl;
-        return NULL;
-    }
-
-    do
-    {
-        if (recvfrom(UdpServer::sock_in, buf, MAX_INPUT_BUF, 0, NULL, 0) < 0)
-        {
-            LOG_DEBUG << "ERROR : Cannot listen on port " << UdpServer::port_in << std::endl;
-            return NULL;
-        }
-
-        HandleRequest(buf);
-
-    } while (true);
-
-    LOG_DEBUG << "INFO : UDP server shutdown" << std::endl;
-    return NULL; // Wont get here, just to avoid the warning
-}
-
-bool FindEthernetInterface(struct ifreq& ifr, int& fd)
-{
-    fd = socket(AF_INET, SOCK_DGRAM, 0);
-    if(fd < 0)
-    {
-        LOG_DEBUG << "ERROR : Cannot get host and broadcast IPs" << std::endl;
-        return -1;
-    }
-
-    for (int i = 0; i < 100; i++)
-    {
-        snprintf(ifr.ifr_name, IFNAMSIZ-1, "eth%d", i);
-
-        if (ioctl(fd, SIOCGIFADDR, &ifr) >= 0)
-        {
-            return true;
-        }
-    }
-
-    return false;
-}
-
-int UdpServer::LoadHostAndBroadcastIps()
-{
-    int fd;
-    struct ifreq ifr;
-
-    ifr.ifr_addr.sa_family = AF_INET; // IP4V
-
-    // Get IP address according to OS
-    if (FindEthernetInterface(ifr, fd))
-    {
-        LOG_INFO << "Linux OS" << std::endl;
-    }
-    else
-    {
-        snprintf(ifr.ifr_name, IFNAMSIZ, "br-lan");
-        if (ioctl(fd, SIOCGIFADDR, &ifr) >= 0)
-        {
-            LOG_INFO << "OpenWRT OS" << std::endl;
-        }
-        else
-        {
-            // Probably Android OS
-            LOG_INFO << "Android OS (no external IP Adress)" << std::endl;
-            host_ip = UdpServer::local_host;
-            host_broadcast_ip = UdpServer::local_host;
-            return 0;
-        }
-    }
-    host_ip = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
-
-    if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0)
-    {
-        LOG_DEBUG << "ERROR : Cannot get broadcast IP" << std::endl;
-        return -3;
-    }
-    host_broadcast_ip = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
-    LOG_DEBUG << "INFO : " << "host_ip=" << host_ip << std::endl;
-    LOG_DEBUG << "INFO : " << "host_broadcast_ip=" << host_broadcast_ip << std::endl;
-
-    close(fd);
-    return 0;
-}
-
-void UdpServer::LoadHostAlias()
-{
-    std::ifstream infile;
-    infile.open(host_details_file_name.c_str());
-    std::getline(infile, host_alias);
-    infile.close();
-}
-
-int UdpServer::LoadHostDetails()
-{
-    if (LoadHostAndBroadcastIps() < 0)
-    {
-        return -1;
-    }
-    LoadHostAlias();
-    return 0;
-}
diff --git a/debug-tools/remoteserver/udp_server.h b/debug-tools/remoteserver/udp_server.h
deleted file mode 100644
index 01855d7..0000000
--- a/debug-tools/remoteserver/udp_server.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __udp_server_h
-#define __udp_server_h
-
-class UdpServer
-{
-public:
-    int start(int localUdpPortIn, int remoteUdpPortIn);
-    int stop();
-
-    static int SendAll(std::string message);
-    static std::string GetHostDetails() { return  UdpServer::cmd_get_host_identity + UdpServer::cmd_delimiter + host_ip + UdpServer::cmd_delimiter + host_alias; }
-    static void SetHostAlias(std::string alias) { host_alias = alias; }
-
-    static const std::string host_details_file_name;
-
-private:
-    // members
-    static const std::string local_host;
-    static const std::string cmd_get_host_identity;
-    static const std::string cmd_delimiter;
-    static std::string host_broadcast_ip;
-    static std::string host_ip;
-    static std::string host_alias;
-    static int sock_in;
-    static int sock_out;
-    static int port_in;
-    static int port_out;
-
-    // methods
-    static void* start_udp_server(void* unused);
-    static int LoadHostDetails();
-    static int  LoadHostIp(); // assumption: each host has only one IP address for ethernet interfaces
-    static void LoadHostAlias();
-    static int HandleRequest(char* buf);
-    static int LoadHostAndBroadcastIps();
-};
-
-#endif // udp_server_h
diff --git a/debug-tools/wiburn/Android.mk b/debug-tools/wiburn/Android.mk
deleted file mode 100644
index 34521f6..0000000
--- a/debug-tools/wiburn/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := wigig_wiburn
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CPPFLAGS := -Wall -lpthread -fexceptions
-
-LOCAL_C_INCLUDES += \
-	$(LOCAL_PATH)/../lib/WlctPciAcss \
-	$(LOCAL_PATH)/../lib/FlashAcss \
-	$(LOCAL_PATH)/../lib/inc \
-	$(LOCAL_PATH)/../lib/utils
-
-LOCAL_SHARED_LIBRARIES := \
-	libwigig_utils \
-	libwigig_pciaccess \
-	libwigig_flashaccess
-
-LOCAL_SRC_FILES := \
-	wiburn.cpp \
-	translation_map.cpp \
-	ParameterParser.cpp \
-	template_inst.cpp \
-	CCRC32.cpp
-
-include $(BUILD_EXECUTABLE)
-
diff --git a/debug-tools/wiburn/CCRC32.cpp b/debug-tools/wiburn/CCRC32.cpp
deleted file mode 100644
index 7352264..0000000
--- a/debug-tools/wiburn/CCRC32.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "wlct_os.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include "CCRC32.h"
-
-CCRC32::CCRC32(void)
-{
-    int index = 0;
-    while (index <= BYTE_MASK)
-    {
-        lookup[index] = Reflect(index, 8);
-        lookup[index] = lookup[index] << 24;
-
-        // Repeat 8 times
-        int subindex = 0;
-        while(subindex < 8)
-        {
-            subindex++;
-
-            int check;
-            if (lookup[index] & (1 << 31))
-            {
-                check = POLYNOMIAL;
-            }
-            else
-            {
-                check = 0;
-            }
-
-            lookup[index] = (lookup[index] << 1);
-            lookup[index] = lookup[index] ^ check;
-        }
-
-        lookup[index] = Reflect(lookup[index], 32);
-        index++;
-    }
-}
-
-uint32_t CCRC32::Reflect(uint32_t reflected, const char bitsToReflect)
-{
-    uint32_t retVal = 0;
-
-    int index = 1;
-
-    while(index < (bitsToReflect + 1))
-    {
-        if((reflected % 2) == 1)
-        {
-            retVal |= (1 << (bitsToReflect - index));
-        }
-        else
-        {
-            // do nothing
-        }
-        reflected >>= 1;
-        index++;
-    }
-
-    return retVal;
-}
-
-void CCRC32::CalcCRCStep(uint32_t *crc, const unsigned char *data, uint32_t length)
-{
-    uint32_t tempCRC = *crc;
-
-    for (uint32_t index = 0; index < length; index++)
-    {
-        tempCRC = (tempCRC >> 8) ^ lookup[(tempCRC & BYTE_MASK) ^ *data++];
-    }
-
-    *crc = tempCRC;
-}
-
-uint32_t CCRC32::CalcCRC(const unsigned char *data, uint32_t length)
-{
-    uint32_t crc = CRC_MASK;
-    CalcCRCStep(&crc, data, length);
-    return(crc ^ CRC_MASK);
-}
diff --git a/debug-tools/wiburn/CCRC32.h b/debug-tools/wiburn/CCRC32.h
deleted file mode 100644
index aa896f8..0000000
--- a/debug-tools/wiburn/CCRC32.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef CRC32_H
-#define CRC32_H
-
-#define POLYNOMIAL 0x04C11DB7
-#define CRC_MASK 0xffffffff
-#define LOOKUP_SIZE 256
-#define BYTE_MASK 0xff
-
-class CCRC32
-{
-public:
-    CCRC32();
-
-    uint32_t CalcCRC(const unsigned char *data, uint32_t length);
-
-private:
-    uint32_t Reflect(uint32_t ulReflect, const char bitsToReflect);
-    uint32_t lookup[LOOKUP_SIZE];
-    void CalcCRCStep(uint32_t *ulCRC, const unsigned char *data, uint32_t length);
-};
-
-#endif
diff --git a/debug-tools/wiburn/Makefile b/debug-tools/wiburn/Makefile
deleted file mode 100644
index 1e8f296..0000000
--- a/debug-tools/wiburn/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
--include $(TOPDIR)/rules.mk
-
-CFLAGS := -fPIE -Wall -g -MMD -fPIE -Wno-reorder
-LDFLAGS := -pie -fPIE -pthread -lwigig_flashaccess -lwigig_pciaccess -lwigig_utils
-
-ifneq ($(CONFIG_TARGET_ipq)$(CONFIG_TARGET_ipq806x),)
-is_ipq806x = 1
-endif
-
-ifeq ($(is_ipq806x), 1)
-ifneq ($(strip $(TOOLPREFIX)),)
-CROSS:=$(TOOLPREFIX)
-endif
-endif
-
-CC := $(CROSS)gcc
-CXX := $(CROSS)g++
-
-.DEFAULT_GOAL = all
-PROG = wigig_wiburn
-
-INCLUDES += -I ../lib/WlctPciAcss \
-            -I ../lib/FlashAcss \
-            -I ../lib/inc \
-            -I ../lib/utils \
-
-LIBS = -L../lib/FlashAcss \
-       -L../lib/WlctPciAcss \
-       -L../lib/utils \
-
-all: $(PROG)
-
-CPP_FILES = wiburn.cpp \
-            translation_map.cpp \
-            ParameterParser.cpp \
-            template_inst.cpp \
-            CCRC32.cpp \
-
-OBJ_FILES = $(CPP_FILES:.cpp=.o)
-
-$(PROG): $(OBJ_FILES)
-	$(CXX) -o $@ $^ $(LIBS) $(LDFLAGS)
-
-%.o : %.cpp
-	$(CXX) $(CFLAGS) $(INCLUDES) -o $@ -c $<
-
-clean:
-	rm -rf $(PROG)
-	find . -type f \( -name "*.d" -o -name "*.o" \) -delete
-
-
--include $(OBJ_FILES:%.o=%.d)
-
diff --git a/debug-tools/wiburn/ParameterParser.cpp b/debug-tools/wiburn/ParameterParser.cpp
deleted file mode 100644
index 84980e2..0000000
--- a/debug-tools/wiburn/ParameterParser.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ParameterParser.h"
-
-#include "wlct_os.h"
-
-ParameterParser::ParameterParser()
-{
-}
-
-void ParameterParser::setVerbose()
-{
-    verbose = true ;
-}
-
-void ParameterParser::printVerbose()
-{
-    if( verbose )
-        cout << endl  ;
-}
-void ParameterParser::printVerbose( const char *INFO )
-{
-    if( verbose )
-        cout << INFO  ;
-}
-
-int ParameterParser::processCommandArgs( int _argc, char **_argv )
-{
-    for (int index = 1; index < _argc; index++)
-    {
-        if (IsFlag(_argv[index]))
-        {
-            Flags[_argv[index]] = true;
-        }
-        else if (IsParam(_argv[index]))
-        {
-            Parameters[_argv[index]] = _argv[index + 1];
-            index++;
-        }
-        else
-        {
-            printUsage();
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-bool ParameterParser::IsFlag(string flag)
-{
-    for (list<string>::iterator iterator = flags.begin(); iterator != flags.end(); iterator++)
-    {
-        if (flag.compare(*iterator) == 0)
-        {
-            return true;
-        }
-    }
-
-    return false;
-}
-
-bool ParameterParser::IsParam(string param)
-{
-    for (list<string>::iterator iterator = params.begin(); iterator != params.end(); iterator++)
-    {
-        if (param.compare(*iterator) == 0)
-        {
-            return true;
-        }
-    }
-
-    return false;
-}
-
-bool ParameterParser::ParamFound(string param)
-{
-    return (Parameters.find(param) != Parameters.end());
-}
-
-bool ParameterParser::FlagFound(string flag)
-{
-    return (Flags.find(flag) != Flags.end());
-}
-
-void ParameterParser::addFlag(string flag)
-{
-    flags.push_front(flag);
-}
-
-void ParameterParser::addParam(string param)
-{
-    params.push_front(param);
-}
-
-char* ParameterParser::getValue(string option)
-{
-    if (IsParam(option) && ParamFound(option))
-    {
-        return Parameters[option];
-    }
-    else
-    {
-        return NULL;
-    }
-}
-
-bool ParameterParser::getFlag(string option)
-{
-    if (IsFlag(option) && FlagFound(option))
-    {
-        return Flags[option];
-    }
-    else
-    {
-        return false;
-    }
-}
-
-void ParameterParser::printUsage()
-{
-    cout<<
-        "***************\n"\
-        "Usage \n" \
-        "***************\n" \
-        "Commands:\n" \
-        " -help              --- Prints this help \n" \
-        " -burn              --- Burn to flash\n" \
-        " -query             --- disaply the image info section from flash\n" \
-        " -read              --- read image from flash\n" \
-        " -read_formatted    --- read image from flash and display in formatted manner\n" \
-        " -erase             --- Erase the flash\n" \
-        " -debug             --- Prints debug messages\n" \
-        " -verify            --- Verify burning\n" \
-        " -force             --- Force burning even if it is unsafe\n" \
-        " -ignore_lock       --- Ignore flash lock mechanism\n" \
-        " -read_ids_to_file  --- Read the IDS section in the Flash, and write it to file\n" \
-        "\n" \
-        "Parameters:\n" \
-        " -bin binary_image_filename      --- The binary image filename to use\n" \
-        " -fw fw_ini_filename             --- The FW INI filename to use\n" \
-        " -ids ids_ini_filename           --- The IDs INI filename to use\n" \
-        " -production prod_ini_filename   --- The Production INI filename to use\n" \
-        " -board board_ini_filename       --- The board INI filename to use\n" \
-        " -board2 board_ini_filename      --- The board 2 INI filename to use\n" \
-        " -board3 board_ini_filename      --- The board 3 INI filename to use\n" \
-        " -setup_ini setup_ini_filename   --- The setup_ini INI filename to use\n" \
-        " -usb usb_ini_filename           --- The USB INI filename to use\n" \
-        " -interface interface_name       --- The interface to use\n" \
-        " -device device_type             --- The type of device\n" \
-        " -offset                         --- offset address\n" \
-        " -length                         --- Length (in bytes)\n" \
-        "\n" \
-        "Examples\n" \
-        "To burn FW INI file to flash using PCI on MARLON with ignore_loc\n" \
-        "   wiburn -erase -burn -fw fw.ini -interface wpci2l!malon -ignore_lock -device MARLO\n" \
-        "\n" \
-        "To burn FW INI file to binary image file out.bi\n" \
-        "   wiburn -burn -erase -fw fw.ini -interface out.bin -device MARLO\n" \
-        "\n" \
-        "To burn FW INI file to flash using automatically selected interfac\n" \
-        "   wiburn -burn -erase -fw fw.ini -device MARLO\n" \
-        "\n" \
-        "To read image from flash on Sparrow using Jtag\n" \
-        "   wiburn -read_formatted -length 0x80000 -offset 0 -interface wjtag0!sparrow -device SPARRO\n" \
-        "\n" \
-        "To burn IDS section to flash using JTAG\n" \
-        "   wiburn -section -ids ids_file.ini -interface wjtag0!sparrow -device SPARRO\n" \
-        "\n" \
-        "To erase the flash using JTA\n" \
-        "   wiburn -interface wjtag0!sparrow -erase -device SPARRO\n";
-}
diff --git a/debug-tools/wiburn/ParameterParser.h b/debug-tools/wiburn/ParameterParser.h
deleted file mode 100644
index 92f586a..0000000
--- a/debug-tools/wiburn/ParameterParser.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _PARAMETER_PARSER_H
-#define _PARAMETER_PARSER_H
-
-#include <iostream>
-#include <fstream>
-#include <stdlib.h>
-#include <string>
-#include <map>
-#include <list>
-#include <algorithm>
-
-using namespace std;
-
-class ParameterParser
-{
-    map<string, char*> Parameters;
-    map<string, bool> Flags;
-    list<string> flags;
-    list<string> params;
-
-public:
-    ParameterParser();
-    ~ParameterParser();
-
-    int processCommandArgs( int _argc, char **_argv );
-
-    char *getValue(string _option);
-    bool  getFlag(string _option);
-
-    void printUsage();
-
-    void printHelp();
-
-    void setVerbose();
-
-    void addFlag(string flag);
-    void addParam(string param);
-
-private:
-    int argc;
-    char **argv;
-
-    bool verbose;
-
-    void printVerbose( const char *INFO );
-    void printVerbose( char *INFO );
-    void printVerbose( char ch );
-    void printVerbose( );
-
-    bool IsFlag(string flag);
-    bool IsParam(string param);
-
-    bool ParamFound(string param);
-
-    bool FlagFound(string flag);
-};
-
-#endif /* ! _PARAMETER_PARSER_H */
diff --git a/debug-tools/wiburn/flash_image.cpp b/debug-tools/wiburn/flash_image.cpp
deleted file mode 100644
index 0b637e5..0000000
--- a/debug-tools/wiburn/flash_image.cpp
+++ /dev/null
@@ -1,762 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "flash_image.h"
-#include <memory.h>
-#include <iostream>
-
-
-//extern ini_parser g_parser;
-
-#define NEXT_PTR(ptr) (((ptr) & SUB_SECTOR_MASK) + SUB_SECTOR )
-
-u_int16_t crc_16 (const u_int32_t *buffer, int size)
-{
-    return 0;
-    u_int16_t      crc;
-    u_int32_t element;
-
-    crc = 0xffff;
-
-    for (int j = 0; j < size; j++) {
-        element = buffer[j];
-        for (int i=0; i<32; i++) {
-            if (crc & 0x8000) {
-                crc = (u_int16_t) ((((crc<<1) | (element>>31)) ^  0x100b) & 0xffff);
-            }
-            else {
-                crc= (u_int16_t) (((crc<<1) | (element>>31)) & 0xffff);
-            }
-            element = (element<<1) & 0xffffffff;
-        }
-    }
-
-    for (int k=0; k<16; k++) {
-        if (crc & 0x8000)
-            crc=((crc<<1)  ^  0x100b) & 0xffff;
-        else
-            crc=(crc<<1) & 0xffff;
-    }
-
-    // Revert 16 low bits
-    crc = crc ^ 0xffff;
-    return crc;
-}
-
-
-template <class PRODUCT>
-flash_image<PRODUCT>::flash_image () :
-    pointer_section ("pointer_section"),
-    hw_conf_section ("hw_conf_section", hw_conf_section_id, &pointer_section.m_pointers.hw_pointer),
-
-    fw1_code_section ("fw1_code_section", fw1_code_section_id, &pointer_section.m_pointers.fw1_pointer, &pointer_section.m_pointers.fw1_length),
-    fw1_data_section ("fw1_data_section",fw1_data_section_id, &pointer_section.m_pointers.fw1_data_pointer, &pointer_section.m_pointers.fw1_data_length),
-    fw1_static_conf_section ("fw1_static_conf_section",fw1_static_conf_section_id, &pointer_section.m_pointers.fw1_static_conf_pointer),
-
-    fw2_code_section ("fw2_code_section",fw2_code_section_id, &pointer_section.m_pointers.fw2_pointer, &pointer_section.m_pointers.fw2_length),
-    fw2_data_section ("fw2_data_section",fw2_data_section_id, &pointer_section.m_pointers.fw2_data_pointer, &pointer_section.m_pointers.fw2_data_length),
-    fw2_static_conf_section ( "fw2_static_conf_section",fw2_static_conf_section_id, &pointer_section.m_pointers.fw2_static_conf_pointer),
-
-    system_config_section ( "config_section", &pointer_section.m_pointers.config_section_pointer),
-
-    production_section ("production_section",production_section_id, &pointer_section.m_pointers.production_pointer),
-    user_conf_section ("user_conf_section",user_conf_section_id, &pointer_section.m_pointers.user_pointer),
-
-    image_info_section ("image_info_section",image_info_section_id, &pointer_section.m_pointers.image_info_pointer),
-    ids_section("ids_section", ids_section_id, &pointer_section.m_pointers.ids_pointer),
-
-    usb_section("usb_section", &pointer_section.m_pointers.usb_pointer),
-    usb_info_section("usb_info_section", usb_info_section_id, &pointer_section.m_pointers.usb_info_pointer),
-
-    radio_tx_conf_section ("radio_tx_conf_section", radio_tx_conf_section_id, &pointer_section.m_pointers.radio_tx_cnf_pointer),
-    radio_rx_conf_section ("radio_rx_conf_section", radio_rx_conf_section_id, &pointer_section.m_pointers.radio_rx_cnf_pointer),
-    radio_tx_conf2_section ("radio_tx_conf2_section", radio_tx_conf2_section_id, &pointer_section.m_pointers.radio_tx_cnf2_pointer),
-    radio_rx_conf2_section ("radio_rx_conf2_section", radio_rx_conf2_section_id, &pointer_section.m_pointers.radio_rx_cnf2_pointer),
-
-    // The following is unused!
-    raw_data_section ("raw_data_section", raw_data_section_id, &pointer_section.m_pointers.raw_data_pointer, &pointer_section.m_pointers.raw_data_length),
-    proxy_product(NULL)
-{
-
-	m_imageSize = 1024 * 512;
-
-	if (PRODUCT::id == talyn::id)
-	{
-		m_imageSize = 1024 * 4 * 512;
-	}
-	else if ((PRODUCT::id == sparrow::id))
-	{
-		m_imageSize = 1024 * 512;
-	}
-
-	m_image = new BYTE[m_imageSize];
-	if (NULL != m_image)
-	{
-		return;
-	}
-
-    //    proxy_product = new PRODUCT;
-    memset(m_image, -1, m_imageSize);
-}
-
-template <class PRODUCT>
-flash_image<PRODUCT>::~flash_image ()
-{
-	delete[] m_image;
-}
-
-template <class PRODUCT>
-const BYTE* flash_image<PRODUCT>::get_image (void) const
-{
-    return m_image;
-}
-
-template <class PRODUCT>
-u_int32_t flash_image<PRODUCT>::get_image_size (void) const
-{
-    return m_imageSize;
-}
-
-template <class PRODUCT>
-void flash_image<PRODUCT>::init( const char *filename)
-{
-    FILE *stream;
-    stream = fopen(filename, "r");
-    if( NULL == stream  )
-    {
-        ERR("Failed opening file %s for reading\n", filename);
-        EXIT (-1);
-    }
-
-    u_int32_t cnt = fread(m_image, sizeof m_image, 1, stream);
-    if (cnt < sizeof m_image) {
-        INFO("Initialized from partial image file of size 0x%04x\n", cnt);
-    }
-    fclose(stream);
-}
-
-template <class PRODUCT>
-void flash_image<PRODUCT>::init_pointer_section (flash_base *fl)
-{
-    pointer_section.init(fl);
-
-    // In order to prevent reading from the flash over the signature
-    // when the flash is un-initiated, we reset the signature
-    // after reading from flash.
-    pointer_section.m_pointers.signature = 0x40;
-}
-
-template <class PRODUCT>
-void flash_image<PRODUCT>::init_hw_conf_section (flash_base *fl)
-{
-    hw_conf_section.init(fl);
-}
-
-// template <class PRODUCT>
-// void flash_image<PRODUCT>::init_radio_tx_conf_section (flash_base *fl)
-// {
-//     radio_tx_conf_section.init(fl);
-// }
-//
-// template <class PRODUCT>
-// void flash_image<PRODUCT>::init_radio_rx_conf_section (flash_base *fl)
-// {
-//     radio_rx_conf_section.init(fl);
-// }
-//
-// template <class PRODUCT>
-// void flash_image<PRODUCT>::init_radio_tx_conf2_section (flash_base *fl)
-// {
-//     radio_tx_conf2_section.init(fl);
-// }
-//
-// template <class PRODUCT>
-// void flash_image<PRODUCT>::init_radio_rx_conf2_section (flash_base *fl)
-// {
-//     radio_rx_conf2_section.init(fl);
-// }
-
-template <class PRODUCT>
-void flash_image<PRODUCT>::init_image_info_section (flash_base *fl)
-{
-    image_info_section.init(fl);
-}
-
-template <class PRODUCT>
-void flash_image<PRODUCT>::init_ids_section (flash_base *fl, bool isReduced)
-{
-    if (isReduced)
-    {
-        *ids_section.m_ptr = 4 * 1024 + sizeof(section_header_t);
-    }
-    else
-    {
-        *ids_section.m_ptr = 44 * 1024 + sizeof(section_header_t);
-    }
-
-    ids_section.init(fl);
-}
-
-template <class PRODUCT>
-void flash_image<PRODUCT>::init_usb_info_section (flash_base *fl)
-{
-    usb_info_section.init(fl);
-}
-
-template <class PRODUCT>
-const pointer_section_t<PRODUCT>& flash_image<PRODUCT>::get_pointer_section(void) const
-{
-    return pointer_section;
-}
-
-template <class PRODUCT>
-const hw_section_t<PRODUCT>& flash_image<PRODUCT>::get_hw_conf_section(void) const
-{
-    return hw_conf_section;
-}
-
-// template <class PRODUCT>
-// const hw_section_t<marlon>& flash_image<PRODUCT>::get_radio_tx_conf_section(void) const
-// {
-//     return radio_tx_conf_section;
-// }
-//
-// template <class PRODUCT>
-// const hw_section_t<marlon>& flash_image<PRODUCT>::get_radio_rx_conf_section(void) const
-// {
-//     return radio_rx_conf_section;
-// }
-//
-// template <class PRODUCT>
-// const hw_section_t<marlon>& flash_image<PRODUCT>::get_radio_tx_conf2_section(void) const
-// {
-//     return radio_tx_conf2_section;
-// }
-//
-// template <class PRODUCT>
-// const hw_section_t<marlon>& flash_image<PRODUCT>::get_radio_rx_conf2_section(void) const
-// {
-//     return radio_rx_conf2_section;
-// }
-
-template <class PRODUCT>
-const image_info_section_t<PRODUCT>& flash_image<PRODUCT>::get_image_info_section(void) const
-{
-    return image_info_section;
-}
-
-template <class PRODUCT>
-const usb_info_section_t<PRODUCT>& flash_image<PRODUCT>::get_usb_info_section(void) const
-{
-    return usb_info_section;
-}
-
-template <class PRODUCT>
-const ids_section_t<PRODUCT>& flash_image<PRODUCT>::get_ids_section(void) const
-{
-    return ids_section;
-}
-
-
-// template <class PRODUCT>
-// const image_section_t<PRODUCT>& flash_image<PRODUCT>::get_fw1_code_section () const
-// {
-//     return fw1_code_section;
-// }
-//
-// template <class PRODUCT>
-// const image_section_t<PRODUCT>& flash_image<PRODUCT>::get_fw2_code_section () const
-// {
-//     return fw2_code_section;
-// }
-
-template <class PRODUCT>
-void flash_image<PRODUCT>::save( const char *filename)
-{
-    FILE *stream;
-    stream = fopen(filename, "wb");
-    if( NULL == stream  )
-    {
-        ERR("Failed opening file %s for writing\n", filename);
-        EXIT (-1);
-    }
-
-    fwrite(m_image, sizeof m_image, 1, stream);
-    fclose(stream);
-}
-
-/*
-        MARLON:                                                            SPARROW:                                               SPARROW REDUCED:
-        +-------------------------------------------+   0k                +-------------------------------------------+   0k       +-------------------------------------------+  0k
-        |    POINTER                                |                     |    POINTER                                |            |    POINTER                                |
-        +-------------------------------------------+   4k                +-------------------------------------------+   4k       +-------------------------------------------+  4k
-        |    production         (40K)               |                     |    production        (40K)                |            |    IDS                (4K)                |
-        +-------------------------------------------+  48k                +-------------------------------------------+  48k       +-------------------------------------------+
-        |    IDS                (4K)                |                     |    IDS                (4K)                |            +-------------------------------------------+  8k
-        +-------------------------------------------+                     +-------------------------------------------+            |    HW                (4k)                 |
-        +-------------------------------------------+  52k                +-------------------------------------------+  52k       +-------------------------------------------+  12k
-        |    HW                 (4k)                |                     |    HW                (4k)                 |            |    FW CODE            (44K)               |
-        +-------------------------------------------+  56k                +-------------------------------------------+  56k       +-------------------------------------------+  56k
-        |    FW CODE            (256K)              |                     |    FW CODE            (256K)              |            |    FW DATA            (8K)                |
-        +-------------------------------------------+  312k               +-------------------------------------------+  312k      +-------------------------------------------+  64k
-        |    FW DATA            (32K)               |                     |    FW DATA            (32K)               |
-        +-------------------------------------------+  344k               +-------------------------------------------+  344k
-        |    uCode CODE         (64K)               |                     |    uCode CODE        (128K)               |
-        +-------------------------------------------+  408k               +-------------------------------------------+  472k
-        |    uCode DATA         (8K)                |                     |    uCode DATA         (8K)                |
-        +-------------------------------------------+  416k               +-------------------------------------------+  480k
-        |    FW STATICS         (4K)                |                     |    FW STATICS        (4K)                 |
-        +-------------------------------------------+  420k               +-------------------------------------------+  484k
-        |    uCode STATICS      (4K)                |                     |    uCode STATICS    (4K)                  |
-        +-------------------------------------------+                     +-------------------------------------------+
-        +-------------------------------------------+  424k               +-------------------------------------------+  488k
-        |    System Config Selector    (4K)         |                     |    System Config Selector    (4K)         |
-        +-------------------------------------------+  428k               +-------------------------------------------+  492k
-        |    System Config Factory    (4K)          |                     |    System Config Factory    (4K)          |
-        +-------------------------------------------+  432k               +-------------------------------------------+  496k
-        |    System Config User1        (4K)        |                     |    System Config User1        (4K)        |
-        +-------------------------------------------+  436k               +-------------------------------------------+  500k
-        |    System Config User2        (4K)        |                     |    System Config User2        (4K)        |
-        +-------------------------------------------+                     +-------------------------------------------+
-        +-------------------------------------------+  440k               +-------------------------------------------+  504k
-        |    IMAGE INFO        (4K)                 |                     |    IMAGE INFO        (4K)                 |
-        |            image format version           |                     |            image format version           |
-        |            FW VERSION                     |                     |            FW VERSION                     |
-        |            fw_timestamp                   |                     |            fw_timestamp                   |
-        |            ucode_version                  |                     |            ucode_version                  |
-        |            ucode_timestamp                |                     |            ucode_timestamp                |
-        |            configuration_id               |                     |            configuration_id               |
-        |            device_id                      |                     |            device_id                      |
-        |            hw_id                          |                     |            hw_id                          |
-        +-------------------------------------------+  444k               +-------------------------------------------+  508k
-        |    radio_tx_conf    (8K)                  |
-        +-------------------------------------------+  452k
-        |    radio_rx_conf    (8K)                  |
-        +-------------------------------------------+  460k
-        |    radio_tx_conf2    (8K)                 |
-        +-------------------------------------------+  468k
-        |    radio_rx_conf2    (8K)                 |
-        +-------------------------------------------+  476k
-        |    RAW DATA        (4K)                   |
-        +-------------------------------------------+  480k
-*/
-template <class PRODUCT>
-void flash_image<PRODUCT>::init(ini_parser_base *parser, bool full_image, bool isReducedSip)
-{
-	ini_file_t::iterator iter1;
-	ini_file_t::const_iterator iter2;
-	int ptr;
-	ptr = NEXT_PTR( 0 );
-	string section_name;
-	bool reducedSip = isReducedSip && ((PRODUCT::id == sparrow::id) || (PRODUCT::id == talyn::id));
-
-    if (!reducedSip)
-    {
-        section_name = "production";
-        if (parser->get_section(section_name, 0, &iter1, false, false) )
-        {
-            production_section.set_max_size( flash::SUB_SECTOR_SIZE * 10 );
-            production_section.handle_ini_section(0, *(iter1->second));
-            production_section.set_offset( ptr );
-            production_section.write_to_buffer(m_image);
-        }
-
-        //Force the section size to be 40K
-        ptr += NEXT_PTR( (1<<15) -1 );        // 32K
-        ptr += NEXT_PTR( (1<<13) -1 );        //  8K
-    }
-
-    section_name = "ids";
-
-    // Always set ids section. The existing values remain if input file is not provided
-    ids_section.set_max_size( flash::SUB_SECTOR_SIZE );
-    if (parser->get_section(section_name, 0, &iter1, true, false))
-    {
-        ids_section.handle_ini_section( *(iter1->second));
-    }
-
-    ids_section.set_offset( ptr );
-    ids_section.write_to_buffer(m_image);
-
-    ptr += NEXT_PTR( 0 );
-
-    section_name = "hw_config";
-    if (parser->get_section(section_name, TRANSLATION_MAP_REGTREE, &iter1, false, full_image))
-    {
-        hw_conf_section.set_max_size( flash::SUB_SECTOR_SIZE );
-        hw_conf_section.handle_ini_section(TRANSLATION_MAP_REGTREE, *(iter1->second));
-        hw_conf_section.set_offset( ptr );
-        hw_conf_section.write_to_buffer(m_image);
-    }
-    ptr += NEXT_PTR( 0 );
-
-    section_name = "fw_code";
-    if (parser->get_section(section_name, 0, &iter1, false, full_image))
-    {
-        if (reducedSip)
-        {
-            fw1_code_section.set_max_size( flash::SUB_SECTOR_SIZE * 11);
-        }
-        else
-        {
-            // FW code limit to 256K
-#ifdef FLASH_256KB
-            fw1_code_section.set_max_size( flash::SUB_SECTOR_SIZE * 16);
-#else
-			if (PRODUCT::id == sparrow::id)
-			{
-				fw1_code_section.set_max_size( flash::SUB_SECTOR_SIZE * 64);
-			}
-			else if (PRODUCT::id == talyn::id)
-			{
-				fw1_code_section.set_max_size( flash::SUB_SECTOR_SIZE * 256);
-			}
-			else
-			{
-				fw1_code_section.set_max_size( flash::SUB_SECTOR_SIZE * 64);
-			}
-#endif
-        }
-
-        fw1_code_section.handle_ini_section( *(iter1->second));
-        fw1_code_section.set_offset( ptr );
-        fw1_code_section.write_to_buffer(m_image);
-    }
-
-    if (reducedSip)
-    {
-        ptr += NEXT_PTR( (0xB000) -1 ); //Force the Code size to be 44K (including header+CRC)
-    }
-    else
-    {
-#ifdef FLASH_256KB
-        ptr += NEXT_PTR( (1<<16) -1 ); //Force the Code size to be 64K (including header+CRC)
-#else
-		if (PRODUCT::id == sparrow::id)
-		{
-			ptr += NEXT_PTR( (1<<18) -1 ); //Force the Code size to be 256K (including header+CRC)
-		}
-		else if (PRODUCT::id == talyn::id)
-		{
-			ptr += NEXT_PTR( (1<<20) -1 ); //Force the Code size to be 1M (including header+CRC)
-		}
-		else
-		{
-			ptr += NEXT_PTR( (1<<18) -1 ); //Force the Code size to be 256K (including header+CRC)
-		}
-#endif
-    }
-
-	section_name = "fw_data";
-	if (parser->get_section(section_name, 0, &iter1, false, full_image))
-	{
-		if (reducedSip)
-		{
-				// FW data limit to 8K
-				fw1_data_section.set_max_size( flash::SUB_SECTOR_SIZE * 2 );
-		}
-		else
-		{
-			if (PRODUCT::id == sparrow::id)
-			{
-				// FW data limit to 32K
-				fw1_data_section.set_max_size( flash::SUB_SECTOR_SIZE * 8 );
-			}
-			else if (PRODUCT::id == talyn::id)
-			{
-				// FW data limit to 128K
-				fw1_data_section.set_max_size( flash::SUB_SECTOR_SIZE * 32 );
-			}
-			else
-			{
-				// FW data limit to 32K
-				fw1_data_section.set_max_size( flash::SUB_SECTOR_SIZE * 8 );
-			}
-		}
-		fw1_data_section.handle_ini_section( *(iter1->second));
-		fw1_data_section.set_offset( ptr );
-		fw1_data_section.write_to_buffer(m_image);
-	}
-	if (reducedSip)
-	{
-		ptr += NEXT_PTR( (1<<13) -1 ); //Force the Data size to be 8K (including header+CRC)
-	}
-	else
-	{
-		ptr += NEXT_PTR( (1<<15) -1 ); //Force the Data size to be 32K (including header+CRC)
-	}
-
-	if (!reducedSip)
-	{
-		section_name = "ucode_code";
-		if (parser->get_section(section_name, 0, &iter1, false, full_image))
-		{
-			if (PRODUCT::id == sparrow::id)
-			{
-				// ucode code limit to 128K - Sparrow
-				fw2_code_section.set_max_size( flash::SUB_SECTOR_SIZE * 32 );
-			}
-			else if (PRODUCT::id == talyn::id)
-			{
-				// ucode code limit to 256K - Talyn
-				fw2_code_section.set_max_size( flash::SUB_SECTOR_SIZE * 64 );
-			}
-			else
-			{
-				// ucode code limit to 64K - Marlon, default
-				fw2_code_section.set_max_size( flash::SUB_SECTOR_SIZE * 16 );
-			}
-
-            fw2_code_section.handle_ini_section( *(iter1->second));
-            fw2_code_section.set_offset( ptr );
-            fw2_code_section.write_to_buffer(m_image);
-        }
-
-		if (PRODUCT::id == sparrow::id)
-		{
-			ptr += NEXT_PTR( (1<<17) -1 ); //Force the Code size to be 128K - Sparrow (including header+CRC)
-		}
-		else if (PRODUCT::id == talyn::id)
-		{
-			ptr += NEXT_PTR( (1<<18) -1 ); //Force the Code size to be 256K - Talyn (including header+CRC)
-		}
-		else
-		{
-			ptr += NEXT_PTR( (1<<16) -1 ); //Force the Code size to be 64K - Marlon, default (including header+CRC)
-		}
-
-		section_name = "ucode_data";
-		if (parser->get_section(section_name, 0, &iter1, false, full_image))
-		{
-			if (PRODUCT::id == sparrow::id)
-			{
-				// ucode data limit to 16K
-				fw2_data_section.set_max_size( flash::SUB_SECTOR_SIZE * 4);
-			}
-			else if (PRODUCT::id == talyn::id)
-			{
-				// ucode data limit to 32K
-				fw2_data_section.set_max_size( flash::SUB_SECTOR_SIZE * 8);
-			}
-			else
-			{
-				// ucode data limit to 8K
-				fw2_data_section.set_max_size( flash::SUB_SECTOR_SIZE * 2);
-			}
-
-			fw2_data_section.handle_ini_section( *(iter1->second));
-			fw2_data_section.set_offset( ptr );
-			fw2_data_section.write_to_buffer(m_image);
-		}
-		//ptr += NEXT_PTR( 0 );
-		ptr += NEXT_PTR( (1<<13) -1 );
-
-		section_name = "fw_static";
-		if (full_image) {
-			if (parser->get_section(section_name, TRANSLATION_MAP_REGTREE | TRANSLATION_MAP_FW, &iter1, false, full_image))
-			{
-				fw1_static_conf_section.set_max_size( flash::SUB_SECTOR_SIZE );
-				fw1_static_conf_section.handle_ini_section(TRANSLATION_MAP_REGTREE | TRANSLATION_MAP_FW, *(iter1->second));
-				fw1_static_conf_section.set_offset( ptr );
-				fw1_static_conf_section.write_to_buffer(m_image);
-			}
-			else
-			{
-				//ERR("Could not find mandatory section %s\n", section_name.c_str() );
-				//EXIT (-1);
-			}
-		}
-		ptr += NEXT_PTR( 0 );
-
-        if (full_image) {
-            section_name = "ucode_static";
-            if (parser->get_section(section_name, TRANSLATION_MAP_REGTREE | TRANSLATION_MAP_UCODE, &iter1, false, full_image))
-            {
-                fw2_static_conf_section.set_max_size( flash::SUB_SECTOR_SIZE );
-                fw2_static_conf_section.handle_ini_section(TRANSLATION_MAP_REGTREE | TRANSLATION_MAP_UCODE, *(iter1->second));
-                fw2_static_conf_section.set_offset( ptr );
-                fw2_static_conf_section.write_to_buffer(m_image);
-            }else{
-                //ERR("Could not find mandatory section %s\n", section_name.c_str() );
-                //EXIT (-1);
-            }
-        }
-        ptr += NEXT_PTR( 0 );
-
-        section_name = "system_config_section";
-        system_config_section.set_max_size( flash::SUB_SECTOR_SIZE * 4 );
-        if (full_image) {
-            system_config_section.set_offset( ptr );
-            system_config_section.write_to_buffer(m_image);
-        }
-
-        ptr += NEXT_PTR( (1<<14) -1 );
-
-        /*section_name = "user";
-          if (parser->get_section(section_name, TRANSLATION_MAP_REGTREE | TRANSLATION_MAP_FW, &iter1, false, full_image))
-          {
-          user_conf_section.set_max_size( flash::SUB_SECTOR_SIZE );
-          user_conf_section.handle_ini_section(TRANSLATION_MAP_REGTREE | TRANSLATION_MAP_FW, *(iter1->second));
-          user_conf_section.set_offset( ptr );
-          user_conf_section.write_to_buffer(m_image);
-          }
-          ptr += NEXT_PTR( 0 ); */
-
-        bool image_info_section_exist = false;
-        section_name = "image_format_version";
-        if (parser->get_section(section_name, 0, &iter1, true, full_image))
-        {
-            image_info_section.set_max_size( flash::SUB_SECTOR_SIZE );
-            image_info_section.handle_ini_section( *(iter1->second), section_name);
-            image_info_section_exist = true;
-        }
-
-        section_name = "fw_version";
-        if (parser->get_section(section_name, 0, &iter1, true, full_image))
-        {
-            image_info_section.handle_ini_section( *(iter1->second), section_name);
-            image_info_section_exist = true;
-        }
-
-        section_name = "fw_timestamp";
-        if (parser->get_section(section_name, 0, &iter1, true, full_image))
-        {
-            image_info_section.handle_ini_section( *(iter1->second), section_name);
-            image_info_section_exist = true;
-        }
-
-        section_name = "ucode_version";
-        if (parser->get_section(section_name, 0, &iter1, true, full_image))
-        {
-            image_info_section.handle_ini_section( *(iter1->second), section_name);
-            image_info_section_exist = true;
-        }
-
-        section_name = "ucode_timestamp";
-        if (parser->get_section(section_name, 0, &iter1, true, full_image))
-        {
-            image_info_section.handle_ini_section( *(iter1->second), section_name);
-            image_info_section_exist = true;
-        }
-
-        section_name = "configuration_id";
-        if (parser->get_section(section_name, 0, &iter1, true, full_image))
-        {
-            image_info_section.handle_ini_section( *(iter1->second), section_name);
-            image_info_section_exist = true;
-        }
-
-        section_name = "device_id";
-        if (parser->get_section(section_name, 0, &iter1, true, full_image))
-        {
-            image_info_section.handle_ini_section( *(iter1->second), section_name);
-            image_info_section_exist = true;
-        }
-
-        section_name = "hw_id";
-        if (parser->get_section(section_name, 0, &iter1, true, full_image))
-        {
-            image_info_section.handle_ini_section( *(iter1->second), section_name);
-            image_info_section_exist = true;
-        }
-
-        if ( image_info_section_exist ) {
-            image_info_section.set_offset( ptr );
-            image_info_section.write_to_buffer(m_image);
-        }
-        ptr += NEXT_PTR( 0 );
-
-        if (PRODUCT::id == marlon::id) {
-
-            section_name = "radio_tx_conf";
-            if (parser->get_section(section_name, 0, &iter1, false, false) )
-            {
-                //        parser->update_section(iter1->second, *(iter2->second), false);
-                radio_tx_conf_section.set_max_size( flash::SUB_SECTOR_SIZE * 2);
-                radio_tx_conf_section.handle_ini_section(0, *(iter1->second));
-                radio_tx_conf_section.set_offset( ptr );
-                radio_tx_conf_section.write_to_buffer(m_image);
-            }
-
-            ptr += NEXT_PTR( (1<<13) -1 ); //Force the section size to be 8K
-            section_name = "radio_rx_conf";
-            if (parser->get_section(section_name, 0, &iter1, false, false) )
-            {
-                //        parser->update_section(iter1->second, *(iter2->second), false);
-                radio_rx_conf_section.set_max_size( flash::SUB_SECTOR_SIZE * 2);
-                radio_rx_conf_section.handle_ini_section(0, *(iter1->second));
-                radio_rx_conf_section.set_offset( ptr );
-                radio_rx_conf_section.write_to_buffer(m_image);
-            }
-
-            ptr += NEXT_PTR( (1<<13) -1 ); //Force the section size to be 8K
-            section_name = "radio_tx_conf2";
-            if (parser->get_section(section_name, 0, &iter1, false, false) )
-            {
-                //        parser->update_section(iter1->second, *(iter2->second), false);
-                radio_tx_conf2_section.set_max_size( flash::SUB_SECTOR_SIZE * 2);
-                radio_tx_conf2_section.handle_ini_section(0, *(iter1->second));
-                radio_tx_conf2_section.set_offset( ptr );
-                radio_tx_conf2_section.write_to_buffer(m_image);
-            }
-
-            ptr += NEXT_PTR( (1<<13) -1 ); //Force the section size to be 8K
-            section_name = "radio_rx_conf2";
-            if (parser->get_section(section_name, 0, &iter1, false, false) )
-            {
-                //        parser->update_section(iter1->second, *(iter2->second), false);
-                radio_rx_conf2_section.set_max_size( flash::SUB_SECTOR_SIZE * 2);
-                radio_rx_conf2_section.handle_ini_section(0, *(iter1->second));
-                radio_rx_conf2_section.set_offset( ptr );
-                radio_rx_conf2_section.write_to_buffer(m_image);
-            }
-
-            ptr += NEXT_PTR( (1<<13) -1 ); //Force the section size to be 8K
-        }
-        section_name = "raw_data";
-        if (parser->get_section(section_name, 0, &iter1, false, false) )
-        {
-            // data_raw limit to 4K
-            raw_data_section.set_max_size( flash::SUB_SECTOR_SIZE);
-            raw_data_section.handle_ini_section( *(iter1->second));
-            raw_data_section.set_offset( ptr );
-            raw_data_section.write_to_buffer(m_image);
-
-        }
-
-    }
-
-    // At the end write the pointer section
-    pointer_section.set_offset( 0 );
-
-    if (full_image)
-        pointer_section.write_to_buffer(m_image);
-
-}
-
diff --git a/debug-tools/wiburn/flash_image.h b/debug-tools/wiburn/flash_image.h
deleted file mode 100644
index a013e16..0000000
--- a/debug-tools/wiburn/flash_image.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _FLASH_IMAGE_H_
-#define _FLASH_IMAGE_H_
-
-#include "wiburn.h"
-#include "flash_sections.h"
-#include "ini_parser.h"
-#include "product.h"
-
-u_int16_t crc_16 (const u_int32_t *buffer, int size);
-
-template <class PRODUCT>
-class flash_image
-{
-public:
-    flash_image ();
-    ~flash_image ();
-    void init (ini_parser_base *parser, bool full_image, bool isReducedSip); // init from ini file
-    void init (const char *filename); // init from image file
-    void init_pointer_section (flash_base *fl); // init from flash
-    void init_hw_conf_section (flash_base *fl); // init from flash
-    //    void init_radio_tx_conf_section (flash_base *fl); // init from flash
-    //    void init_radio_rx_conf_section (flash_base *fl); // init from flash
-    //    void init_radio_tx_conf2_section (flash_base *fl); // init from flash
-    //    void init_radio_rx_conf2_section (flash_base *fl); // init from flash
-    void init_image_info_section (flash_base *fl); // init from flash
-    void init_ids_section (flash_base *fl, bool isReduced); // init from flash
-    void init_usb_info_section (flash_base *fl); // init from flash
-    void save (const char *filename);
-    const BYTE* get_image (void) const;
-    u_int32_t get_image_size (void) const;
-    const pointer_section_t <PRODUCT> & get_pointer_section(void) const;
-    const hw_section_t <PRODUCT> & get_hw_conf_section(void) const;
-    //    const hw_section_t <marlon> & get_radio_tx_conf_section(void) const;
-    //    const hw_section_t <marlon> & get_radio_rx_conf_section(void) const;
-    //    const hw_section_t <marlon> & get_radio_tx_conf2_section(void) const;
-    //    const hw_section_t <marlon> & get_radio_rx_conf2_section(void) const;
-    const image_info_section_t<PRODUCT>& get_image_info_section(void) const;
-    const usb_info_section_t<PRODUCT>& get_usb_info_section(void) const;
-    const ids_section_t<PRODUCT>& get_ids_section(void) const;
-    //    const image_section_t<PRODUCT>& get_fw1_code_section () const;
-    //    const image_section_t<PRODUCT>& get_fw2_code_section () const;
-private:
-    pointer_section_t <PRODUCT>         pointer_section;
-    hw_section_t <PRODUCT>              hw_conf_section;
-
-    image_section_t<PRODUCT>            fw1_code_section;
-    image_section_t<PRODUCT>            fw1_data_section;
-    fw_section_t <PRODUCT>              fw1_static_conf_section;
-
-    image_section_t<PRODUCT>            fw2_code_section;
-    image_section_t<PRODUCT>            fw2_data_section;
-    fw_section_t <PRODUCT>              fw2_static_conf_section;
-
-    system_config_section_t <PRODUCT>   system_config_section;
-
-    hw_section_t <PRODUCT>              production_section;
-    fw_section_t <PRODUCT>              user_conf_section;
-
-    image_info_section_t<PRODUCT>       image_info_section;
-    ids_section_t<PRODUCT>              ids_section;
-
-    usb_section_t                       usb_section;
-    usb_info_section_t<PRODUCT>         usb_info_section;
-
-    hw_section_t <marlon> radio_tx_conf_section;
-    hw_section_t <marlon> radio_rx_conf_section;
-    hw_section_t <marlon> radio_tx_conf2_section;
-    hw_section_t <marlon> radio_rx_conf2_section;
-
-    image_section_t<PRODUCT> raw_data_section;
-
-    IProduct* proxy_product;
-
-private:
-#ifdef FLASH_256KB
-    BYTE m_image [(1<<21)/8]; //2Mbits - 256KB
-#else
-	BYTE* m_image;
-	int m_imageSize;
-#endif
-};
-
-#endif //#ifndef _FLASH_IMAGE_H_
diff --git a/debug-tools/wiburn/flash_sections.cpp b/debug-tools/wiburn/flash_sections.cpp
deleted file mode 100644
index 13e5566..0000000
--- a/debug-tools/wiburn/flash_sections.cpp
+++ /dev/null
@@ -1,1393 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "flash_sections.h"
-#include "ini_parser.h"
-#include "flash_image.h"
-#include <fstream>
-#include <iostream>
-#include <iomanip>
-
-//extern class ini_parser g_parser;
-//extern ini_parser g_parser;
-
-u_int64_t current_fw_build = 999999;
-
-void format_version_tag_t::disp(const char *name)
-{
-    printf("%s : %d\n", name, format_version);
-}
-
-void version_tag_t::disp(const char *name)
-{
-    printf("%s : %02d.%02d.%02d.%02d\n",name, major, minor, sub_minor, build);
-}
-
-void timestamp_tag_t::disp(const char *name)
-{
-    printf("%s (D/M/Y H:M:S) : %02d/%02d/%04d %02d:%02d:%02d\n"
-           ,name, day, month, year, hour, min, sec );
-}
-
-void configuration_id_tag_t::disp(const char *name)
-{
-    //unused param
-    (void)name;
-    BYTE *null_terminated_buffer = new BYTE [sizeof (id) + 1];
-    if (!null_terminated_buffer)
-    {
-        return;
-    }
-
-    memcpy(null_terminated_buffer, id, sizeof (id));
-    null_terminated_buffer[sizeof (id)] = 0;
-    printf("CONFIGURATION_ID = %s\n", null_terminated_buffer);
-    delete[] null_terminated_buffer;
-
-    //printf("CONFIGURATION_ID = ");
-    //print_buffer(id, sizeof id);
-    //printf("\n");
-}
-
-void device_id_tag_t::disp(const char *name)
-{
-    //unused param
-    (void)name;
-    cout << "device_id :" << endl;
-    cout << " device_id = " << (int)device_id << endl;
-    cout << " revision_id = " << (int)revision_id << endl;
-    cout << " misc = " << (int)misc << endl;
-}
-
-void hw_id_tag_t::disp(const char *name)
-{
-    //unused param
-    (void)name;
-    cout << "hw_id :" << endl;
-    cout << " digital_soc_id = " << (int)digital_soc_id << endl;
-    cout << " board_id = " << (int)board_id<< endl;
-    cout << " antenna_id = " << (int)antenna_id<< endl;
-    cout << " rf_id = " << (int)rf_id<< endl;
-    cout << " serial_id = " << (int)serial_id<< endl;
-}
-
-void end_tag_t::disp(const char *name)
-{
-    //unused param
-    (void)name;
-}
-
-//
-// TAG
-//
-tag_base_t::tag_base_t (BYTE id, const char *name)
-{
-    m_header.reserved = 0;
-    m_header.tag_id = id;
-    this->m_name = name;
-}
-
-template <typename Tag>
-tag_t <Tag> ::tag_t (BYTE id, const char* name)
-    :tag_base_t(id, name)
-{
-    m_header.tag_size = sizeof(Tag);
-    memset(&m_tag, 0, sizeof(Tag));
-}
-
-template <typename Tag>
-char *tag_t <Tag>::get_tag()
-{
-    return (char*)&m_tag;
-};
-
-template <typename Tag>
-void tag_t<Tag>::disp()
-{
-    m_tag.disp(this->m_name);
-}
-
-
-//
-// FLASH section
-//
-flash_section::flash_section (const char *name)
-{
-    this->m_name = name;
-    this->m_size = 0;
-    m_offset = 0;
-    this->m_crc = 0;
-    this->m_max_size = 0;
-}
-
-int flash_section::size () const
-{
-    return this->m_size;
-}
-
-int flash_section::get_max_size () const
-{
-    return this->m_max_size;
-}
-
-void flash_section::set_max_size ( u_int32_t max_size ) {
-    this->m_max_size = max_size;
-}
-
-void flash_section::set_offset( u_int32_t offset )
-{
-    m_offset = offset;
-}
-
-u_int32_t flash_section::get_offset () const
-{
-    return m_offset;
-}
-
-//
-// POINTER section
-//
-template <class PRODUCT>
-pointer_section_t<PRODUCT>::pointer_section_t (const char *name)
-    : flash_section(name)
-{
-    memset(&m_pointers, -1, sizeof (m_pointers));
-    m_pointers.signature = 0x40;
-    this->m_size = sizeof (m_pointers);
-}
-
-template <class PRODUCT>
-void pointer_section_t<PRODUCT>::init (flash_base *fl)
-{
-    fl->read(0, this->m_size, (BYTE*)&m_pointers);
-}
-
-template <class PRODUCT>
-bool pointer_section_t<PRODUCT>::operator == (const pointer_section_t <PRODUCT> &r_side) const
-{
-    int res = memcmp(&m_pointers, &(r_side.m_pointers), sizeof (m_pointers));
-    return (res == 0);
-}
-
-template <class PRODUCT>
-void pointer_section_t<PRODUCT>::write_to_buffer( BYTE *buffer )
-{
-    INFO("%s: Writing section of size 0x%04x at offset 0x%04x\n",this->m_name, this->m_size, m_offset);
-    int current_offset = m_offset;
-    memcpy(buffer + current_offset, &m_pointers, sizeof (m_pointers));
-    current_offset += sizeof (m_pointers);
-
-//   this->m_crc = crc_16((u_int32_t*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    this->m_crc = m_CalcCRC.CalcCRC((UCHAR*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    memcpy(buffer+current_offset, &this->m_crc, sizeof (this->m_crc));
-}
-
-//
-// ID section
-//
-//id_section::id_section (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t* ptr_high)
-id_section::id_section (const char *name, BYTE id, ADDRESS32 *ptr)
-    : flash_section(name)
-{
-    this->header.reserved = 0;
-    this->header.section_id = id;
-//   m_ptr_low = ptr_low;
-//   m_ptr_high = ptr_high;
-    this->m_ptr = ptr;
-    this->m_size = sizeof(section_header_t);
-};
-
-void id_section::set_offset (int offset)
-{
-    flash_section::set_offset(offset);
-    offset += sizeof(section_header_t);
-    //*m_ptr_low = (u_int16_t)offset;
-    //*m_ptr_high = (u_int16_t)(offset>>16);
-    *this->m_ptr = offset;
-}
-
-//
-// VARIABLE section
-//variable_section_t::variable_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t* ptr_high)
-//: id_section( name, id, ptr_low, ptr_high)
-variable_section_t::variable_section_t (const char *name, BYTE id, ADDRESS32* ptr)
-    : id_section( name, id, ptr)
-{
-    //nothing to do
-}
-
-variable_section_t::~variable_section_t ()
-{
-    //nothing to do
-}
-
-//
-// HW SECTION
-//
-template <class PRODUCT>
-//hw_section_t<PRODUCT>::hw_section_t (const char *name, BYTE id, u_int16_t *ptr_low , u_int16_t *ptr_high)
-//: variable_section_t(name, id, ptr_low, ptr_high)
-hw_section_t<PRODUCT>::hw_section_t (const char *name, BYTE id, ADDRESS32 *ptr)
-    : variable_section_t(name, id, ptr)
-{
-    m_termination[0] = -1;
-    m_termination[1] = -1;
-    m_buffer = 0;
-}
-
-template <class PRODUCT>
-void hw_section_t<PRODUCT>::write_to_buffer( BYTE *buffer )
-{
-    INFO("%s: Writing section of size 0x%04x at offset 0x%04x\n",this->m_name, this->m_size, m_offset);
-
-    int current_offset = m_offset;
-    memcpy(buffer + current_offset, &this->header, sizeof(this->header));
-    current_offset += sizeof(this->header);
-    memcpy(buffer + current_offset, m_buffer, m_buffer_size);
-    current_offset += m_buffer_size;
-
-    memcpy(buffer + current_offset, (char*)&m_termination, sizeof(m_termination));
-    current_offset += sizeof (m_termination);
-
-//   this->m_crc = crc_16((u_int32_t*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    this->m_crc = m_CalcCRC.CalcCRC((UCHAR*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    memcpy(buffer+current_offset, &this->m_crc, sizeof (this->m_crc));
-}
-
-template <class PRODUCT>
-void hw_section_t<PRODUCT>::handle_ini_section (u_int8_t translation_map_bits, const ini_section_t &ini_section)
-{
-    int size = ini_section.size();
-    m_buffer = new address_value_t<PRODUCT> [size];
-    m_buffer_size = size * (sizeof (address_value_t<PRODUCT>));
-    memset((void*)m_buffer, -1, m_buffer_size);
-    // buffer + this->header + FFFFs
-    this->m_size += m_buffer_size + sizeof (m_termination) + sizeof (this->m_crc);
-    this->header.section_size = (u_int16_t)this->m_size;
-    this->header.section_size -= sizeof (this->m_crc); //TBD remove - FW does not support CRC yet
-
-    ini_section_t::const_iterator sec_iter;
-    sec_iter = ini_section.begin();
-    int index = 0;
-    typename PRODUCT::ADDRESS temp_address;
-    typename PRODUCT::REG temp_value;
-    while (sec_iter != ini_section.end())
-    {
-        ini_parser<PRODUCT>::get_resolved_address_data(translation_map_bits,
-                                                       sec_iter,
-                                                       &temp_address,
-                                                       &temp_value);
-
-        m_buffer[index].address = temp_address;
-        m_buffer[index].value = temp_value;
-
-        index++;
-        sec_iter++;
-    }
-
-    if (this->m_size > this->m_max_size) {
-        ERR("Section %s with size %d exceeds maximum section size of %d\n",
-            this->m_name, this->m_size, this->m_max_size );
-        EXIT (-1);
-    }
-}
-
-template <class PRODUCT>
-void hw_section_t<PRODUCT>::init (flash_base *fl)
-{
-    //u_int32_t section_address = (*m_ptr_low | ((*m_ptr_high) << 16));
-    u_int32_t section_address = *this->m_ptr;
-    u_int32_t header_address = section_address - sizeof (section_header_t);
-
-    // get the section this->header
-    fl->read(header_address, sizeof (section_header_t), (BYTE*)&this->header);
-
-    // get the section
-    m_buffer_size = this->header.section_size - sizeof (section_header_t) - sizeof (this->m_crc) - sizeof (m_termination);
-    m_buffer_size += sizeof (this->m_crc); // TBD remove when CRC is supported by FW
-    m_buffer = new address_value_t<PRODUCT> [m_buffer_size / (sizeof (address_value_t<PRODUCT>))];
-    fl->read(section_address, m_buffer_size, (BYTE*)m_buffer);
-
-    // get the termination
-    fl->read(section_address+m_buffer_size, sizeof (m_termination), (BYTE*)&m_termination);
-    // get the CRC ???
-
-}
-
-template <class PRODUCT>
-bool hw_section_t<PRODUCT>::operator == (const hw_section_t <PRODUCT> &r_side) const
-{
-    int res = memcmp(&this->header, &r_side.header, sizeof (section_header_t));
-    res |= memcmp(m_buffer, r_side.m_buffer, m_buffer_size);
-    res |= memcmp(m_termination, r_side.m_termination, sizeof (m_termination));
-    return (res == 0);
-}
-
-template <class PRODUCT>
-hw_section_t<PRODUCT>::~hw_section_t ()
-{
-    delete m_buffer;
-};
-
-
-//
-// System Config Section
-//
-template <class PRODUCT>
-system_config_section_t<PRODUCT>::system_config_section_t (const char *name, ADDRESS32 *ptr)
-    : flash_section(name)
-{
-    this->m_ptr = ptr;
-}
-
-template <class PRODUCT>
-void system_config_section_t<PRODUCT>::write_to_buffer( BYTE *buffer )
-{
-    //unused param
-    (void)buffer;
-    INFO("%s: Preparing empty section at offset 0x%04x\n",this->m_name, m_offset);
-}
-
-template <class PRODUCT>
-void system_config_section_t<PRODUCT>::set_offset (int offset)
-{
-    this->m_offset = offset;
-
-    *this->m_ptr = offset;
-    //pointer_section.m_pointers.config_section_pointer = ptr;
-}
-
-
-//
-// FW section
-//
-template <class PRODUCT>
-//fw_section_t<PRODUCT>::fw_section_t (const char *name, BYTE id, u_int16_t *ptr_low , u_int16_t *ptr_high)
-//: variable_section_t(name, id, ptr_low , ptr_high)
-fw_section_t<PRODUCT>::fw_section_t (const char *name, BYTE id, ADDRESS32 *ptr)
-    : variable_section_t(name, id, ptr)
-{
-    m_buffer = 0;
-}
-
-template <class PRODUCT>
-void fw_section_t<PRODUCT>::write_to_buffer(BYTE *buffer )
-{
-    INFO("%s: Writing section of size 0x%04x at offset 0x%04x\n",this->m_name, this->m_size, m_offset);
-
-    int current_offset = m_offset;
-    memcpy(buffer + current_offset, &this->header, sizeof (this->header));
-    current_offset += sizeof (this->header);
-    memcpy(buffer + current_offset, m_buffer, m_buffer_size);
-    current_offset += m_buffer_size;
-
-//   this->m_crc = crc_16((u_int32_t*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    this->m_crc = m_CalcCRC.CalcCRC((UCHAR*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    memcpy(buffer+current_offset, &this->m_crc, sizeof (this->m_crc));
-}
-
-template <class PRODUCT>
-void fw_section_t<PRODUCT>::handle_ini_section (u_int8_t translation_map_bits, const ini_section_t &ini_section)
-{
-    int size = ini_section.size();
-    m_buffer = new address_value_mask_t<PRODUCT> [size];
-    m_buffer_size = size * (sizeof (address_value_mask_t<PRODUCT>));
-    memset((void*)m_buffer, -1, m_buffer_size);
-    // buffer + this->header + CRC
-    this->m_size += m_buffer_size + sizeof (this->m_crc);
-    this->header.section_size = (u_int16_t)this->m_size;
-//   this->header.section_size -= sizeof (this->m_crc); //TBD remove - FW does not support CRC yet
-
-    ini_section_t::const_iterator sec_iter;
-    sec_iter = ini_section.begin();
-    int index = 0;
-    typename PRODUCT::ADDRESS temp_address;
-    typename PRODUCT::REG temp_value;
-    int start, end;
-    while (sec_iter != ini_section.end())
-    {
-        ini_parser<PRODUCT>::get_resolved_address_data(
-            translation_map_bits,
-            sec_iter,
-            &temp_address,
-            &temp_value,
-            &start,
-            &end);
-        m_buffer[index].address = temp_address;
-        m_buffer[index].value = temp_value;
-        m_buffer[index].value <<= start;
-        m_buffer[index].mask = ~(((2 << (end - start)) - 1) << start);
-        index++;
-        sec_iter++;
-    }
-    if (this->m_size > this->m_max_size) {
-        ERR("Section %s with size %d exceeds maximum section size of %d\n",
-            this->m_name, this->m_size, this->m_max_size );
-        EXIT (-1);
-    }
-}
-
-template <class PRODUCT>
-fw_section_t<PRODUCT>::~fw_section_t ()
-{
-    delete m_buffer;
-};
-
-//
-// Image section
-//
-//image_section_t::image_section_t (const char *name, BYTE id, u_int16_t *ptr_low,
-//                                  u_int16_t *ptr_high, u_int16_t *length)
-//: variable_section_t(name, id, ptr_low , ptr_high)
-template <class PRODUCT>
-image_section_t<PRODUCT>::image_section_t (const char *name, BYTE id, ADDRESS32 *ptr, typename PRODUCT::REG *length)
-    : variable_section_t(name, id, ptr)
-{
-    m_length = length;
-    m_buffer = 0;
-}
-
-template <class PRODUCT>
-void image_section_t<PRODUCT>::set_offset (int offset)
-{
-    id_section::set_offset(offset);
-    // length in pointer section is w/o the section this->header and w/o the CRC
-    *m_length = ( typename PRODUCT::REG)(this->m_size - sizeof (section_header_t) - sizeof (this->m_crc));
-}
-
-template <class PRODUCT>
-void image_section_t<PRODUCT>::write_to_buffer(BYTE *buffer)
-{
-    INFO("%s: Writing section of size 0x%04x at offset 0x%04x\n",this->m_name, this->m_size, m_offset);
-
-    int current_offset = m_offset;
-    memcpy(buffer + current_offset, &this->header, sizeof (this->header));
-    current_offset += sizeof (this->header);
-    memcpy(buffer + current_offset, m_buffer, m_buffer_size);
-    current_offset += m_buffer_size;
-
-//   this->m_crc = crc_16((u_int32_t*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    this->m_crc = m_CalcCRC.CalcCRC((UCHAR*)(buffer+m_offset+sizeof (this->header)), m_buffer_size);
-    memcpy(buffer+current_offset, &this->m_crc, sizeof (this->m_crc));
-}
-
-template <class PRODUCT>
-void image_section_t<PRODUCT>::handle_ini_section (const ini_section_t &ini_section)
-{
-    int size = ini_section.size();
-    m_buffer = new IMAGE [size];
-    m_buffer_size = size * (sizeof (IMAGE));
-    memset((void*)m_buffer, -1, m_buffer_size);
-    // buffer + this->header + CRC
-    this->m_size += m_buffer_size + sizeof (this->m_crc);
-    this->header.section_size = (u_int16_t)this->m_size;
-//   this->header.section_size -= sizeof (this->m_crc); //TBD remove - FW does not support CRC yet
-
-    ini_section_t::const_iterator sec_iter;
-    sec_iter = ini_section.begin();
-    int index = 0;
-    while (sec_iter != ini_section.end())
-    {
-        get_resolved_data(sec_iter, &m_buffer[index]);
-        index++;
-        sec_iter++;
-    }
-
-    if (this->m_size > this->m_max_size) {
-        ERR("Section %s with size %d exceeds maximum section size of %d\n",
-            this->m_name, this->m_size, this->m_max_size );
-        EXIT (-1);
-    }
-}
-
-template <class PRODUCT>
-image_section_t<PRODUCT>::~image_section_t ()
-{
-    delete m_buffer;
-};
-
-//
-// TAG section
-//
-
-//info_section_t::info_section_t (const char *name, BYTE id, u_int16_t *ptr_low , u_int16_t *ptr_high)
-//: variable_section_t(name, id, ptr_low , ptr_high)
-template <class PRODUCT>
-info_section_t<PRODUCT>::info_section_t (const char *name, BYTE id, ADDRESS32* ptr)
-    : variable_section_t(name, id, ptr)
-{
-    this->m_size += sizeof (this->m_crc); //for CRC
-}
-
-template <class PRODUCT>
-void info_section_t<PRODUCT>::write_to_buffer(BYTE *buffer)
-{
-    tag_t<end_tag_t> *tag = new tag_t<end_tag_t> (end_tag_id);
-    this->m_size += sizeof (end_tag_t) + sizeof (tag_header_t);
-    this->m_tags.insert(this->m_tags.end(), tag);
-    this->header.section_size = (u_int16_t)this->m_size;
-//    this->header.section_size -= sizeof (this->m_crc); //TBD remove - FW does not support CRC yet
-
-    INFO("%s: Writing section of size 0x%04x at offset 0x%04x\n",this->m_name, this->m_size, m_offset);
-
-    int current_offset = m_offset;
-    memcpy(buffer + current_offset, &this->header, sizeof (this->header));
-    current_offset += sizeof (this->header);
-
-    tag_vector_t::const_iterator iter = this->m_tags.begin();
-    while (iter != this->m_tags.end()) {
-        tag_base_t *tag_base = *iter;
-        memcpy(buffer + current_offset, &(tag_base->m_header), sizeof (tag_header_t));
-        current_offset += sizeof (tag_header_t);
-
-        memcpy(buffer + current_offset, tag_base->get_tag(), tag_base->m_header.tag_size);
-        current_offset += tag_base->m_header.tag_size;
-        iter++;
-    }
-
-//   this->m_crc = crc_16((u_int32_t*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    this->m_crc = m_CalcCRC.CalcCRC((UCHAR*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    memcpy(buffer+current_offset, &this->m_crc, sizeof (this->m_crc));
-}
-
-template <class PRODUCT>
-void info_section_t<PRODUCT>::disp() const
-{
-    tag_vector_t::const_iterator iter = this->m_tags.begin();
-    while (iter != this->m_tags.end()) {
-        tag_base_t *tag_base = *iter;
-        tag_base->disp();
-        iter++;
-    }
-}
-
-template <class PRODUCT>
-info_section_t<PRODUCT>::~info_section_t ()
-{
-    tag_vector_t::const_iterator iter = this->m_tags.begin();
-    while (iter != this->m_tags.end()) {
-        tag_base_t *tag_base = *iter;
-        delete tag_base;
-        iter++;
-    }
-}
-
-//
-// Image_info
-//
-//image_info_section_t::image_info_section_t (const char *name, BYTE id, u_int16_t *ptr_low , u_int16_t *ptr_high)
-//:info_section_t(name, id, ptr_low, ptr_high)
-template <class PRODUCT>
-image_info_section_t<PRODUCT>::image_info_section_t (const char *name, BYTE id, ADDRESS32 *ptr)
-    :info_section_t<PRODUCT>(name, id, ptr)
-{
-    // nothing to do
-}
-
-template <class PRODUCT>
-void image_info_section_t<PRODUCT>::handle_ini_section (const ini_section_t &ini_section,
-                                                        const string &name)
-{
-    string key;
-    u_int64_t value;
-    if( "image_format_version" == name ) {
-        tag_t<format_version_tag_t> *tag = new tag_t<format_version_tag_t> (image_format_version_tag_id, name.data());
-        this->m_size += sizeof (format_version_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "format_version";
-        get_value(ini_section, key, &value );
-        tag->m_tag.format_version = (BYTE)value;
-    }
-    else if (( "fw_version" == name ) || ( "ucode_version" == name )){
-        tag_t<version_tag_t> *tag = new tag_t<version_tag_t> (fw_version_tag_id, name.data());
-        this->m_size += sizeof (version_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "build";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.build = value;
-            if ("fw_version" == name) {
-                // Remember the current fw build number for later use
-                current_fw_build = value;
-            }
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "major";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.major = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "minor";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.minor = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "sub_minor";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.sub_minor = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-    }
-    else if (("fw_timestamp" == name ) || ( "ucode_timestamp" == name )) {
-        tag_t<timestamp_tag_t> *tag = new tag_t<timestamp_tag_t> (fw_timestamp_tag_id, name.data());
-        this->m_size += sizeof (timestamp_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "sec";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.sec = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "min";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.min = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "hour";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.hour = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "day";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.day = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "month";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.month = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "year";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.year = (u_int16_t)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-    }
-    else if ("configuration_id" == name ) {
-        tag_t<configuration_id_tag_t> *tag = new tag_t<configuration_id_tag_t> (configuration_id_tag_id, name.data());
-        this->m_size += sizeof (configuration_id_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "configuration_id";
-        get_string(ini_section, key, tag->m_tag.id, sizeof (tag->m_tag.id));
-    }
-    else if ("device_id" == name ) {
-        tag_t<device_id_tag_t> *tag = new tag_t<device_id_tag_t> (device_id_tag_id, name.data());
-        this->m_size += sizeof (device_id_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "device_id";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.device_id = (u_int16_t)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "misc";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.misc = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "revision_id";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.revision_id = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-    }
-    else if ("hw_id" == name ) {
-        tag_t<hw_id_tag_t> *tag = new tag_t<hw_id_tag_t> (hw_id_tag_id, name.data());
-        this->m_size += sizeof (hw_id_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "antenna_id";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.antenna_id = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "board_id";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.board_id = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "digital_soc_id";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.digital_soc_id = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "rf_id";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.rf_id = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "serial_id";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.serial_id = (u_int16_t)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-    } else {
-        ERR("Unknown tag name %s\n", name.c_str());
-        EXIT (-1);
-    }
-
-    this->header.section_size = (u_int16_t)this->m_size;
-    this->header.section_size -= sizeof (this->m_crc); //TBD remove - FW does not support CRC yet
-
-    if (this->m_size > this->m_max_size) {
-        ERR("Section %s with size %d exceeds maximum section size of %d\n",
-            this->m_name, this->m_size, this->m_max_size );
-        EXIT (-1);
-    }
-}
-
-template <class PRODUCT>
-void image_info_section_t<PRODUCT>::init(flash_base *fl)
-{
-    //u_int32_t section_address = (*m_ptr_low | ((*m_ptr_high) << 16));
-    u_int32_t section_address = *this->m_ptr;
-    u_int32_t header_address = section_address - sizeof (section_header_t);
-
-    // get the section header
-    fl->read(header_address, sizeof (section_header_t), (BYTE*)&this->header);
-    this->m_size = this->header.section_size;
-
-    u_int16_t offset = sizeof (section_header_t);
-    while (offset < this->header.section_size) {
-        tag_header_t tag_header;
-        fl->read(header_address+offset, sizeof (tag_header_t), (BYTE*)&tag_header);
-        offset += sizeof (tag_header_t);
-
-        tag_base_t *tag = NULL;
-        switch (tag_header.tag_id) {
-        case image_format_version_tag_id : {
-            tag = new tag_t<format_version_tag_t> (tag_header.tag_id, "image_format_version");
-            break;
-        }
-        case fw_version_tag_id : {
-            tag = new tag_t<version_tag_t> (tag_header.tag_id, "fw_version");
-            break;
-        }
-        case fw_timestamp_tag_id : {
-            tag = new tag_t<timestamp_tag_t> (tag_header.tag_id, "fw_timestamp");
-            break;
-        }
-        case configuration_id_tag_id : {
-            tag = new tag_t<configuration_id_tag_t> (tag_header.tag_id, "configuration_id");
-            break;
-        }
-        case device_id_tag_id : {
-            tag = new tag_t<device_id_tag_t> (tag_header.tag_id, "device_id");
-            break;
-        }
-        case hw_id_tag_id : {
-            tag = new tag_t<hw_id_tag_t> (tag_header.tag_id, "hw_id");
-            break;
-        }
-        case end_tag_id : {
-            tag = new tag_t<end_tag_t> (tag_header.tag_id);
-            break;
-        }
-        default: {
-            ERR("Unknown tag id %d\n", tag_header.tag_id);
-//            EXIT (-1);
-        }
-        }
-
-        if (tag != NULL)
-        {
-            fl->read(header_address+offset, tag_header.tag_size, (BYTE*)tag->get_tag());
-            offset += tag_header.tag_size;
-
-            this->m_tags.insert(this->m_tags.end(), tag);
-        }
-    }
-}
-
-template <class PRODUCT>
-image_info_section_t<PRODUCT>::~image_info_section_t ()
-{
-    // nothing to do
-}
-
-//
-// USB_Info
-//
-//usb_info_section_t::usb_info_section_t (const char *name, BYTE id, u_int16_t *ptr_low , u_int16_t *ptr_high)
-//:info_section_t(name, id, ptr_low, ptr_high)
-template <class PRODUCT>
-usb_info_section_t<PRODUCT>::usb_info_section_t (const char *name, BYTE id, ADDRESS32 *ptr)
-    :info_section_t<PRODUCT>(name, id, ptr)
-{
-    // nothing to do
-}
-
-template <class PRODUCT>
-void usb_info_section_t<PRODUCT>::handle_ini_section (const ini_section_t &ini_section,
-                                                      const string &name)
-{
-    string key;
-    u_int64_t value;
-    if( "usb_image_format_version" == name ) {
-        tag_t<format_version_tag_t> *tag = new tag_t<format_version_tag_t> (usb_format_version_tag_id, name.data());
-        this->m_size += sizeof (format_version_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "format_version";
-        get_value(ini_section, key, &value );
-        tag->m_tag.format_version = (BYTE)value;
-    }
-    else if( "usb_version" == name ) {
-        tag_t<version_tag_t> *tag = new tag_t<version_tag_t> (usb_version_tag_id, name.data());
-        this->m_size += sizeof (version_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "build";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.build = value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "major";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.major = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "minor";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.minor = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "sub_minor";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.sub_minor = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-    }
-    else if ("usb_timestamp" == name ) {
-        tag_t<timestamp_tag_t> *tag = new tag_t<timestamp_tag_t> (usb_timestamp_tag_id, name.data());
-        this->m_size += sizeof (timestamp_tag_t) + sizeof (tag_header_t);
-        this->m_tags.insert(this->m_tags.end(), tag);
-        key = "sec";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.sec = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "min";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.min = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "hour";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.hour = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "day";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.day = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "month";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.month = (BYTE)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-        key = "year";
-        if( get_value(ini_section, key, &value )) {
-            tag->m_tag.year = (u_int16_t)value;
-        }
-        else {
-            ERR("Missing key %s in tag %s\n", key.c_str(), name.c_str());
-            EXIT (-1);
-        }
-    } else {
-        ERR("Unknown tag name %s\n", name.c_str());
-        EXIT (-1);
-    }
-
-    this->header.section_size = (u_int16_t)this->m_size;
-    this->header.section_size -= sizeof (this->m_crc); //TBD remove - FW does not support CRC yet
-
-    if (this->m_size > this->m_max_size) {
-        ERR("Section %s with size %d exceeds maximum section size of %d\n",
-            this->m_name, this->m_size, this->m_max_size );
-        EXIT (-1);
-    }
-}
-
-template <class PRODUCT>
-void usb_info_section_t<PRODUCT>::init(flash_base *fl)
-{
-    //u_int32_t section_address = (*m_ptr_low | ((*m_ptr_high) << 16));
-    u_int32_t section_address = *this->m_ptr;
-    u_int32_t header_address = section_address - sizeof (section_header_t);
-
-    // get the section header
-    fl->read(header_address, sizeof (section_header_t), (BYTE*)&this->header);
-    this->m_size = this->header.section_size;
-
-    u_int16_t offset = sizeof (section_header_t);
-    while (offset < this->header.section_size) {
-        tag_header_t tag_header;
-        fl->read(header_address+offset, sizeof (tag_header_t), (BYTE*)&tag_header);
-        offset += sizeof (tag_header_t);
-
-        tag_base_t *tag = NULL;
-        switch (tag_header.tag_id) {
-        case usb_format_version_tag_id: {
-            tag = new tag_t<format_version_tag_t> (tag_header.tag_id, "usb_format_version");
-            break;
-        }
-        case usb_version_tag_id : {
-            tag = new tag_t<version_tag_t> (tag_header.tag_id, "usb_version");
-            break;
-        }
-        case usb_timestamp_tag_id : {
-            tag = new tag_t<timestamp_tag_t> (tag_header.tag_id, "usb_timestamp");
-            break;
-        }
-        case end_tag_id : {
-            tag = new tag_t<end_tag_t> (tag_header.tag_id);
-            break;
-        }
-        default: {
-            ERR("Unknown tag id %d\n", tag_header.tag_id);
-            return;
-        }
-        }
-
-        fl->read(header_address+offset, tag_header.tag_size, (BYTE*)tag->get_tag());
-        offset += tag_header.tag_size;
-
-        this->m_tags.insert(this->m_tags.end(), tag);
-    }
-}
-
-template <class PRODUCT>
-usb_info_section_t<PRODUCT>::~usb_info_section_t ()
-{
-    // nothing to do
-}
-
-
-//
-// Const section
-//
-template <typename T, class PRODUCT>
-//const_section_t<T>::const_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t* ptr_high)
-//: id_section(name, id, ptr_low, ptr_high)
-const_section_t<T,PRODUCT>::const_section_t (const char *name, BYTE id, ADDRESS32 *ptr)
-    : id_section(name, id, ptr)
-{
-    memset(&this->m_section, 0, sizeof (T));
-    this->m_size += sizeof (T) + sizeof (this->m_crc);
-    this->header.section_size = (u_int16_t)this->m_size;
-}
-
-template <typename T, class PRODUCT>
-void const_section_t<T,PRODUCT>::write_to_buffer(BYTE *buffer )
-{
-    INFO("%s: Writing section of size 0x%04x at offset 0x%04x\n",this->m_name, this->m_size, m_offset);
-    int current_offset = m_offset;
-
-    memcpy(buffer + current_offset, &this->header, sizeof (this->header));
-    current_offset += sizeof (this->header);
-
-    memcpy(buffer + current_offset, &this->m_section, sizeof (T));
-    current_offset += sizeof (T);
-
-    this->m_crc = crc_16((u_int32_t*)(buffer+m_offset), this->m_size - sizeof (this->m_crc));
-    memcpy(buffer+current_offset, &this->m_crc, sizeof (this->m_crc));
-}
-
-template <typename T, class PRODUCT>
-void const_section_t<T,PRODUCT>::init(flash_base *fl)
-{
-    //u_int32_t section_address = (*m_ptr_low | ((*m_ptr_high) << 16));
-    u_int32_t section_address = *this->m_ptr;
-    fl->read(section_address, sizeof (this->m_section), (BYTE*)&this->m_section);
-}
-
-template <typename T, class PRODUCT>
-void const_section_t<T,PRODUCT>::initReduced(flash_base *fl, int reductionSize)
-{
-    //u_int32_t section_address = (*m_ptr_low | ((*m_ptr_high) << 16));
-    u_int32_t section_address = *this->m_ptr - reductionSize;
-    fl->read(section_address, sizeof (this->m_section), (BYTE*)&this->m_section);
-}
-
-
-//
-// IDs section
-//
-//ids_section_t::ids_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t* ptr_high)
-//: const_section_t(name, id, ptr_low, ptr_high)
-template <class PRODUCT>
-ids_section_t<PRODUCT>::ids_section_t (const char *name, BYTE id, ADDRESS32 *ptr)
-    : const_section_t<ids_section,PRODUCT>(name, id, ptr)
-{
-    //nothing to do
-}
-
-template <class PRODUCT>
-void ids_section_t<PRODUCT>::handle_ini_section (const ini_section_t &ini_section)
-{
-    u_int64_t value;
-
-    get_value(ini_section, "version", &value);
-    this->m_section.version = (BYTE)value;
-
-    get_value(ini_section, "mac_address" , &value);
-    memcpy(&this->m_section.mac_address, &value, sizeof (this->m_section.mac_address));
-
-    get_string(ini_section, "ssid" , &this->m_section.ssid, sizeof (this->m_section.ssid));
-
-    get_value(ini_section, "local", &value);
-    this->m_section.local = (u_int16_t)value;
-
-    get_value(ini_section, "ppm", &value);
-    this->m_section.ppm = (u_int16_t)value;
-
-    get_value(ini_section, "board", &value);
-    this->m_section.board_type = (u_int32_t)value;
-
-    get_value(ini_section, "lo_power_xif_gc", &value);
-    this->m_section.lo_power_xif_gc = (u_int16_t)value;
-
-    get_value(ini_section, "lo_power_stg2_bias", &value);
-    this->m_section.lo_power_stg2_bias = (u_int16_t)value;
-
-    get_value(ini_section, "vga_bias", &value);
-    this->m_section.vga_bias = (u_int16_t)value;
-
-    get_value(ini_section, "vga_stg1_fine_bias", &value);
-    this->m_section.vga_stg1_fine_bias = (u_int16_t)value;
-
-    get_value(ini_section, "ats_ver", &value);
-    this->m_section.ats_ver = (u_int16_t)value;
-
-    get_value(ini_section, "mlt_ver", &value);
-    this->m_section.mlt_ver = (u_int16_t)value;
-
-    get_value(ini_section, "bl_ver", &value);
-    this->m_section.bl_ver = (u_int16_t)value;
-
-    get_value(ini_section, "lo_power_gc_ctrl", &value);
-    this->m_section.lo_power_gc_ctrl = (u_int16_t)value;
-
-    get_value(ini_section, "production1", &value);
-    this->m_section.production1 = (u_int16_t)value;
-
-    get_value(ini_section, "production2", &value);
-    this->m_section.production2 = (u_int16_t)value;
-
-    get_value(ini_section, "production3", &value);
-    this->m_section.production3 = (u_int16_t)value;
-
-    get_value(ini_section, "production4", &value);
-    this->m_section.production4 = (u_int16_t)value;
-
-    get_value(ini_section, "production5", &value);
-    this->m_section.production5 = (u_int16_t)value;
-
-    get_value(ini_section, "production6", &value);
-    this->m_section.production6 = (u_int16_t)value;
-
-    get_value(ini_section, "production7", &value);
-    this->m_section.production7 = (u_int16_t)value;
-
-    get_value(ini_section, "production8", &value);
-    this->m_section.production8 = (u_int16_t)value;
-
-    get_value(ini_section, "production9", &value);
-    this->m_section.production9 = (u_int16_t)value;
-
-    get_value(ini_section, "production10", &value);
-    this->m_section.production10 = (u_int16_t)value;
-
-    get_value(ini_section, "production11", &value);
-    this->m_section.production11 = (u_int16_t)value;
-
-    get_value(ini_section, "production12", &value);
-    this->m_section.production12 = (u_int16_t)value;
-
-    get_value(ini_section, "production13", &value);
-    this->m_section.production13 = (u_int16_t)value;
-
-    get_value(ini_section, "production14", &value);
-    this->m_section.production14 = (u_int16_t)value;
-
-    get_value(ini_section, "production15", &value);
-    this->m_section.production15 = (u_int16_t)value;
-
-    get_value(ini_section, "production16", &value);
-    this->m_section.production16 = (u_int16_t)value;
-
-
-    if (this->m_size > this->m_max_size) {
-        ERR("Section %s with size %d exceeds maximum section size of %d\n",
-            this->m_name, this->m_size, this->m_max_size );
-        EXIT (-1);
-    }
-}
-
-template <class PRODUCT>
-void ids_section_t<PRODUCT>::disp() const
-{
-    printf("version = %d\n",this->m_section.version);
-    printf("MAC address = 0x%02x%02x%02x%02x%02x%02x\n", this->m_section.mac_address[5],
-           this->m_section.mac_address[4],
-           this->m_section.mac_address[3],
-           this->m_section.mac_address[2],
-           this->m_section.mac_address[1],
-           this->m_section.mac_address[0]);
-    printf("SSID = ");
-    print_buffer(&this->m_section.ssid, sizeof (this->m_section.ssid));
-    printf("\n");
-    printf("local = %d\n",this->m_section.local);
-    printf("ppm = %d\n",this->m_section.ppm);
-    printf("board = %d\n",this->m_section.board_type);
-    printf("lo_power_xif_gc = %d\n",this->m_section.lo_power_xif_gc);
-    printf("lo_power_stg2_bias = %d\n",this->m_section.lo_power_stg2_bias);
-    printf("vga_bias = %d\n",this->m_section.vga_bias);
-    printf("vga_stg1_fine_bias = %d\n",this->m_section.vga_stg1_fine_bias);
-    printf("ats_ver = %d\n",this->m_section.ats_ver);
-    printf("mlt_ver = %d\n",this->m_section.mlt_ver);
-    printf("bl_ver = %d\n",this->m_section.bl_ver);
-    printf("lo_power_gc_ctrl = %d\n",this->m_section.lo_power_gc_ctrl);
-    printf("production1 = %d\n",this->m_section.production1);
-    printf("production2 = %d\n",this->m_section.production2);
-    printf("production3 = %d\n",this->m_section.production3);
-    printf("production4 = %d\n",this->m_section.production4);
-    printf("production5 = %d\n",this->m_section.production5);
-    printf("production6 = %d\n",this->m_section.production6);
-    printf("production7 = %d\n",this->m_section.production7);
-    printf("production8 = %d\n",this->m_section.production8);
-    printf("production9 = %d\n",this->m_section.production9);
-    printf("production10 = %d\n",this->m_section.production10);
-    printf("production11 = %d\n",this->m_section.production11);
-    printf("production12 = %d\n",this->m_section.production12);
-    printf("production13 = %d\n",this->m_section.production13);
-    printf("production14 = %d\n",this->m_section.production14);
-    printf("production15 = %d\n",this->m_section.production15);
-    printf("production16 = %d\n",this->m_section.production16);
-}
-
-template <class PRODUCT>
-void ids_section_t<PRODUCT>::disp_to_file(const char* ids_ini_file) const
-{
-    std::ofstream fs(ids_ini_file);
-
-    if(!fs)
-    {
-        printf("Cannot open the output file\n");
-        return;
-    }
-
-
-    fs << "[IDS]" << endl;
-    fs << "version = " << (int)(this->m_section.version) << endl;
-
-    // Mac address
-    fs << "mac_address = 0x" ;
-    fs << hex << std::setw(2) << std::setfill('0') << (int)(this->m_section.mac_address[5]);
-    fs << hex << std::setw(2) << std::setfill('0') << (int)(this->m_section.mac_address[4]);
-    fs << hex << std::setw(2) << std::setfill('0') << (int)(this->m_section.mac_address[3]);
-    fs << hex << std::setw(2) << std::setfill('0') << (int)(this->m_section.mac_address[2]);
-    fs << hex << std::setw(2) << std::setfill('0') << (int)(this->m_section.mac_address[1]);
-    fs << hex << std::setw(2) << std::setfill('0') << (int)(this->m_section.mac_address[0]);
-    fs << endl;
-
-
-    fs << std::setbase(10);
-    fs << "local = " << (int)(this->m_section.local) << endl;
-    fs << "ssid = " << this->m_section.ssid << endl;
-    fs << "ppm = " << this->m_section.ppm << endl;
-    fs << "board = " << this->m_section.board_type << endl;
-    fs << "lo_power_xif_gc = " << this->m_section.lo_power_xif_gc << endl;
-    fs << "lo_power_stg2_bias = " << this->m_section.lo_power_stg2_bias << endl;
-    fs << "vga_bias = " << this->m_section.vga_bias << endl;
-    fs << "vga_stg1_fine_bias = " << this->m_section.vga_stg1_fine_bias << endl;
-    fs << "ats_ver = " << this->m_section.ats_ver << endl;
-    fs << "mlt_ver = " << this->m_section.mlt_ver << endl;
-    fs << "bl_ver = " << this->m_section.bl_ver << endl;
-    fs << "lo_power_gc_ctrl = " << this->m_section.lo_power_gc_ctrl << endl;
-    fs << "production1 = " << this->m_section.production1 << endl;
-    fs << "production2 = " << this->m_section.production2 << endl;
-    fs << "production3 = " << this->m_section.production3 << endl;
-    fs << "production4 = " << this->m_section.production4 << endl;
-    fs << "production5 = " << this->m_section.production5 << endl;
-    fs << "production6 = " << this->m_section.production6 << endl;
-    fs << "production7 = " << this->m_section.production7 << endl;
-    fs << "production8 = " << this->m_section.production8 << endl;
-    fs << "production9 = " << this->m_section.production9 << endl;
-    fs << "production10 = " << this->m_section.production10 << endl;
-    fs << "production11 = " << this->m_section.production11 << endl;
-    fs << "production12 = " << this->m_section.production12 << endl;
-    fs << "production13 = " << this->m_section.production13 << endl;
-    fs << "production14 = " << this->m_section.production14 << endl;
-    fs << "production15 = " << this->m_section.production15 << endl;
-    fs << "production16 = " << this->m_section.production16 << endl;
-    fs << std::setbase(16);
-    fs.close();
-}
-
-//usb_section_t::usb_section_t (const char *name, u_int16_t *ptr_low, u_int16_t* ptr_high)
-usb_section_t::usb_section_t (const char *name, ADDRESS32 *ptr)
-    :flash_section(name)
-{
-    //m_ptr_low = ptr_low;
-    //m_ptr_high = ptr_high;
-    this->m_ptr = ptr;
-    this->m_size = 0;
-    m_buffer = 0;
-}
-
-void usb_section_t::write_to_buffer(BYTE *buffer )
-{
-    INFO("%s: Writing section of size 0x%04x at offset 0x%04x\n",this->m_name, this->m_size, m_offset);
-
-    memcpy(buffer + m_offset, m_buffer, this->m_size);
-}
-
-void usb_section_t::handle_ini_section (const ini_section_t &ini_section)
-{
-    this->m_size = ini_section.size() * sizeof (IMAGE);
-    m_buffer = new IMAGE [ini_section.size()];
-    if (!m_buffer)
-    {
-        ERR("Cannot allocate a buffer of size %lu\n", ini_section.size());
-        EXIT (-1);
-    }
-
-    memset((void*)m_buffer, -1, this->m_size);
-
-    ini_section_t::const_iterator sec_iter;
-    sec_iter = ini_section.begin();
-    int index = 0;
-    while (sec_iter != ini_section.end())
-    {
-        get_resolved_data(sec_iter, &m_buffer[index]);
-        index++;
-        sec_iter++;
-    }
-
-    if (this->m_size > this->m_max_size) {
-        ERR("Section %s with size %d exceeds maximum section size of %d\n",
-            this->m_name, this->m_size, this->m_max_size );
-        EXIT (-1);
-    }
-}
-
-void usb_section_t::set_offset (int offset)
-{
-    flash_section::set_offset(offset);
-    //*m_ptr_low = (u_int16_t)offset;
-    //*m_ptr_high = (u_int16_t)(offset>>16);
-    *this->m_ptr = offset;
-}
-
-usb_section_t::~usb_section_t()
-{
-    delete m_buffer;
-}
-
-//template class pointer_section_t<u_int16_t>;
-//template class pointer_section_t<u_int32_t>;
diff --git a/debug-tools/wiburn/flash_sections.h b/debug-tools/wiburn/flash_sections.h
deleted file mode 100644
index 9d7b543..0000000
--- a/debug-tools/wiburn/flash_sections.h
+++ /dev/null
@@ -1,464 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _FLASH_SECTIONS_H_
-#define _FLASH_SECTIONS_H_
-
-#include "wiburn.h"
-#include "ini_parser_types.h"
-#include "flash.h"
-#include "CCRC32.h"
-
-enum tag_ids {
-    image_format_version_tag_id = 0x1,
-    fw_version_tag_id = 0x2,
-    fw_timestamp_tag_id = 0x3,
-    usb_format_version_tag_id = 0x1,
-    usb_version_tag_id = 0x2,
-    usb_timestamp_tag_id = 0x3,
-    configuration_id_tag_id = 0x4,
-    device_id_tag_id = 0x5,
-    hw_id_tag_id = 0x6,
-    end_tag_id =    0xff
-};
-
-#pragma pack(push, 1)
-template <class PRODUCT>
-struct pointers_t
-{
-    typename PRODUCT::REG   signature;
-    ADDRESS32               hw_pointer;
-    ADDRESS32               fw1_pointer;
-    typename PRODUCT::REG   fw1_length;
-    ADDRESS32               fw1_data_pointer;
-    typename PRODUCT::REG   fw1_data_length;
-    ADDRESS32               fw2_pointer;
-    typename PRODUCT::REG   fw2_length;
-    ADDRESS32               fw2_data_pointer;
-    typename PRODUCT::REG   fw2_data_length;
-    ADDRESS32               production_pointer;
-    ADDRESS32               ids_pointer;
-    typename PRODUCT::REG   pointer_section_version;
-    ADDRESS32               fw1_static_conf_pointer;
-    ADDRESS32               fw2_static_conf_pointer;
-    ADDRESS32               config_section_pointer;
-    ADDRESS32               image_info_pointer;
-    ADDRESS32               radio_tx_cnf_pointer;
-    ADDRESS32               radio_rx_cnf_pointer;
-    ADDRESS32               radio_tx_cnf2_pointer;
-    ADDRESS32               radio_rx_cnf2_pointer;
-    ADDRESS32               raw_data_pointer;
-    typename PRODUCT::REG   raw_data_length;
-
-    // Unused
-    ADDRESS32               usb_pointer;
-    ADDRESS32               usb_info_pointer;
-    ADDRESS32               user_pointer;
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-template <class PRODUCT>
-struct address_value_t
-{
-    typename PRODUCT::ADDRESS address;
-    typename PRODUCT::REG value;
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-template <class PRODUCT>
-struct address_value_mask_t
-{
-    typename PRODUCT::ADDRESS address;
-    typename PRODUCT::REG value;
-    typename PRODUCT::REG mask;
-};
-#pragma pack(pop)
-
-
-#pragma pack(push, 1)
-struct tag_header_t
-{
-    BYTE reserved;
-    BYTE tag_id;
-    u_int16_t tag_size;
-    void disp(const char *name);
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-struct format_version_tag_t
-{
-    BYTE format_version;
-    BYTE reserved [3];
-    void disp(const char *name);
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-struct version_tag_t
-{
-    u_int32_t minor : 8;
-    u_int32_t major : 8;
-    u_int32_t build : 13;
-    u_int32_t sub_minor : 3;
-    void disp(const char *name);
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-struct timestamp_tag_t
-{
-    BYTE min;
-    BYTE hour;
-    BYTE reserved1;
-    BYTE sec;
-    BYTE month;
-    BYTE day;
-    u_int16_t year;
-    void disp(const char *name);
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-struct configuration_id_tag_t
-{
-    BYTE id [16];
-    void disp(const char *name);
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-struct device_id_tag_t
-{
-    u_int16_t device_id;
-    BYTE revision_id;
-    BYTE misc;
-    void disp(const char *name);
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-struct hw_id_tag_t
-{
-    BYTE digital_soc_id;
-    BYTE board_id;
-    BYTE antenna_id;
-    BYTE rf_id;
-    u_int16_t serial_id;
-    u_int16_t reserved;
-    void disp(const char *name);
-};
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-struct end_tag_t
-{
-    u_int16_t reserved1;
-    u_int16_t reserved2;
-    void disp(const char *name);
-};
-#pragma pack(pop)
-
-class tag_base_t
-{
-public:
-    virtual char *get_tag() = 0;
-    tag_base_t (BYTE id, const char* name);
-    virtual ~tag_base_t() {};
-    virtual void disp() = 0;
-public:
-    tag_header_t m_header;
-    const char *m_name;
-};
-
-template <class Tag>
-class tag_t: public tag_base_t
-{
-public:
-    char *get_tag();
-    tag_t (BYTE id, const char* name = 0);
-    virtual ~tag_t() {};
-    void disp();
-public:
-    Tag m_tag;
-};
-
-
-#pragma pack(push, 1)
-struct section_header_t
-{
-    BYTE reserved;
-    BYTE section_id;
-    u_int16_t section_size;
-};
-#pragma pack(pop)
-
-class flash_section
-{
-public:
-    flash_section (const char *name);
-    virtual void write_to_buffer(BYTE *buffer ) = 0;
-    int size () const;
-    int get_max_size () const;
-    void set_max_size ( u_int32_t max_size );
-    void set_offset (u_int32_t offset);
-    u_int32_t get_offset () const;
-    virtual ~flash_section() {};
-protected:
-    u_int32_t m_size;
-    u_int32_t m_max_size;
-    u_int32_t m_offset;
-    const char *m_name;
-    u_int32_t m_crc;
-    CCRC32 m_CalcCRC;
-};
-
-class usb_section_t : public flash_section
-{
-public:
-    //usb_section_t (const char *name, u_int16_t *ptr_low, u_int16_t* ptr_high);
-    usb_section_t (const char *name, ADDRESS32 *ptr);
-    void write_to_buffer(BYTE *buffer ) ;
-    void handle_ini_section (const ini_section_t &ini_section);
-    void set_offset (int offset);
-    ~usb_section_t();
-public:
-    IMAGE *m_buffer;
-//   u_int16_t *m_ptr_low;
-//   u_int16_t *m_ptr_high;
-    ADDRESS32 *m_ptr;
-};
-
-class id_section : public flash_section
-{
-public:
-    //id_section (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t* ptr_high);
-    id_section (const char *name, BYTE id, ADDRESS32 *ptr);
-    void set_offset (int offset);
-
-public:
-    section_header_t header;
-//   u_int16_t *m_ptr_low;
-//   u_int16_t *m_ptr_high;
-    ADDRESS32 *m_ptr;
-};
-
-class variable_section_t : public id_section
-{
-public:
-//   variable_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t *ptr_high);
-    variable_section_t (const char *name, BYTE id, ADDRESS32 *ptr);
-    ~variable_section_t ();
-protected:
-    int m_buffer_size;
-};
-
-template <class PRODUCT>
-class hw_section_t : public variable_section_t
-{
-public:
-//   hw_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t *ptr_high);
-    hw_section_t (const char *name, BYTE id, ADDRESS32 *ptr);
-public:
-    void handle_ini_section (u_int8_t translation_map_bits, const ini_section_t &ini_section);
-    void init (flash_base *flash);
-    bool operator == (const hw_section_t &r_side) const;
-    void write_to_buffer(BYTE *buffer ) ;
-    ~hw_section_t ();
-    address_value_t <PRODUCT> *m_buffer;
-    u_int16_t *m_length;
-    u_int32_t m_termination [2];
-
-};
-
-template <class PRODUCT>
-class fw_section_t : public variable_section_t
-{
-public:
-    //fw_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t *ptr_high);
-    fw_section_t (const char *name, BYTE id, ADDRESS32 *ptr);
-public:
-    void handle_ini_section (u_int8_t translation_map_bits, const ini_section_t &ini_section);
-    void write_to_buffer(BYTE *buffer ) ;
-    ~fw_section_t ();
-    address_value_mask_t <PRODUCT> *m_buffer;
-};
-
-template <class PRODUCT>
-class image_section_t : public variable_section_t
-{
-public:
-    //image_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t *ptr_high, u_int16_t *length);
-    image_section_t (const char *name, BYTE id, ADDRESS32 *ptr, typename PRODUCT::REG *length);
-    void handle_ini_section (const ini_section_t &ini_section);
-    void write_to_buffer(BYTE *buffer ) ;
-    void set_offset (int offset);
-    ~image_section_t ();
-public:
-    IMAGE *m_buffer;
-    //u_int16_t *m_length;
-    typename PRODUCT::REG *m_length;
-};
-
-template <class PRODUCT>
-class pointer_section_t : public flash_section
-{
-public:
-    pointer_section_t (const char *name);
-    void init (flash_base *fl);
-    void write_to_buffer(BYTE *buffer ) ;
-    bool operator == (const pointer_section_t <PRODUCT> &r_side) const;
-public:
-    pointers_t <PRODUCT> m_pointers;
-};
-
-template <class PRODUCT>
-class info_section_t : public variable_section_t
-{
-public:
-    typedef vector <tag_base_t*> tag_vector_t;
-public:
-//   info_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t *ptr_high);
-    info_section_t (const char *name, BYTE id, ADDRESS32 *ptr);
-    virtual void handle_ini_section (const ini_section_t &ini_section,
-                                     const string &name) = 0;
-    virtual void init (flash_base *flash) = 0;
-    void write_to_buffer(BYTE *buffer ) ;
-    ~info_section_t ();
-    void disp() const;
-
-public:
-    tag_vector_t m_tags;
-    u_int16_t *m_length;
-};
-
-template <class PRODUCT>
-class image_info_section_t : public info_section_t<PRODUCT>
-{
-public:
-    //image_info_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t *ptr_high);
-    image_info_section_t (const char *name, BYTE id, ADDRESS32 *ptr);
-    void handle_ini_section (const ini_section_t &ini_section,
-                             const string &name);
-    void init (flash_base *fl);
-    ~image_info_section_t ();
-};
-
-template <class PRODUCT>
-class usb_info_section_t : public info_section_t<PRODUCT>
-{
-public:
-//   usb_info_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t *ptr_high);
-    usb_info_section_t (const char *name, BYTE id, ADDRESS32 *ptr);
-    void handle_ini_section (const ini_section_t &ini_section,
-                             const string &name);
-    void init (flash_base *fl);
-    ~usb_info_section_t ();
-};
-
-template <class PRODUCT>
-class system_config_section_t : public flash_section
-{
-public:
-    system_config_section_t (const char *name, ADDRESS32 *ptr);
-    void set_offset (int offset);
-    void write_to_buffer(BYTE *buffer ) ;
-
-public:
-    ADDRESS32 *m_ptr;
-};
-
-
-#pragma pack(push, 1)
-struct ids_section
-{
-    BYTE reserved1;
-    BYTE version;
-    BYTE mac_address [6];
-    BYTE ssid [32];
-    u_int16_t local;
-    u_int16_t reserved2;
-    u_int16_t ppm;
-    u_int16_t reserved3;
-    u_int32_t board_type;
-    u_int16_t lo_power_xif_gc;
-    u_int16_t lo_power_stg2_bias;
-    u_int16_t vga_bias;
-    u_int16_t vga_stg1_fine_bias;
-    u_int16_t ats_ver;
-    u_int16_t mlt_ver;
-    u_int16_t bl_ver;
-    u_int16_t lo_power_gc_ctrl;
-    u_int16_t production1;
-    u_int16_t production2;
-    u_int16_t production3;
-    u_int16_t production4;
-    u_int16_t production5;
-    u_int16_t production6;
-    u_int16_t production7;
-    u_int16_t production8;
-    u_int16_t production9;
-    u_int16_t production10;
-    u_int16_t production11;
-    u_int16_t production12;
-    u_int16_t production13;
-    u_int16_t production14;
-    u_int16_t production15;
-    u_int16_t production16;
-};
-#pragma pack(pop)
-
-template <typename T, class PRODUCT>
-    struct const_section_t: public id_section
-{
-public:
-//   const_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t* ptr_high);
-    const_section_t (const char *name, BYTE id, ADDRESS32 *ptr);
-    virtual void handle_ini_section (const ini_section_t &ini_section) = 0;
-    void write_to_buffer(BYTE *buffer ) ;
-    virtual void init (flash_base *fl);
-    virtual void initReduced (flash_base *fl, int reductionSize);
-public:
-    T m_section;
-};
-
-
-template <class PRODUCT>
-struct ids_section_t: public const_section_t <ids_section, PRODUCT>
-{
-public:
-//   ids_section_t (const char *name, BYTE id, u_int16_t *ptr_low, u_int16_t* ptr_high);
-    ids_section_t (const char *name, BYTE id, ADDRESS32 *ptr);
-    void handle_ini_section (const ini_section_t &ini_section);
-    void disp() const;
-    void disp_to_file(const char* ids_ini_file) const;
-};
-#endif //#ifndef _FLASH_SECTIONS_H_
diff --git a/debug-tools/wiburn/ini_parser.cpp b/debug-tools/wiburn/ini_parser.cpp
deleted file mode 100644
index 4783f60..0000000
--- a/debug-tools/wiburn/ini_parser.cpp
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "ini_parser.h"
-#include <algorithm>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-
-template <class PRODUCT>
-void ini_parser<PRODUCT>::update_section(u_int8_t translation_map_bits, ini_section_t *orig, const ini_section_t &update, bool is_string)
-{
-    if (*orig == update) {
-        return;
-    }
-
-    ini_section_t::const_iterator update_iter = update.begin();
-    ini_section_t::iterator orig_iter;
-    while (update_iter != update.end() ) {
-        orig_iter = find(translation_map_bits, update_iter, *orig, is_string);
-        if (orig_iter == orig->end() ) {
-            if (g_debug) DBG("Appending key %s value %s\n", update_iter->first.c_str(), update_iter->second.c_str());
-            orig->insert(orig->end(), *update_iter); // append entry from the update section
-        } else {
-            if (g_debug) DBG("Replacing Key %s value %s with key %s value %s\n"
-                             , orig_iter->first.c_str()
-                             , orig_iter->second.c_str()
-                             , update_iter->first.c_str()
-                             , update_iter->second.c_str());
-            *orig_iter = *update_iter; // replace the original entry with the entry from the update section
-        }
-        update_iter++;
-    }
-}
-
-template <class PRODUCT>
-ini_section_t::iterator ini_parser<PRODUCT>::find(
-    u_int8_t                        translation_map_bits,
-    ini_section_t::const_iterator   &lside,
-    ini_section_t                   &ini_section,
-    bool                            is_string) const
-{
-    //u_int8_t                        translation_map_bits = 1;
-    typename PRODUCT::ADDRESS laddress,raddress;
-    typename PRODUCT::REG lvalue, rvalue;
-    int lstart, lend, rstart, rend;
-    if (!is_string) {
-        get_resolved_address_data(translation_map_bits, lside, &laddress, &lvalue, &lstart, &lend);
-    }
-
-    ini_section_t::iterator rside = ini_section.begin();
-    while (rside != ini_section.end() ) {
-        if (is_string) {
-            if (lside->first == rside->first) {
-                break;
-            }
-        } else {
-            get_resolved_address_data(translation_map_bits, rside, &raddress, &rvalue, &rstart, &rend);
-            if (laddress == raddress && lstart == rstart && lend == rend ) {
-                break;
-            }
-        }
-        rside++;
-    }
-    return rside;
-}
-
-//bool ini_parser::get_value (const ini_section_t &ini_section,
-//const string &key,
-//u_int64_t *value,
-//bool must_be) const
-bool get_value (const ini_section_t &ini_section,
-                const string &key,
-                u_int64_t *value,
-                bool must_be)
-{
-    ini_section_t::const_iterator iter = ini_section.begin();
-    while( ini_section.end() != iter ) {
-        if( iter->first == key ) {
-            char *end_ptr;
-            *value = STRTOULL(iter->second.c_str(), &end_ptr, 0);
-            if(*end_ptr != 0) {
-                ERR("Key %s: Failed converting value %s\n", key.c_str(), iter->second.c_str());
-                EXIT (-1);
-            }
-            return true;
-        }
-        iter++;
-    }
-
-    if(must_be) {
-        ERR("Could not find key %s\n", key.c_str());
-        EXIT (-1);
-    }
-
-    return false;
-}
-
-
-//bool ini_parser::get_string(const ini_section_t &ini_section,
-//const string &key,
-//void *str,
-//u_int32_t max_length,
-//bool must_be) const
-bool get_string(const ini_section_t &ini_section,
-                const string &key,
-                void *str,
-                u_int32_t max_length,
-                bool must_be)
-{
-    ini_section_t::const_iterator iter = ini_section.begin();
-    while( ini_section.end() != iter ) {
-        if( iter->first == key ) {
-            if (iter->second.size() > max_length ) {
-                ERR("Key %s: length %lu exceeded maximal length of %u\n", key.c_str(), (unsigned long)iter->second.size(), max_length);
-                EXIT (-1);
-            }
-
-            iter->second.copy((char*)str, max_length);
-
-            return true;
-        }
-        iter++;
-    }
-
-    if(must_be) {
-        ERR("Could not find key %s\n", key.c_str());
-        EXIT (-1);
-    }
-
-    return false;
-}
-
-template <class PRODUCT>
-void ini_parser<PRODUCT>::get_resolved_address_data (
-    u_int8_t                        translation_map_bits,
-    ini_section_t::const_iterator    sec_iter,
-    typename PRODUCT::ADDRESS        *address,
-    typename PRODUCT::REG            *value,
-    bool                            word_addresses)
-{
-    int start, end;
-    get_resolved_address_data(translation_map_bits, sec_iter, address, value, &start, &end, word_addresses);
-}
-
-template <class PRODUCT>
-void ini_parser<PRODUCT>::get_resolved_address_data (
-    u_int8_t                        translation_map_bits,
-    ini_section_t::const_iterator    sec_iter,
-    typename PRODUCT::ADDRESS        *address,
-    typename PRODUCT::REG            *value,
-    int                                *start,
-    int                                *end,
-    bool                            word_addresses
-    )
-{
-    char *end_ptr;
-    if(g_debug) DBG( "Dumping address %s  value %s\n", sec_iter->first.c_str(),sec_iter->second.c_str());
-    *address = ( typename PRODUCT::ADDRESS)strtoul(sec_iter->first.c_str(), &end_ptr, 0);
-    if (0 != *end_ptr) // it was a pathname
-    {
-        if(g_debug) DBG("Converting %s to ", sec_iter->first.c_str());
-        u_int32_t temp_address;
-        bool found = false;
-        if (!found && (translation_map_bits & TRANSLATION_MAP_REGTREE))
-        {
-            found = g_reg_tree_t_map.get_from_translation_map(sec_iter->first.c_str(), &temp_address, start, end);
-        }
-        if (!found && (translation_map_bits & TRANSLATION_MAP_FW))
-        {
-            found = g_fw_t_map.get_from_translation_map(sec_iter->first.c_str(), &temp_address, start, end);
-        }
-        if (!found && (translation_map_bits & TRANSLATION_MAP_UCODE))
-        {
-            found = g_ucode_t_map.get_from_translation_map(sec_iter->first.c_str(), &temp_address, start, end);
-        }
-
-//      bool found = ::g_t_map.get_from_translation_map(sec_iter->first.c_str(), &temp_address, start, end);
-        *address = ( typename PRODUCT::ADDRESS)temp_address;
-        if (!found) {
-            ERR("Could not find %s in translation map. Make sure that it is in the REG_TREE section in your INI file\n",
-                sec_iter->first.c_str());
-            EXIT (-1);
-        }
-        if (word_addresses) {
-            if (*address & 0x1) {
-                ERR("%s was converted to 0x%04x, which is not dword aligned\n",
-                    sec_iter->first.c_str(),
-                    *address );
-                EXIT (-1);
-            }
-
-            *address = *address / 2;
-        }
-    }
-    else
-    {
-        *start = 0;
-        *end = sizeof ( typename PRODUCT::REG) * 8 - 1;
-    }
-
-    *value = ( typename PRODUCT::REG)strtoul(sec_iter->second.c_str(), &end_ptr, 0);
-
-    if(g_debug) DBG( "Address %0#4x value %0#4x start %d end %d\n", *address, *value, *start, *end);
-}
-
-//void ini_parser::get_resolved_data (ini_section_t::const_iterator sec_iter,
-//                                IMAGE *value) const
-void get_resolved_data (ini_section_t::const_iterator sec_iter,
-                        IMAGE *value)
-{
-    char *end_ptr;
-    *value = strtoul(sec_iter->second.c_str(), &end_ptr, 0);
-    if(g_debug) DBG( "Image %0#4x\n", *value);
-}
-
-template <class PRODUCT>
-ini_parser<PRODUCT>::ini_parser ()
-{
-    this ->hadProductionSeciton = false;
-    //nothing to do
-}
-
-template <class PRODUCT>
-bool ini_parser<PRODUCT>::init (const char *filename, u_int32_t option)
-{
-    FILE *stream;
-    printf("%s\n", filename);
-    stream = fopen( filename, "r" );
-    if( stream == NULL )
-    {
-//        char cwd[1024];
-//        if (getcwd(cwd, sizeof(cwd)) != NULL)
-//                   fprintf(stdout, "Current working dir: %s\n", cwd);
-        printf("%s\n", strerror(errno));
-        ERR( "Failed opening file %s \n", filename );
-        EXIT (-1);
-    }
-    else
-    {
-        int reg_tree_section_index = 0;
-        bool skip_section = false;
-        char buffer [1100];
-        char a1 [1000];
-        char a2 [256];
-        char a3 [256];
-        char a4 [256];
-
-        int ch;
-        int num;
-        u_int8_t translation_map_bits = TRANSLATION_MAP_NONE;
-
-        do
-        {
-            ch = get_clean_line (stream, buffer, sizeof buffer);
-
-            num = sscanf(buffer, "%999s %256s %256s %256s", a1, a2, a3, a4);
-            switch (num)
-            {
-            case 1:
-            {
-                INFO( "Section [%s]\n", a1 );
-                string section = a1;
-
-                if (section == "production")
-                {
-                    if (hadProductionSeciton == true)
-                    {
-                        ERR( "Only one PRODUCTION Section is allowed in one burn command ! \n");
-                        EXIT (-1);
-                    }
-                    hadProductionSeciton = true;
-                }
-
-                if (option == 1)
-                {
-                    if (section == "radio_tx_conf")
-                    {
-                        section += "2";
-                    }
-                    if (section == "radio_rx_conf")
-                    {
-                        section += "2";
-                    }
-                }
-
-                skip_section = false;
-
-                if (section == "fw_symbols")
-                {
-                    translation_map_bits = TRANSLATION_MAP_FW;
-                }
-                else if (section == "ucode_symbols")
-                {
-                    translation_map_bits = TRANSLATION_MAP_UCODE;
-                }
-                else if (section == "reg_tree")
-                {
-                    translation_map_bits = TRANSLATION_MAP_REGTREE;
-                    // if [REG_TREE] section appear more then once then do not process
-                    // its key, values
-                    reg_tree_section_index++;
-                    if (reg_tree_section_index > 1)
-                    {
-                        skip_section = true;
-                    }
-                }
-                if (section != "reg_tree")
-                {
-                    if(g_debug) DBG("Adding ini section\n");
-                    ini_section_t *sec = new ini_section_t;
-                    pair <string, ini_section_t*> p (section, sec);
-                    current_ini_section = ini_file.insert(p);
-                }
-                break;
-            }
-            case 2:
-            {
-                if(g_debug) DBG( "Address %s Value %s\n", a1, a2 );
-                key_value_t entry (a1, a2);
-                pair <ini_section_t::iterator, bool> ret;
-                ini_section_t *sec = this->current_ini_section->second;
-                sec->push_back(entry);
-                break;
-            }
-            case 3:
-            {
-                if(g_debug) DBG( "Address %s[%s] Value %s\n", a1, a3, a2 );
-                string temp = a1;
-                temp += '#';
-                temp.append(a3);
-                key_value_t entry (temp, a2);
-                pair <ini_section_t::iterator, bool> ret;
-                ini_section_t *sec = this->current_ini_section->second;
-                sec->push_back(entry);
-                break;
-            }
-
-            case 4:
-            {
-                if (!skip_section)
-                {
-                    bool bInsert = false;
-
-                    if(g_debug) DBG ("path %s address %s start %s end %s\n", a1, a2, a3, a4);
-
-                    if (translation_map_bits == TRANSLATION_MAP_REGTREE)
-                    {
-                        bInsert = g_reg_tree_t_map.add_to_translation_map(a1, a2, a3, a4);
-                    }
-                    else if (translation_map_bits == TRANSLATION_MAP_FW)
-                    {
-                        bInsert = g_fw_t_map.add_to_translation_map(a1, a2, a3, a4);
-                    }
-                    else if (translation_map_bits == TRANSLATION_MAP_UCODE)
-                    {
-                        bInsert = g_ucode_t_map.add_to_translation_map(a1, a2, a3, a4);
-                    }
-
-                    //                        if( !g_t_map.add_to_translation_map(a1, a2, a3, a4) )
-                    if (!bInsert)
-                    {
-                        ERR("Failed adding to translation map: path %s address %s start %s end %s\n", a1, a2, a3, a4);
-                        EXIT (-1);
-                    };
-                }
-                break;
-            }
-            default : if(g_debug) DBG( "empty line or comment line\n" );break;
-            }
-        } while (EOF != ch);
-
-        fclose(stream);
-    }
-    return true;
-}
-
-template <class PRODUCT>
-int ini_parser<PRODUCT>::get_clean_line (FILE *stream, char *buffer, const int buffer_size) const
-{
-    int i;
-    int ch=0;
-    bool alpha_detected = false;
-    bool section_detected = false;
-
-    for (i = 0; i < buffer_size; i++)
-    {
-        ch = getc(stream);
-        if( ch >= 'A' && ch <= 'Z' )
-        {
-            ch = ch - 'A' + 'a'; // change to lower case
-        }
-
-        alpha_detected  = alpha_detected | (ch >= 'a' && ch <= 'z') ;
-
-        if (EOF == ch || '\n' == ch)
-        {
-            buffer[i] = '\0';
-            break;
-        }
-        else if ('[' == ch && !alpha_detected)
-        {
-            section_detected = true;
-            buffer[i] = ' ';
-        }
-        else if (']' == ch && section_detected)
-        {
-            buffer[i] = ' ';
-        }
-        else if ( '=' == ch)
-        {
-            buffer[i] = ' ';
-        }
-        else if ('#' == ch || ';' == ch)
-        {
-            buffer[i] = '\0';
-        } else
-        {
-            buffer[i] = (char)ch;
-        }
-    }
-    return ch;
-}
-template <class PRODUCT>
-bool ini_parser<PRODUCT>::get_section(const string &section_name, u_int8_t translation_map_bits, ini_file_t::iterator *iter1, bool is_string, bool must_be)
-{
-    //unused param
-    (void)must_be;
-
-    ini_file_t::iterator iter = ini_file.begin();
-    *iter1 = ini_file.end();
-    while (iter != ini_file.end() ) {
-        if (iter->first == section_name ) {
-            if (*iter1 == ini_file.end()){
-                *iter1 = iter;
-            }else{
-                this->update_section(translation_map_bits, (*iter1)->second, *(iter->second), is_string);
-            }
-        }
-        iter++;
-    }
-
-    //
-    // adding this lines cause the application stop running if the section must_be and did not find
-    // in other words, this function always return true
-    // if you decide to remove these lines, you should handle the return code in the caller function
-    //
-    /*if (must_be && *iter1 == ini_file.end()) {
-      ERR("Could not find mandatory section %s\n", section_name.c_str() );
-      EXIT (-1);
-      }*/
-
-    return (*iter1 != ini_file.end() );
-}
-
diff --git a/debug-tools/wiburn/ini_parser.h b/debug-tools/wiburn/ini_parser.h
deleted file mode 100644
index 01e625c..0000000
--- a/debug-tools/wiburn/ini_parser.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _INI_PARSER_H_
-#define _INI_PARSER_H_
-
-#include "wiburn.h"
-#include "ini_parser_types.h"
-//#include "flash_sections.h"
-#include "translation_map.h"
-
-extern translation_map g_reg_tree_t_map;
-extern translation_map g_ucode_t_map;
-extern translation_map g_fw_t_map;
-
-typedef enum _TRANSLATION_MAP_BITS
-{
-    TRANSLATION_MAP_NONE    = 0,
-    TRANSLATION_MAP_REGTREE = 1,
-    TRANSLATION_MAP_FW      = 2,
-    TRANSLATION_MAP_UCODE    = 4,
-
-} TRANSLATION_MAP_BITS;
-
-bool get_value(const ini_section_t &ini_section,
-               const string &key,
-               u_int64_t *value,
-               bool must_be = true);
-
-bool get_string(const ini_section_t &ini_section,
-                const string &key,
-                void *string,
-                u_int32_t max_length,
-                bool must_be = true);
-
-
-
-void get_resolved_data (ini_section_t::const_iterator sec_iter,
-                        IMAGE *value);
-
-
-class ini_parser_base
-{
-public:
-    ini_parser_base () {};
-    virtual ~ini_parser_base () {};
-    virtual bool init (const char *filename, u_int32_t option = 0) = 0;
-    virtual bool get_section(const string &section_name, u_int8_t translation_map_bits, ini_file_t::iterator *iter1, bool is_string, bool must_be) = 0;
-    virtual void update_section(u_int8_t translation_map_bits, ini_section_t *orig, const ini_section_t &update, bool is_string) = 0;
-};
-
-template <class PRODUCT>
-class ini_parser: public ini_parser_base
-{
-private:
-    ini_file_t ini_file;
-    ini_file_t::iterator current_ini_section;
-
-public:
-    ini_parser ();
-    bool init (const char *filename, u_int32_t option = 0);
-    bool get_section(const string &section_name, u_int8_t translation_map_bits, ini_file_t::iterator *iter1, bool is_string, bool must_be);
-
-    //bool get_value(const ini_section_t &ini_section,
-    //               const string &key,
-    //               u_int64_t *value,
-    //               bool must_be = true) const;
-    //bool get_string(const ini_section_t &ini_section,
-    //                  const string &key,
-    //                  void *string,
-    //                  u_int32_t max_length,
-    //                  bool must_be = true) const;
-
-    static void get_resolved_address_data (
-        u_int8_t                        translation_map_bits,
-        ini_section_t::const_iterator    sec_iter,
-        typename PRODUCT::ADDRESS        *address,
-        typename PRODUCT::REG            *value,
-        bool                            word_addresses = false);
-
-    static void get_resolved_address_data (
-        u_int8_t                        translation_map_bits,
-        ini_section_t::const_iterator    sec_iter,
-        typename PRODUCT::ADDRESS        *address,
-        typename PRODUCT::REG            *value,
-        int                                *start,
-        int                                *end,
-        bool                                word_addresses = false);
-
-    //void get_resolved_data (ini_section_t::const_iterator sec_iter,
-    //                             IMAGE *value) const;
-
-    void update_section(u_int8_t translation_map_bits, ini_section_t *orig, const ini_section_t &update, bool is_string);
-private:
-    ini_section_t::iterator find(
-        u_int8_t                        translation_map_bits,
-        ini_section_t::const_iterator    &lside,
-        ini_section_t                    &ini_section,
-        bool                            is_string) const;
-    int get_clean_line (FILE *stream, char *buffer, const int buffer_size) const;
-
-    bool hadProductionSeciton;
-
-};
-
-
-#endif// #ifndef _INI_PARSER_H_
diff --git a/debug-tools/wiburn/ini_parser_types.h b/debug-tools/wiburn/ini_parser_types.h
deleted file mode 100644
index 96fd562..0000000
--- a/debug-tools/wiburn/ini_parser_types.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _INI_PARSER_TYPES_H_
-#define _INI_PARSER_TYPES_H_
-
-#include <string>
-#include <map>
-#include <vector>
-
-using namespace std;
-
-typedef pair <string,string> key_value_t;
-typedef vector <key_value_t> ini_section_t;
-typedef multimap <string, ini_section_t*> ini_file_t;
-
-enum section_id_t {
-    production_section_id = 0,
-    ids_section_id = 1,
-    hw_conf_section_id = 2,
-    fw1_code_section_id = 3,
-    fw1_data_section_id = 4,
-    fw2_code_section_id = 5,
-    fw2_data_section_id = 6,
-    fw1_static_conf_section_id = 7,
-    fw2_static_conf_section_id = 8,
-    config_section_id = 9,
-    image_info_section_id = 10,
-    radio_tx_conf_section_id = 11,
-    radio_rx_conf_section_id = 12,
-    radio_tx_conf2_section_id = 13,
-    radio_rx_conf2_section_id = 14,
-    raw_data_section_id = 15,
-
-    // The Following is unused !
-    usb_info_section_id = 16,
-    user_conf_section_id = 17,
-    usb_section_id = 18,
-};
-
-#endif //#ifndef _INI_PARSER_TYPES_H_
diff --git a/debug-tools/wiburn/product.h b/debug-tools/wiburn/product.h
deleted file mode 100644
index e163c2f..0000000
--- a/debug-tools/wiburn/product.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _PRODUCT_H_
-#define _PRODUCT_H_
-
-#include "wiburn.h"
-
-#define MARLON_ID 612072
-#define SPARROW_ID 632072
-#define TALYN_ID 642072
-
-class IProduct
-{
-public:
-    IProduct(){}
-    virtual ~IProduct(void){}
-    virtual int Section2ID() = 0;
-};
-
-class talyn : public IProduct
-{
-public:
-   typedef u_int32_t REG;
-   typedef u_int32_t ADDRESS;
-   static const u_int64_t id = TALYN_ID;
-
-   virtual int Section2ID() {return 0;}
-};
-
-class sparrow : public IProduct
-{
-public:
-    typedef u_int32_t REG;
-    typedef u_int32_t ADDRESS;
-    static const u_int64_t id = SPARROW_ID;
-
-    virtual int Section2ID() {return 0;}
-};
-
-class marlon : public IProduct
-{
-public:
-    typedef u_int32_t REG;
-    typedef u_int32_t ADDRESS;
-    static const u_int64_t id = MARLON_ID;
-
-    virtual int Section2ID() {return 0;}
-};
-
-#endif //#ifndef _PRODUCT_H_
diff --git a/debug-tools/wiburn/template_inst.cpp b/debug-tools/wiburn/template_inst.cpp
deleted file mode 100644
index c1cdf42..0000000
--- a/debug-tools/wiburn/template_inst.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _TEMPLATE_INST_
-#define _TEMPLATE_INST_
-
-#include "product.h"
-
-#include "flash_sections.cpp"
-template class pointer_section_t<talyn>;
-template class pointer_section_t<sparrow>;
-template class pointer_section_t<marlon>;
-
-template class hw_section_t<talyn>;
-template class hw_section_t<sparrow>;
-template class hw_section_t<marlon>;
-
-template struct ids_section_t<talyn>;
-template struct ids_section_t<sparrow>;
-template struct ids_section_t<marlon>;
-
-template class info_section_t<talyn>;
-template class info_section_t<sparrow>;
-template class info_section_t<marlon>;
-
-
-#include "flash_image.cpp"
-template class flash_image<talyn>;
-template class flash_image<sparrow>;
-template class flash_image<marlon>;
-
-#include "ini_parser.cpp"
-template class ini_parser<talyn>;
-template class ini_parser<sparrow>;
-template class ini_parser<marlon>;
-
-//#include "flash.cpp"
-// template class flash<sparrow>;
-// template class flash<marlon>;
-// template class flash_file<sparrow>;
-// template class flash_file<marlon>;
-
-#endif
diff --git a/debug-tools/wiburn/translation_map.cpp b/debug-tools/wiburn/translation_map.cpp
deleted file mode 100644
index 627eacc..0000000
--- a/debug-tools/wiburn/translation_map.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "translation_map.h"
-
-#include "wlct_os.h"
-
-translation_map::translation_map ()
-{
-    //nothing to do
-}
-
-translation_map::~translation_map ()
-{
-    //nothing to do
-}
-
-bool translation_map::add_to_translation_map (const char* key, const char* address, const char* start, const char* end)
-{
-    u_int32_t int_address;
-    int int_start, int_end;
-    char *end_ptr;
-
-    int_address = (u_int32_t)strtoul(address, &end_ptr, 0);
-    if (0 != *end_ptr) {
-        ERR("Error converting %s to int\n", address);
-        EXIT (-1);
-    }
-
-    int_start = strtoul(start, &end_ptr, 0);
-    if (0 != *end_ptr) {
-        ERR("Error converting %s to int\n", start);
-        EXIT (-1);
-    }
-
-    int_end = strtoul(end, &end_ptr, 0);
-    if (0 != *end_ptr) {
-        ERR("Error converting %s to int\n", end);
-        EXIT (-1);
-    }
-
-    return add_to_translation_map(key, int_address, int_start, int_end);
-}
-
-
-bool translation_map::add_to_translation_map (const char* key, const u_int32_t address, const int start, const int end)
-{
-    full_address_t temp_address = {address, start, end};
-    string temp_string (key);
-    translation_map_t::value_type entry (key, temp_address);
-    pair <translation_map_t::iterator, bool> ret;
-    ret = m_map.insert(entry);
-    return (ret.second);
-}
-
-bool translation_map::get_from_translation_map (const char* key, u_int32_t *address, int *start, int *end) const
-{
-    translation_map_t::const_iterator iter;
-    string temp_string (key);
-    iter = m_map.find(temp_string);
-    if ( iter == m_map.end( ) )
-    {
-        return false;
-    } else {
-        *address = iter->second.address;
-        *start = iter->second.start;
-        *end = iter->second.end;
-        return true;
-    }
-}
-
diff --git a/debug-tools/wiburn/translation_map.h b/debug-tools/wiburn/translation_map.h
deleted file mode 100644
index d7bd823..0000000
--- a/debug-tools/wiburn/translation_map.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _TRANSLATION_MAP_H
-#define _TRANSLATION_MAP_H
-
-#include <map>
-#include <string>
-#include "wiburn.h"
-using namespace std;
-
-class translation_map
-{
-private:
-    typedef struct {
-        u_int32_t address;
-        int start;
-        int end;
-    } full_address_t;
-
-    typedef map <string, full_address_t> translation_map_t;
-
-private:
-    translation_map_t m_map;
-
-public:
-    translation_map ();
-    ~translation_map ();
-    bool add_to_translation_map (const char* key, const u_int32_t address, const int start, const int end);
-    bool add_to_translation_map (const char* key, const char* address, const char* start, const char* end);
-    bool get_from_translation_map (const char* key, u_int32_t *address, int *start, int *end) const;
-};
-
-#endif //#ifndef _TRANSLATION_MAP_H
diff --git a/debug-tools/wiburn/wiburn.cpp b/debug-tools/wiburn/wiburn.cpp
deleted file mode 100644
index 74a627a..0000000
--- a/debug-tools/wiburn/wiburn.cpp
+++ /dev/null
@@ -1,713 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "flash.h"
-#include "translation_map.h"
-#include "flash_image.h"
-#include <signal.h>
-#include "ParameterParser.h"
-#include "product.h"
-#include <iostream>
-
-#ifdef _WINDOWS
-bool g_debug = false;
-#else
-extern bool g_debug;
-#endif
-translation_map g_reg_tree_t_map;
-translation_map g_ucode_t_map;
-translation_map g_fw_t_map;
-
-extern u_int64_t current_fw_build;
-
-ini_parser_base *g_parser = 0;
-flash_base *g_flash = 0;
-
-volatile bool g_exit = false;
-
-int g_signals_for_termination[] = {
-    SIGINT,
-    SIGTERM
-};
-
-bool IsReduced();
-
-
-void EXIT (int val) {
-    delete g_flash;
-    exit (val);
-}
-
-bool get_interface (string *name) {
-    INFO("Acquiring available interfaces. Please wait...\n");
-    INTERFACE_LIST interfaces;
-    int num_items;
-    int res;
-    res = GetInterfaces(&interfaces, &num_items);
-    INFO("\n");
-
-    if (res != 0 || num_items == 0) {
-        return false;
-    }
-
-    if (num_items == 1 ) {
-        *name = interfaces.list[0].ifName;
-        INFO("Using the single available interface %s\n", interfaces.list[0].ifName);
-        return true;
-    }
-
-    printf("Please choose interface index:\n");
-    for (int i = 0; i < num_items; i++) {
-        std::cout << "[" << i << "] " << interfaces.list[i].ifName << std::endl;
-    }
-
-    u_int32_t index;
-    std::cin >> index;
-
-    if (!std::cin.good() || index >= (u_int32_t)num_items ) {
-        ERR("Invalid interface chosen\n");
-        EXIT (-1);
-    }
-
-    *name = interfaces.list[index].ifName;
-    return true;
-}
-
-void print_buffer(const void *buffer, int length)
-{
-    for(int i=0; i< length; i++) {
-        putchar(*((char*)(buffer) + i));
-    }
-}
-
-void set_exit_flag(bool bExit)
-{
-    g_exit = bExit;
-    if (g_flash)
-    {
-        g_flash->set_exit_flag(bExit);
-    }
-}
-
-void TerminationHandler (int signum)
-{
-    static int termination_cnt = 0;
-    if (signum == 0) {
-        INFO ("\nTrying to exit...\n");
-        set_exit_flag(true);
-        return;
-    }
-
-    termination_cnt++;
-
-    if (termination_cnt == 2) {
-        INFO ("\nTrying to exit...\n");
-        set_exit_flag(true);
-    }
-    else {
-        INFO ("\nWarning: Please wait for program normal termination or press ^C again to exit.\n");
-        signal(signum, TerminationHandler);
-        return;
-    }
-}
-
-void compatibility_check() {
-    /* const u_int64_t minimal_ver_supported = 2026;
-       if (current_fw_build < minimal_ver_supported) {
-       ERR("Current INI file is older than %lu and is not supported by this wiburn version !\n", (long unsigned int)minimal_ver_supported);
-       //EXIT (-1);
-       }*/
-}
-
-void param_parsing (ParameterParser *opt)
-{
-    opt->addFlag(  "-debug" ); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-verify" ); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-help" ); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-save"); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-burn" ); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-read" ); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-read_formatted" ); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-query" ); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-erase"); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-force"); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-ignore_lock"); /* a flag (takes no argument), supporting long and short form */
-    opt->addFlag(  "-read_ids_to_file"); /* a flag (takes no argument), supporting long and short form */
-
-    opt->addParam( "-bin" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-fw" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-board" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-board2" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-board3" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-setup_ini" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-ids" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-production" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-usb" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-interface" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-device" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-offset" );/* an option (takes an argument), supporting long and short form */
-    opt->addParam( "-length" );/* an option (takes an argument), supporting long and short form */
-}
-
-template <typename PRODUCT>
-void sub_main(bool burn,
-              bool erase,
-              bool burn_full_image,
-              bool query,
-              bool verify,
-              bool read,
-              bool read_formatted,
-              bool read_ids_to_file,
-              bool force,
-              const char* offset,
-              const char* length,
-              const char* bin_file,
-              const char* fw_ini_file,
-              const char* ids_ini_file,
-              const char* production_ini_file,
-              const char* board_ini_file,
-              const char* board_ini_file2,
-              const char* board_ini_file3,
-              const char* setup_ini_file,
-              const char* usb_ini_file)
-{
-    flash_image<PRODUCT>* new_flash_image = 0;
-    flash_image<PRODUCT>* old_flash_image = 0;
-
-    bool reducedSip = IsReduced();
-
-    if (reducedSip)
-    {
-        INFO("SIP type: REDUCED");
-    }
-    else
-    {
-        INFO("SIP type: FULL");
-    }
-
-    old_flash_image = new flash_image<PRODUCT>;
-    old_flash_image->init_pointer_section(g_flash);
-    old_flash_image->init_ids_section(g_flash, reducedSip);
-    const ids_section_t<PRODUCT> &ids = old_flash_image->get_ids_section();
-
-    if( read_ids_to_file ) {
-        INFO("\nReading current IDS section into file: %s\n", ids_ini_file);
-        ids.disp();
-        ids.disp_to_file( ids_ini_file );
-    }
-
-    // parse INI file if needed
-    if( burn ) {
-        new_flash_image = new flash_image<PRODUCT>;
-        if( bin_file ) {
-            INFO("\n######### Initializing from BIN file %s ###########\n", bin_file);
-            new_flash_image->init(bin_file);
-        } else {
-            if( fw_ini_file ) {
-                INFO("\n######### Initializing from FW INI file %s ###########\n", fw_ini_file);
-                g_parser->init(fw_ini_file);
-            }
-            if( ids_ini_file ) {
-                INFO("\n######### Initializing from IDs INI file %s ###########\n", ids_ini_file);
-                g_parser->init(ids_ini_file);
-            }
-            else
-            {
-                INFO("\n######### Taking IDs section from flash ###########\n");
-                new_flash_image->init_ids_section( g_flash, reducedSip );
-            }
-
-            if( production_ini_file ) {
-                INFO("\n######### Initializing from Production INI file %s ###########\n", production_ini_file);
-                g_parser->init(production_ini_file);
-            }
-            if( board_ini_file ) {
-                INFO("\n######### Initializing from Board INI file %s ###########\n", board_ini_file);
-                g_parser->init(board_ini_file);
-            }
-            if( board_ini_file2 ) {
-                INFO("\n######### Initializing from Board2 INI file %s ###########\n", board_ini_file2);
-                g_parser->init(board_ini_file2, 1);
-            }
-            if( board_ini_file3 ) {
-                INFO("\n######### Initializing from Board3 INI file %s ###########\n", board_ini_file3);
-                g_parser->init(board_ini_file3, 1);
-            }
-            if( setup_ini_file ) {
-                INFO("\n######### Initializing from setup_ini INI file %s ###########\n", setup_ini_file);
-                g_parser->init(setup_ini_file);
-            }
-            if( usb_ini_file ) {
-                INFO("\n######### Initializing from USB INI file %s ###########\n", usb_ini_file);
-                g_parser->init(usb_ini_file);
-            }
-            INFO("\n#########    Building flash sections    ###########\n");
-
-            if (!erase) {
-                new_flash_image->init_pointer_section(g_flash);
-            }
-
-            new_flash_image->init(g_parser, burn_full_image, reducedSip);
-            INFO("\n#########    Flash sections are ready   ###########\n");
-        }
-    }
-
-    if( query ) {
-        old_flash_image = new flash_image<PRODUCT>;
-        old_flash_image->init_pointer_section( g_flash );
-        old_flash_image->init_image_info_section( g_flash );
-        old_flash_image->init_ids_section( g_flash, reducedSip );
-//        old_flash_image->init_usb_info_section( g_flash );
-        const image_info_section_t<PRODUCT> &info = old_flash_image->get_image_info_section();
-        info.disp();
-        const ids_section_t<PRODUCT> &ids = old_flash_image->get_ids_section();
-        ids.disp();
-        const usb_info_section_t<PRODUCT> &usb_info = old_flash_image->get_usb_info_section();
-        usb_info.disp();
-    }
-
-    if( erase ) {
-        compatibility_check();
-        INFO("Erasing flash ...");
-        g_flash->erase();
-        INFO("done\n");
-    }
-
-    if( burn ) {
-        compatibility_check();
-        if (erase) {// Full image burn
-            INFO("Burning image...\n");
-            int res = g_flash->program(4, new_flash_image->get_image_size() - 4, new_flash_image->get_image() + 4, verify);
-
-            if (res != 0)  {
-                ERR("\nBurning failed !\n\n");
-                EXIT (-1);
-            }
-
-            INFO("Burning signature...\n");
-            g_flash->program(0, 4, new_flash_image->get_image(), verify);
-            INFO("Burning done\n");
-
-        } else {
-            flash_image<PRODUCT> *old_flash_image = new flash_image<PRODUCT>;
-            old_flash_image->init_pointer_section( g_flash );
-            const pointer_section_t<PRODUCT> &new_pointer_section = new_flash_image->get_pointer_section();
-            if( !(old_flash_image->get_pointer_section() == new_pointer_section )) {
-                ERR("Current INI file will cause changes in the pointer section."
-                    " Changes in pointer section are not supported\n");
-                //EXIT (-1);
-            }
-
-            ini_file_t::iterator dummy1;
-            ini_file_t::const_iterator dummy2;
-
-            const hw_section_t<PRODUCT> &new_hw_conf_section = new_flash_image->get_hw_conf_section();
-            const hw_section_t<PRODUCT> &old_hw_conf_section = old_flash_image->get_hw_conf_section();
-            if (!force ) {
-                string section_name = "hw_config";
-                if (g_parser->get_section(section_name, TRANSLATION_MAP_REGTREE, &dummy1, false, false)) {
-                    //if (g_parser->get_section(section_name, &dummy1, &dummy2, false)) {
-                    old_flash_image->init_hw_conf_section( g_flash );
-                    if( !(old_hw_conf_section == new_hw_conf_section ) ) {
-                        ERR("Current INI file will cause changes in the hw_configuration "
-                            "section. These changes may leave the device in an unstable state."
-                            " Use -force option to force the operation.\n");
-                        EXIT(-1);
-                    }
-                }
-            }
-
-            INFO("Burning image...\n");
-            // write all sections following the pointer_section.
-            // Only modified sections will be written.
-            // Unmodified sections will be skipped
-            u_int32_t start_offset = new_pointer_section.size() + sizeof(u_int32_t); //For CRC
-            g_flash->program(start_offset,
-                             new_flash_image->get_image_size() - start_offset,
-                             new_flash_image->get_image() + start_offset,
-                             verify);
-
-            INFO("Burning done\n");
-        }
-    }
-
-    if(read | read_formatted) {
-        char *end_ptr;
-        int int_offset = strtoul(offset, &end_ptr, 0);
-        if (*end_ptr != 0 ) {
-            ERR("Expected offset and got %s\n", offset);
-            EXIT(-1);
-        }
-        int int_length = strtoul(length, &end_ptr, 0);
-        if (*end_ptr != 0 ) {
-            ERR("Expected length and got %s\n", length);
-            EXIT(-1);
-        }
-
-        BYTE *tmp_buffer = new BYTE [int_length];
-        if (!tmp_buffer)
-        {
-            ERR("Cannot allocate temp buffer of size %d\n", int_length);
-            EXIT(-1);
-        }
-
-        g_flash->read(int_offset, int_length, tmp_buffer);
-
-        if (read_formatted) {
-            int step = 16;
-            for(int i = 0; i < int_length; i += step) {
-                printf("0x%05x:", int_offset+i);
-                for( int j = 0; j < min(step, int_length - i); j += 2 ) {
-                    printf(" 0x%04x", *(u_int16_t*)(tmp_buffer+i+j));
-                }
-                printf("\n");
-            }
-        } else {
-            for(int i = 0; i < int_length; i += 2) {
-                printf("0x%04x ", *(u_int16_t*)(tmp_buffer+i));
-            }
-            printf("\n");
-        }
-        delete[] tmp_buffer;
-
-    }
-
-    delete old_flash_image;
-    delete new_flash_image;
-
-    EXIT(0);
-}
-
-bool IsReduced()
-{
-    u_int32_t verifyAddress = 256 * 1024;
-
-    BYTE testSequence[8] = {0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x64, 0x21}; // ASCII for "Reduced!"
-    BYTE verifySequence[8] = {0, 0, 0, 0, 0, 0, 0, 0};
-    BYTE originalData[4096] = {1};
-    BYTE manipulatedData[4096] = {2};
-
-    // Save the original data to be restored later
-    g_flash->read(verifyAddress, sizeof(originalData), originalData);
-    //INFO("1. %d %d %d\n", verifyAddress, sizeof(originalData), originalData);
-
-    memcpy(manipulatedData, originalData, sizeof(originalData));
-    memcpy(manipulatedData, testSequence, sizeof(testSequence));
-    //INFO("%s\n",manipulatedData);
-
-    // We are writing the testSequence to an address which will not exist in reduced SIP (which is 64K) with verify set to true
-    g_flash->program(verifyAddress /*This address will not exist in reduced SIP*/, sizeof(manipulatedData), manipulatedData, true);
-
-    //INFO("2. %d %d %d\n", verifyAddress, sizeof(manipulatedData), manipulatedData);
-    g_flash->read(verifyAddress & ((64 * 1024) - 1), sizeof(verifySequence), verifySequence);
-
-    // Restore the original data
-    g_flash->clear_erased(verifyAddress);
-    g_flash->program(verifyAddress, sizeof(originalData), originalData, true);
-    //INFO("3. %d %d %d\n", verifyAddress, sizeof(originalData), originalData);
-
-    if (0 == memcmp(testSequence, verifySequence, sizeof(testSequence)))
-    {
-        return true;
-    }
-    //else
-    {
-        return false;
-    }
-}
-
-int main(int argc, char *argv[])
-{
-    const char *fw_ini_file;
-    const char *bin_file;
-    const char *board_ini_file;
-    const char *board_ini_file2;
-    const char *board_ini_file3;
-    const char *setup_ini_file;
-    const char *ids_ini_file;
-    const char *production_ini_file;
-    const char *usb_ini_file;
-    const char *flash_image_file;
-    const char *interface_name;
-    const char *device_type_string;
-    DType device_type = MST_NONE;
-    string str_interface_name;
-    const char *offset;
-    const char *length;
-    bool erase, verify, save, burn, read, read_formatted, query, force, read_ids_to_file;
-    bool ignore_lock, burn_full_image;
-
-//    printf("Press enter to debug ErezK..");
-//    getchar();
-
-    //
-    // Map termination signal handlers
-    //
-    //int i;
-//     for (i = 0 ; i < (int)(sizeof(g_signals_for_termination)/sizeof(g_signals_for_termination[0])) ; i++ ) {
-//         signal (g_signals_for_termination[i], TerminationHandler);
-//     }
-
-    //
-    // command line parsing
-    //
-    ParameterParser *opt = new ParameterParser();
-    param_parsing(opt);
-    if (opt->processCommandArgs( argc, argv ) != 0) {
-        EXIT (-1);
-    }
-
-    if( opt->getFlag( "-help" ) ) {
-        opt->printUsage();
-        EXIT(0);
-    }
-
-    flash_image_file = opt->getValue( "-bin" );
-    fw_ini_file = opt->getValue( "-fw" );
-    bin_file = opt->getValue( "-bin" );
-    ids_ini_file = opt->getValue( "-ids" );
-    production_ini_file = opt->getValue( "-production" );
-    board_ini_file = opt->getValue( "-board" );
-    board_ini_file2 = opt->getValue( "-board2" );
-    board_ini_file3 = opt->getValue( "-board3" );
-    setup_ini_file = opt->getValue( "-setup_ini" );
-    usb_ini_file = opt->getValue( "-usb" );
-    interface_name = opt->getValue( "-interface" );
-    device_type_string = opt->getValue( "-device" );
-    offset = opt->getValue( "-offset" );
-    length = opt->getValue( "-length" );
-    g_debug = opt->getFlag( "-debug" );
-    erase = opt->getFlag( "-erase" );
-    verify = opt->getFlag( "-verify" );// | opt->getFlag( 'v' );
-    save = opt->getFlag( "-save" );
-    burn = opt->getFlag( "-burn" );// | opt->getFlag( 'b' );
-    read = opt->getFlag( "-read" ); //| opt->getFlag( 'r' );
-    read_formatted = opt->getFlag( "-read_formatted" ); //| opt->getFlag( 'r' );
-    query = opt->getFlag( "-query" );
-    force = opt->getFlag( "-force" );
-    ignore_lock = opt->getFlag ("-ignore_lock" );
-    read_ids_to_file = opt->getFlag ("-read_ids_to_file" );
-
-    WLCT_UNREFERENCED_PARAM(flash_image_file);
-    WLCT_UNREFERENCED_PARAM(save);
-
-    //
-    // check missing/extra params
-    //
-    bool has_ini_file = fw_ini_file != 0 || ids_ini_file != 0 || usb_ini_file != 0 || board_ini_file != 0 || board_ini_file2 != 0 || board_ini_file3 != 0 || production_ini_file != 0;
-    bool has_bin_file = bin_file != 0;
-    bool missing_ini_file = board_ini_file == 0 && board_ini_file2 != 0 && board_ini_file3 != 0;
-
-    if ( burn ) {
-        if ( !(has_ini_file | has_bin_file)) {
-            ERR("option -burn require INI or BIN file name\nUse wiburn -h for usage info\n");
-            EXIT(-1);
-        }
-        if ( has_ini_file && has_bin_file) {
-            ERR("option -burn require INI or BIN file name. Not both\nUse wiburn -h for usage info\n");
-            EXIT(-1);
-        }
-        if ( missing_ini_file ) {
-            ERR("option -board2/-board3 require -board.\nUse wiburn -h for usage info\n");
-            EXIT(-1);
-        }
-    }
-
-    if (read_ids_to_file) {
-        if (ids_ini_file == 0) {
-            ERR("option -read_ids_to_file require IDS file name.\nUse wiburn -h for usage info\n");
-            EXIT(-1);
-        }
-        if(burn){
-            INFO("\nCurrent IDS section will not be changed !\n\n");
-        }
-    }
-
-    if ( burn | erase | read | read_formatted | query | read_ids_to_file) {
-        if (interface_name == 0) {
-            if( get_interface(&str_interface_name) == false ) {
-                ERR("Missing interface name\nUse wiburn -h for usage info\n");
-                EXIT(-1);
-            } else {
-                interface_name = str_interface_name.c_str();
-            }
-        }
-    }
-
-    if (read | read_formatted) {
-        if( length == 0 || offset == 0 ) {
-            ERR("Missing length or offset\nUse wiburn -h for usage info\n");
-            EXIT(-1);
-        }
-    }
-
-
-
-    burn_full_image = burn && erase;
-
-    //
-    // DLL info
-    //
-    WLCT_DLL_VERSION dll_ver;
-    GetMyVersion(&dll_ver);
-    INFO("Using DLL version %d.%d.%d.%d\n",
-         dll_ver.major,
-         dll_ver.minor,
-         dll_ver.maintenance,
-         dll_ver.build );
-
-    if (device_type_string == 0) {
-        ERR("Missing device type\nUse wiburn -h for usage info\n");
-        EXIT(-1);
-    }
-    else
-    {
-        if( strcmp("MARLON", device_type_string) == 0 )
-        {
-            device_type = MST_MARLON;
-        }
-        else if( strcmp("SPARROW", device_type_string) == 0 )
-        {
-            device_type = MST_SPARROW;
-        }
-        else if( strcmp("TALYN", device_type_string) == 0 )
-        {
-            device_type = MST_TALYN;
-        }
-        else
-        {
-            ERR("Unknown device type %s. Supported device types are SPARROW and MARLON\n", device_type_string);
-            EXIT(-1);
-        }
-    }
-
-    //
-    // Start executing
-    //
-    if ( burn | erase | query)
-    {
-        if( device_type == MST_MARLON )
-        {
-            g_parser = new ini_parser<marlon>;
-        }
-        else if( device_type == MST_SPARROW )
-        {
-            g_parser = new ini_parser<sparrow>;
-        }
-        else if( device_type == MST_TALYN )
-        {
-            g_parser = new ini_parser<talyn>;
-        }
-        else {
-            ERR("Unknown device type %s. Supported device types are SPARROW and MARLON\n", device_type_string);
-            EXIT(-1);
-        }
-    }
-
-    if (burn | erase | read | read_formatted | query | read_ids_to_file) {
-        if (strchr(interface_name, '.') != NULL) {
-            g_flash = new flash_file(device_type);
-        } else {
-            g_flash = new flash(device_type);
-        }
-        if (g_flash->open(interface_name, device_type, ignore_lock) != 0)
-        {
-            ERR("Can't open device %s with specified type %s.\n", interface_name, device_type_string);
-            EXIT(-1);
-        }
-    }
-
-    if (device_type == MST_TALYN) {
-        sub_main<talyn> (burn,
-                         erase,
-                         burn_full_image,
-                         query,
-                         verify,
-                         read,
-                         read_formatted,
-                         read_ids_to_file,
-                         force,
-                         offset,
-                         length,
-                         bin_file,
-                         fw_ini_file,
-                         ids_ini_file,
-                         production_ini_file,
-                         board_ini_file,
-                         board_ini_file2,
-                         board_ini_file3,
-                         setup_ini_file,
-                         usb_ini_file);
-    }
-    if (device_type == MST_SPARROW) {
-        sub_main<sparrow> (burn,
-                           erase,
-                           burn_full_image,
-                           query,
-                           verify,
-                           read,
-                           read_formatted,
-                           read_ids_to_file,
-                           force,
-                           offset,
-                           length,
-                           bin_file,
-                           fw_ini_file,
-                           ids_ini_file,
-                           production_ini_file,
-                           board_ini_file,
-                           board_ini_file2,
-                           board_ini_file3,
-                           setup_ini_file,
-                           usb_ini_file);
-    } else {
-        sub_main<marlon> (burn,
-                          erase,
-                          burn_full_image,
-                          query,
-                          verify,
-                          read,
-                          read_formatted,
-                          read_ids_to_file,
-                          force,
-                          offset,
-                          length,
-                          bin_file,
-                          fw_ini_file,
-                          ids_ini_file,
-                          production_ini_file,
-                          board_ini_file,
-                          board_ini_file2,
-                          board_ini_file3,
-                          setup_ini_file,
-                          usb_ini_file);
-    }
-
-}
-
diff --git a/debug-tools/wiburn/wiburn.h b/debug-tools/wiburn/wiburn.h
deleted file mode 100644
index bd195f6..0000000
--- a/debug-tools/wiburn/wiburn.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _WIBURN_H_
-#define _WIBURN_H_
-
-extern bool g_debug;
-extern volatile bool g_exit;
-
-#ifdef _WINDOWS
-#include <windows.h>
-
-#define STRTOULL _strtoui64
-
-typedef unsigned __int8 u_int8_t;
-typedef unsigned __int16 u_int16_t;
-typedef unsigned __int32 u_int32_t;
-typedef unsigned __int64 u_int64_t;
-#if (defined(_MSC_VER) && (_MSC_VER < 1900))
-typedef __int8 int8_t;
-#endif
-typedef __int16 int16_t;
-typedef __int32 int32_t;
-typedef __int64 int64_t;
-
-#else //#ifdef _WINDOWS
-
-#define STRTOULL strtoull
-
-#include <sys/types.h>
-typedef u_int8_t u_int8_t;
-typedef u_int16_t u_int16_t;
-typedef u_int32_t u_int32_t;
-typedef u_int64_t u_int64_t;
-typedef int8_t int8_t;
-typedef int16_t int16_t;
-typedef int32_t int32_t;
-typedef int64_t int64_t;
-#endif  //#ifdef _WINDOWS
-
-typedef u_int32_t ADDRESS32;
-
-typedef u_int8_t BYTE;
-typedef u_int32_t IMAGE;
-
-
-#define PAGE 256
-#define FLASH_PAGE_MASK 0xffffff00
-#define SUB_SECTOR (16*PAGE) // 4KB
-#define SUB_SECTOR_MASK 0xfffff000
-#define SECTOR (16*SUB_SECTOR) // 64KB
-
-#define ERR printf
-#define DBG printf
-#define INFO printf
-
-void EXIT( int val );
-
-void print_buffer(const void *buffer, int length);
-#endif //#ifndef _WIBURN_H_
