[hamradio-commits] [limesuite] 01/09: New upstream version 17.02.1+dfsg

Andreas E. Bombe aeb at moszumanska.debian.org
Thu Mar 30 23:19:29 UTC 2017


This is an automated email from the git hooks/post-receive script.

aeb pushed a commit to branch master
in repository limesuite.

commit bae5b9d9af7734d998b9124c21f3be698ab3d002
Author: Andreas Bombe <aeb at debian.org>
Date:   Wed Mar 29 14:49:21 2017 +0200

    New upstream version 17.02.1+dfsg
---
 .travis.yml                                        |   58 +
 CMakeLists.txt                                     |   14 +-
 Changelog.txt                                      |   46 +
 README.md                                          |    5 +
 SoapyLMS7/Registration.cpp                         |    3 +
 SoapyLMS7/Settings.cpp                             |   50 +-
 SoapyLMS7/SoapyLMS7.h                              |    4 +
 appveyor.yml                                       |   62 +
 cmake/DownloadImages.cmake                         |   41 +
 cmake/Modules/Findlibusb-1.0.cmake                 |    8 +-
 debian/changelog                                   |   31 +
 debian/control                                     |   32 +-
 debian/copyright                                   |    2 +-
 ...16.12-1.install => liblimesuite17.02-1.install} |    0
 debian/limesuite-images17.02.dirs                  |    1 +
 debian/limesuite-images17.02.postinst              |   37 +
 debian/limesuite-images17.02.prerm                 |   12 +
 debian/rules                                       |    3 +
 docs/Lime_Suite_Compilation_Guide.odt              |  Bin 0 -> 193085 bytes
 docs/Lime_Suite_Compilation_Guide.pdf              |  Bin 0 -> 415962 bytes
 docs/lms7suite_compilation_guide.odt               |  Bin 282915 -> 0 bytes
 docs/lms7suite_compilation_guide.pdf               |  Bin 358635 -> 0 bytes
 mcu_program/common_src/lms7002m_calibrations.c     |    3 +-
 mcu_program/common_src/lms7002m_controls.c         |    1 +
 mcu_program/host_src/mcu.c                         |   11 +-
 mcu_program/host_src/spi.cpp                       |   10 +-
 octave/LimeSuite.cc                                |   60 +-
 octave/rx.m                                        |    6 +-
 src/ADF4002/ADF4002_wxgui.cpp                      |    6 +-
 src/API/lms7_api.cpp                               |   67 +-
 src/API/lms7_device.cpp                            |  158 +-
 src/API/lms7_device.h                              |    3 +
 src/CMakeLists.txt                                 |    7 +
 src/ConnectionNovenaRF7/CMakeLists.txt             |   11 +-
 .../ConnectionNovenaRF7_streaming.cpp              |    2 +-
 src/ConnectionNovenaRF7/StreamChannel.cpp          |    2 +-
 src/ConnectionRegistry/ConnectionHandle.cpp        |   19 +-
 src/ConnectionRegistry/IConnection.cpp             |   11 +-
 src/ConnectionRegistry/IConnection.h               |   45 +-
 src/ConnectionSTREAM/CMakeLists.txt                |    1 +
 src/ConnectionSTREAM/ConnectionSTREAM.cpp          |  187 +-
 src/ConnectionSTREAM/ConnectionSTREAM.h            |   13 +-
 src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp     |  136 +-
 src/ConnectionSTREAM/ConnectionSTREAMImages.cpp    |  190 ++
 src/ConnectionSTREAM/ConnectionSTREAMing.cpp       |  163 +-
 .../ConnectionSTREAM_UNITE.cpp                     |    4 +-
 .../ConnectionSTREAM_UNITE.h                       |    2 +-
 .../ConnectionSTREAM_UNITEEntry.cpp                |   44 +-
 src/ConnectionXillybus/ConnectionXillybus.cpp      |  570 ++--
 src/ConnectionXillybus/ConnectionXillybus.h        |   28 +-
 src/ConnectionXillybus/ConnectionXillybusing.cpp   |  197 +-
 src/Connection_uLimeSDR/Connection_uLimeSDR.cpp    |  144 +-
 .../Connection_uLimeSDREntry.cpp                   |  112 +-
 src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp |  111 +-
 src/FPGA_common/FPGA_common.cpp                    |  168 +-
 src/FPGA_common/FPGA_common.h                      |    7 +-
 src/GFIR/gfir_lms.c                                |    2 +-
 src/LMS_Programing/LMS_Programing_wxgui.cpp        |   42 +-
 src/LMS_Programing/LMS_Programing_wxgui.h          |    1 +
 src/LimeUtil.cpp                                   |   77 +-
 src/SystemResources.h                              |   68 +
 src/SystemResources.in.cpp                         |  205 ++
 src/VersionInfo.h                                  |    2 +-
 src/boards_wxgui/pnlLimeSDR.cpp                    |    6 +-
 src/boards_wxgui/pnlUltimateEVB.cpp                |  154 +
 src/boards_wxgui/pnlUltimateEVB.h                  |   50 +
 src/examples/basicRX.cpp                           |    4 +-
 src/examples/dualRXTX.cpp                          |   14 +-
 src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp      |  201 +-
 src/fftviewer_wxgui/fftviewer_frFFTviewer.h        |    9 +-
 src/fftviewer_wxgui/fftviewer_wxgui.cpp            |    4 +-
 src/fftviewer_wxgui/fftviewer_wxgui.fbp            |    4 +-
 src/lime/LimeSuite.h                               |   44 +-
 src/lms7002_wxgui/CoefficientFileParser.cpp        |   26 +-
 src/lms7002_wxgui/CoefficientFileParser.h          |    8 +-
 src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp |   12 +-
 src/lms7002_wxgui/lms7002_mainPanel.cpp            |    7 +
 src/lms7002_wxgui/lms7002_mainPanel.h              |    2 +
 src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp       |   12 +-
 src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h         |    2 +
 src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp |   19 +
 src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp       |    6 +-
 src/lms7002_wxgui/lms7002_pnlR3.cpp                |  862 +++++
 src/lms7002_wxgui/lms7002_pnlR3.h                  |   83 +
 src/lms7002_wxgui/lms7002_pnlRBB_view.cpp          |    2 +-
 src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp        |    1 +
 src/lms7002_wxgui/lms7002_pnlSX_view.cpp           |   18 +
 src/lms7002_wxgui/lms7002_pnlSX_view.h             |    3 +
 src/lms7002_wxgui/lms7002_wxgui.cpp                |  338 +-
 src/lms7002_wxgui/lms7002_wxgui.fbp                | 3479 +++++++++++++++++++-
 src/lms7002_wxgui/lms7002_wxgui.h                  |   59 +
 src/lms7002_wxgui/pnlBoardControls.cpp             |   97 +-
 src/lms7002_wxgui/pnlBoardControls.h               |    2 +-
 src/lms7002m/CalibrationCache.cpp                  |   25 +-
 src/lms7002m/LMS7002M.cpp                          |   10 +-
 src/lms7002m/LMS7002M_RegistersMap.cpp             |    4 +-
 src/lms7002m/LMS7002M_RxTxCalibrations.cpp         |   32 +-
 src/lms7002m/LMS7002M_filtersCalibration.cpp       |    6 +
 src/lms7002m/LMS7002M_parameters.cpp               |  153 +-
 src/lms7002m/LMS7002M_parameters.h                 |   96 +-
 src/lms7002m_mcu/MCU_BD.cpp                        |    1 +
 src/lms7002m_mcu/MCU_File.h                        |    2 +-
 src/lms7suiteAppFrame.cpp                          |    6 +-
 src/lms7suiteApp_gui.cpp                           |    2 +-
 src/oglGraph/OpenGLGraph.cpp                       |    4 +-
 src/oglGraph/dlgMarkers.cpp                        |    4 +-
 src/protocols/ILimeSDRStreaming.cpp                |   51 +-
 src/protocols/ILimeSDRStreaming.h                  |    4 +-
 src/protocols/LMS64CProtocol.cpp                   |   40 +-
 src/protocols/LMS64CProtocol.h                     |    3 +
 src/protocols/LMSBoards.h                          |  124 +-
 src/protocols/dataTypes.h                          |    2 +-
 src/protocols/fifo.h                               |    8 +-
 src/utilities_gui/dlgConnectionSettings.cpp        |    5 +-
 src/windowFunction.cpp                             |   61 +-
 src/windowFunction.h                               |    2 +-
 udev-rules/64-limesuite.rules                      |    1 +
 117 files changed, 8122 insertions(+), 1357 deletions(-)

diff --git a/.travis.yml b/.travis.yml
new file mode 100755
index 0000000..cb2c117
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,58 @@
+########################################################################
+## Travis CI config for LimeSuite
+##
+## * not all components will be configured
+## * the matrix builds Release and Debug
+## * for linux + gcc, and osx + clang
+########################################################################
+
+sudo: required
+dist: trusty
+
+language: cpp
+
+matrix:
+  include:
+    - os: linux
+      compiler: gcc
+    - os: osx
+      compiler: clang
+
+env:
+  global:
+    - INSTALL_PREFIX=/usr/local
+    - SOAPY_SDR_BRANCH=master
+    - BUILD_TYPE=Release
+
+# whitelist
+branches:
+  only:
+    - master
+    - stable
+
+before_install:
+
+  # update after package changes
+  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi;
+  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
+
+  # install development dependencies
+  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -qq libusb-1.0-0-dev cmake libwxbase3.0-dev libwxgtk3.0-dev;fi;
+  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libusb wxmac ; fi
+
+install:
+
+  # install SoapySDR from source
+  - git clone https://github.com/pothosware/SoapySDR.git
+  - pushd SoapySDR
+  - git checkout ${SOAPY_SDR_BRANCH}
+  - mkdir build && cd build
+  - cmake ../ -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
+  - make && sudo make install
+  - popd
+
+script:
+  - mkdir temp && cd temp
+  - cmake ../ -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_STREAM_UNITE=ON
+  - make -j2
+  - sudo make install
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ba2abcf..da90ec5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,9 +26,9 @@ endif()
 # Manually increment these numbers when creating releases.
 # LIME_SUITE_API_VERSION in VersionInfo.h reflects the major/minor,
 # and must be set manually when non-patch releases are created.
-set(VERSION_MAJOR 16)
-set(VERSION_MINOR 12)
-set(VERSION_PATCH 0)
+set(VERSION_MAJOR 17)
+set(VERSION_MINOR 02)
+set(VERSION_PATCH 1)
 
 # the ABI compatibility number should be incremented when the ABI changes
 # the format is to use the same major and minor, but to have an incrementing
@@ -51,6 +51,13 @@ set(LIME_SUITE_LIBVER "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
 set(LIME_SUITE_VERSION "${LIME_SUITE_LIBVER}-${LIME_SUITE_EXTVER}")
 string(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%d")
 
+#LIME_SUITE_ROOT is compiled into the library to locate the install base.
+#By default, the LIME_SUITE_ROOT is set to the CMAKE_INSTALL_PREFIX.
+#However users may overload this by specifying -DLIME_SUITE_ROOT=<path>.
+set(LIME_SUITE_ROOT "${CMAKE_INSTALL_PREFIX}" CACHE PATH
+    "Installation root for lime::getLimeSuiteRoot()")
+file(TO_CMAKE_PATH "${LIME_SUITE_ROOT}" LIME_SUITE_ROOT)
+
 ########################################################################
 ## compiler flags
 ########################################################################
@@ -172,6 +179,7 @@ message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
 message(STATUS "Build timestamp: ${BUILD_TIMESTAMP}")
 message(STATUS "Lime Suite version: ${LIME_SUITE_VERSION}")
 message(STATUS "ABI/so version: ${LIME_SUITE_SOVER}")
+include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadImages.cmake)
 
 ########################################################################
 # uninstall target
diff --git a/Changelog.txt b/Changelog.txt
new file mode 100644
index 0000000..af0cd1e
--- /dev/null
+++ b/Changelog.txt
@@ -0,0 +1,46 @@
+Release 17.02.1 (2017-03-11)
+==========================
+
+- Fix ILimeSDRStreaming fifo size power of two issue
+
+Release 17.02.0 (2017-03-07)
+==========================
+
+- Automatic phase configuration for DIQ clocks
+- Fix FFT avg amplitudes when MIMO is enabled
+- Fix free usb device list for STREAM connection
+- Device handle display and label improvements
+- General fixes for LimeSDR-PCIE support
+- Add gain control with dB value (for RX only)
+
+Release 17.01.1 (2017-02-03)
+==========================
+
+- Updated LimeSDR rev1.4 gateware images to version 2.6
+- LMS7 API: Fix CGEN clock config in LMS_SetClockFreq()
+- Fix debug assertion in FFT viewer wx format string
+- LMS7 API: Fix NCO down/upconvert for new chip rev
+- Fix NCO tuning sign in SoapyLMS7 for LMS7 silicon rev
+- Fixed bug in downloadImageResource() call for windows
+- Updated LimeSDR images for USB enumeration problem fix
+
+Release 17.01.0 (2017-01-22)
+==========================
+
+- Support filter by serial for ConnectionSTREAM
+- Added resource location API and image update API
+- configure LML clock phases based on interface freq
+- LimeSDR: detect reference clock presence on connect
+- Set CMIX setting in calib/tune based on chip version
+
+Release 16.12.1 (2017-01-22)
+==========================
+
+- Minor compilation fixes for OSX/clang (narrowing)
+- Improve cmake check for novena connection i2c support
+- Fix abs() overload for mcu lms7002m calibrations
+
+Release 16.12.0 (2016-12-31)
+==========================
+
+This is the first changelog entry for LimeSuite
diff --git a/README.md b/README.md
index 2a613b3..7de4cb3 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,11 @@ Read more about Lime Suite on the official project page:
 
 * https://myriadrf.org/projects/lime-suite/
 
+##Build Status
+
+- Travis: [![Travis Build Status](https://travis-ci.org/myriadrf/LimeSuite.svg?branch=master)](https://travis-ci.org/myriadrf/LimeSuite)
+- AppVeyor: [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/stwfarvq0j01qyaq)](https://ci.appveyor.com/project/myriadrf/limesuite)
+
 ## Documentation
 
 Find build and install instructions for Lime Suite on the wiki:
diff --git a/SoapyLMS7/Registration.cpp b/SoapyLMS7/Registration.cpp
index 08686bd..08a0c19 100644
--- a/SoapyLMS7/Registration.cpp
+++ b/SoapyLMS7/Registration.cpp
@@ -36,6 +36,9 @@ static SoapySDR::Kwargs handleToArgs(const ConnectionHandle &handle)
     if (not handle.serial.empty()) args["serial"] = handle.serial;
     if (handle.index != -1) args["index"] = std::to_string(handle.index);
 
+    //label connection for drop-downs and lists
+    args["label"] = handle.ToString();
+
     return args;
 }
 
diff --git a/SoapyLMS7/Settings.cpp b/SoapyLMS7/Settings.cpp
index 5d13373..ddc3308 100644
--- a/SoapyLMS7/Settings.cpp
+++ b/SoapyLMS7/Settings.cpp
@@ -405,6 +405,27 @@ std::vector<std::string> SoapyLMS7::listGains(const int direction, const size_t
     return gains;
 }
 
+void SoapyLMS7::setGain(const int direction, const size_t channel, const double value)
+{
+    std::unique_lock<std::recursive_mutex> lock(_accessMutex);
+
+    //Distribute Rx gain from elements in the direction of RFE to RBB
+    //This differs from the default gain distribution in that it
+    //does not scale the gain to the negative range of the PGA.
+    //This keep the PGA in mid-range unless extreme values are used.
+    if (direction == SOAPY_SDR_RX)
+    {
+        double remaining(value);
+        for (const auto &name : this->listGains(direction, channel))
+        {
+            this->setGain(direction, channel, name, remaining);
+            remaining -= this->getGain(direction, channel, name);
+        }
+    }
+
+    else SoapySDR::Device::setGain(direction, channel, value);
+}
+
 void SoapyLMS7::setGain(const int direction, const size_t channel, const std::string &name, const double value)
 {
     std::unique_lock<std::recursive_mutex> lock(_accessMutex);
@@ -494,6 +515,16 @@ double SoapyLMS7::getGain(const int direction, const size_t channel, const std::
     else throw std::runtime_error("SoapyLMS7::getGain("+name+") - unknown gain name");
 }
 
+SoapySDR::Range SoapyLMS7::getGainRange(const int direction, const size_t channel) const
+{
+    if (direction == SOAPY_SDR_RX)
+    {
+        //make it so gain of 0.0 sets PGA at its mid-range
+        return SoapySDR::Range(-12.0, 19.0+12.0+30.0);
+    }
+    return SoapySDR::Device::getGainRange(direction, channel);
+}
+
 SoapySDR::Range SoapyLMS7::getGainRange(const int direction, const size_t channel, const std::string &name) const
 {
     if (direction == SOAPY_SDR_RX and name == "LNA") return SoapySDR::Range(0.0, 30.0);
@@ -559,15 +590,17 @@ void SoapyLMS7::setFrequency(const int direction, const size_t channel, const st
 
     if (name == "BB")
     {
+        int pos = 0, neg = 1;
         switch (direction)
         {
         case SOAPY_SDR_RX:
+            if (rfic->Get_SPI_Reg_bits(LMS7_MASK, true) != 0) std::swap(pos, neg);
             rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP), (frequency == 0)?1:0);
-            rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), (frequency < 0)?1:0);
+            rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), (frequency < 0)?neg:pos);
             break;
         case SOAPY_SDR_TX:
             rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_TXTSP), (frequency == 0)?1:0);
-            rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP), (frequency < 0)?1:0);
+            rfic->Modify_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP), (frequency < 0)?neg:pos);
             break;
         }
         if (rfic->SetNCOFrequency(lmsDir, 0, abs(frequency)) != 0)
@@ -595,7 +628,18 @@ double SoapyLMS7::getFrequency(const int direction, const size_t channel, const
 
     if (name == "BB")
     {
-        int sign = rfic->Get_SPI_Reg_bits(lmsDir==LMS7002M::Tx?LMS7param(CMIX_SC_TXTSP):LMS7param(CMIX_SC_RXTSP)) == 0 ? 1 : -1;
+        int sign = 0;
+        int pos = 0, neg = 1;
+        switch (direction)
+        {
+        case SOAPY_SDR_RX:
+            if (rfic->Get_SPI_Reg_bits(LMS7_MASK, true) != 0) std::swap(pos, neg);
+            sign = (rfic->Get_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP)) == pos) ? 1 : -1;
+            break;
+        case SOAPY_SDR_TX:
+            sign = (rfic->Get_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP)) == pos) ? 1 : -1;
+            break;
+        }
         return rfic->GetNCOFrequency(lmsDir, 0) * sign;
     }
 
diff --git a/SoapyLMS7/SoapyLMS7.h b/SoapyLMS7/SoapyLMS7.h
index 5fdd19a..115f830 100644
--- a/SoapyLMS7/SoapyLMS7.h
+++ b/SoapyLMS7/SoapyLMS7.h
@@ -134,10 +134,14 @@ public:
 
     std::vector<std::string> listGains(const int direction, const size_t channel) const;
 
+    void setGain(const int direction, const size_t channel, const double value);
+
     void setGain(const int direction, const size_t channel, const std::string &name, const double value);
 
     double getGain(const int direction, const size_t channel, const std::string &name) const;
 
+    SoapySDR::Range getGainRange(const int direction, const size_t channel) const;
+
     SoapySDR::Range getGainRange(const int direction, const size_t channel, const std::string &name) const;
 
     /*******************************************************************
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100755
index 0000000..fe38012
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,62 @@
+version: '{build}'
+branches:
+  only:
+  - stable
+  - master
+image: Visual Studio 2015
+clone_folder: c:\projects\limesuite
+environment:
+  WXWIDGETS_ROOT_DIR: C:\projects\deps\wxWidgets
+  FX3_SDK_PATH: C:\projects\deps\FX3SDK
+  CONFIGURATION: RelWithDebInfo
+  matrix:
+  - CMAKE_GENERATOR: Visual Studio 14 2015
+    WXWIDGETS_LIBS_DIR: C:\projects\deps\wxWidgets\lib\vc140_dll
+    WXWIDGETS_LIBS_DOWNLOAD_LINK: https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.0/wxMSW-3.1.0_vc140_Dev.7z
+  - CMAKE_GENERATOR: Visual Studio 14 2015 Win64
+    WXWIDGETS_LIBS_DIR: C:\projects\deps\wxWidgets\lib\vc140_x64_dll
+    WXWIDGETS_LIBS_DOWNLOAD_LINK: https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.0/wxMSW-3.1.0_vc140_x64_Dev.7z
+install:
+- cmd: >-
+    mkdir C:\projects\deps
+
+    cd C:\projects\deps
+
+    appveyor DownloadFile "%WXWIDGETS_LIBS_DOWNLOAD_LINK%" -FileName wxMSW-3.1.0_Dev.7z
+
+    7z x wxMSW-3.1.0_Dev.7z -oC:\projects\deps\wxWidgets > nul
+
+    appveyor DownloadFile https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.0/wxWidgets-3.1.0-headers.7z wxWidgets-3.1.0-headers.7z
+
+    7z x wxWidgets-3.1.0-headers.7z -oC:\\projects\\deps\\wxWidgets > nul
+
+    appveyor DownloadFile http://downloads.myriadrf.org/project/limesuite/appveyor/FX3SDK.zip FX3SDK.zip
+
+    7z x FX3SDK.zip -oC:\projects\deps\FX3SDK > nul
+
+    git clone https://github.com/pothosware/SoapySDR.git
+
+    cd SoapySDR
+
+    mkdir build && cd build
+
+    cmake ../ -G "%CMAKE_GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION%
+
+    cmake --build . --config %CONFIGURATION%
+
+    cmake --build . --config %CONFIGURATION%  --target install
+
+
+build_script:
+- cmd: >-
+    cmake --version
+
+    cd c:\projects\limesuite
+
+    mkdir temp
+
+    cd temp
+
+    cmake .. -G "%CMAKE_GENERATOR%" -DCMAKE_PREFIX_PATH="%WXWIDGETS_LIBS_DIR%" -DwxWidgets_LIB_DIR="%WXWIDGETS_LIBS_DIR%" -DwxWidgets_ROOT_DIR="%WXWIDGETS_ROOT_DIR%" -DFX3_SDK_PATH="%FX3_SDK_PATH%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DENABLE_STREAM_UNITE=ON
+
+    cmake --build . --config %CONFIGURATION%
diff --git a/cmake/DownloadImages.cmake b/cmake/DownloadImages.cmake
new file mode 100644
index 0000000..46c390c
--- /dev/null
+++ b/cmake/DownloadImages.cmake
@@ -0,0 +1,41 @@
+########################################################################
+## Download limesuite images upon configure
+## Recommended for source-based build environments
+########################################################################
+if (NOT DOWNLOAD_IMAGES)
+    return()
+endif ()
+
+message(STATUS "")
+message(STATUS "######################################################")
+message(STATUS "## DOWNLOAD_IMAGES=${DOWNLOAD_IMAGES} specified; syncing images...")
+message(STATUS "######################################################")
+
+#download support constants
+set(SOURCE_URL "http://downloads.myriadrf.org/project/limesuite/${VERSION_MAJOR}.${VERSION_MINOR}")
+set(TEMP_DEST "${CMAKE_CURRENT_BINARY_DIR}/images/${VERSION_MAJOR}.${VERSION_MINOR}")
+set(INSTALL_DEST "share/LimeSuite/images/${VERSION_MAJOR}.${VERSION_MINOR}")
+set(HREF_MATCHER "href=\\\"([\\._A-Za-z_0-9-]+)\\\"")
+
+#conditional download when file is missing
+function(DOWNLOAD_URL url file)
+    if (EXISTS ${file})
+        message(STATUS "Already downloaded ${url}")
+    else ()
+        message(STATUS "Downloading ${url}...")
+        file(DOWNLOAD "${url}" "${file}")
+    endif ()
+endfunction(DOWNLOAD_URL)
+
+#get a list of images from the url index
+file(MAKE_DIRECTORY "${TEMP_DEST}")
+DOWNLOAD_URL("${SOURCE_URL}" "${TEMP_DEST}/index.html")
+file(READ "${TEMP_DEST}/index.html" index_html)
+string(REGEX MATCHALL "${HREF_MATCHER}" matches "${index_html}")
+
+#download each image in the index and create install rule
+foreach (match ${matches})
+    string(REGEX MATCHALL "${HREF_MATCHER}" __tmp "${match}")
+    DOWNLOAD_URL("${SOURCE_URL}/${CMAKE_MATCH_1}" "${TEMP_DEST}/${CMAKE_MATCH_1}")
+    install(FILES "${TEMP_DEST}/${CMAKE_MATCH_1}" DESTINATION ${INSTALL_DEST})
+endforeach(match)
diff --git a/cmake/Modules/Findlibusb-1.0.cmake b/cmake/Modules/Findlibusb-1.0.cmake
index ec40055..82f6da1 100644
--- a/cmake/Modules/Findlibusb-1.0.cmake
+++ b/cmake/Modules/Findlibusb-1.0.cmake
@@ -59,9 +59,13 @@ else (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS)
 	  libusb-1.0
   )
 
+  set(LIBUSB_1_LIBRARY_NAME usb-1.0)
+  if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
+    set(LIBUSB_1_LIBRARY_NAME usb)
+  endif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
+
   find_library(LIBUSB_1_LIBRARY
-    NAMES
-      usb-1.0 usb
+    NAMES ${LIBUSB_1_LIBRARY_NAME}
     PATHS
       /usr/lib
       /usr/local/lib
diff --git a/debian/changelog b/debian/changelog
index 16e102c..037f9b5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,34 @@
+limesuite (17.02.1-1) unstable; urgency=low
+
+  * Release 17.02.1 (2017-03-11)
+  * Fix debian packaging for 17.02 ABI
+
+ -- Lime Microsystems <info at limemicro.com>  Sat, 11 Mar 2017 15:36:30 -0800
+
+limesuite (17.02.0-1) unstable; urgency=low
+
+  * Release 17.02.0 (2017-03-07)
+
+ -- Lime Microsystems <info at limemicro.com>  Tue, 07 Mar 2017 12:57:30 -0800
+
+limesuite (17.01.1-1) unstable; urgency=low
+
+  * Release 17.01.1 (2017-02-03)
+
+ -- Lime Microsystems <info at limemicro.com>  Fri, 03 Feb 2017 19:20:52 -0800
+
+limesuite (17.01.0-1) unstable; urgency=low
+
+  * Release 17.01.0 (2017-01-22)
+
+ -- Lime Microsystems <info at limemicro.com>  Sun, 22 Jan 2017 13:06:52 -0800
+
+limesuite (16.12.1-1) unstable; urgency=low
+
+  * Release 16.12.1 (2017-01-22)
+
+ -- Lime Microsystems <info at limemicro.com>  Sun, 22 Jan 2017 10:50:11 -0800
+
 limesuite (16.12.0-1) unstable; urgency=low
 
   * updated debian packaging for 16.12.0 release
diff --git a/debian/control b/debian/control
index 45ff9db..ea7cc7a 100644
--- a/debian/control
+++ b/debian/control
@@ -16,13 +16,13 @@ Homepage: https://myriadrf.org/projects/lime-suite/
 Vcs-Git: https://github.com/myriadrf/LimeSuite.git
 Vcs-Browser: https://github.com/myriadrf/LimeSuite.git
 
-Package: liblimesuite16.12-1
+Package: liblimesuite17.02-1
 Section: libs
 Architecture: any
 Multi-Arch: same
 Pre-Depends: ${misc:Pre-Depends}
 Depends: ${shlibs:Depends}, ${misc:Depends}
-Recommends: limesuite-udev
+Recommends: limesuite-udev, limesuite-images
 Description: Lime Suite - shared library
  Lime Suite application software.
 
@@ -30,7 +30,7 @@ Package: liblimesuite-dev
 Section: libdevel
 Architecture: any
 Depends:
-    liblimesuite16.12-1 (= ${binary:Version}),
+    liblimesuite17.02-1 (= ${binary:Version}),
     ${misc:Depends}
 Description: Lime Suite - development files
  Lime Suite application software.
@@ -39,7 +39,7 @@ Package: limesuite
 Section: comm
 Architecture: any
 Depends:
-    liblimesuite16.12-1 (= ${binary:Version}),
+    liblimesuite17.02-1 (= ${binary:Version}),
     ${shlibs:Depends},
     ${misc:Depends},
     xdg-utils
@@ -59,7 +59,7 @@ Section: comm
 Architecture: any
 Multi-Arch: same
 Depends:
-    liblimesuite16.12-1 (= ${binary:Version}),
+    liblimesuite17.02-1 (= ${binary:Version}),
     ${shlibs:Depends},
     ${misc:Depends},
     python, python-soapysdr
@@ -73,3 +73,25 @@ Multi-Arch: same
 Depends: ${shlibs:Depends}, ${misc:Depends}, udev
 Description: Lime Suite - USB rules for udev
  Lime Suite application software.
+
+Package: limesuite-images17.02
+Section: libs
+Architecture: any
+Multi-Arch: same
+Depends: ${shlibs:Depends}, ${misc:Depends}, wget
+Description: Lime Suite - Install firmware and gateware images
+ Lime Suite application software.
+ .
+ This is dummy package that downloads the images from the web.
+
+Package: limesuite-images
+Section: libs
+Architecture: any
+Multi-Arch: same
+Depends: ${shlibs:Depends}, ${misc:Depends}, limesuite-images17.02
+Description: Lime Suite - Install firmware and gateware images
+ Lime Suite application software.
+ .
+ This is an empty dependency package that pulls in the images
+ for the default version of Lime Suite.
+
diff --git a/debian/copyright b/debian/copyright
index f3d7e98..73e056a 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -3,7 +3,7 @@ Upstream-Name: limesuite
 Source: https://myriadrf.org/projects/lime-suite/
 
 Files: *
-Copyright: 2015-2016 Lime Microsystems <info at limemicro.com>
+Copyright: 2015-2017 Lime Microsystems <info at limemicro.com>
 License: Apache-2.0
  On Debian systems, the full text of the Apache
  License version 2.0 can be found in the file
diff --git a/debian/liblimesuite16.12-1.install b/debian/liblimesuite17.02-1.install
similarity index 100%
rename from debian/liblimesuite16.12-1.install
rename to debian/liblimesuite17.02-1.install
diff --git a/debian/limesuite-images17.02.dirs b/debian/limesuite-images17.02.dirs
new file mode 100644
index 0000000..dfc3841
--- /dev/null
+++ b/debian/limesuite-images17.02.dirs
@@ -0,0 +1 @@
+/usr/share/LimeSuite/images/
diff --git a/debian/limesuite-images17.02.postinst b/debian/limesuite-images17.02.postinst
new file mode 100644
index 0000000..08731da
--- /dev/null
+++ b/debian/limesuite-images17.02.postinst
@@ -0,0 +1,37 @@
+#!/bin/sh
+set -e
+
+RELEASE_NUM="17.02"
+DEST_DIR="/usr/share/LimeSuite/images/${RELEASE_NUM}"
+SOURCE_URL="http://downloads.myriadrf.org/project/limesuite/${RELEASE_NUM}/"
+
+if [ "$1" = "configure" ]; then
+	echo "Downloading ${SOURCE_URL} -> ${DEST_DIR}"
+
+	DOWNLOAD_TMP=$(mktemp --directory)
+	wget \
+		--recursive --level=1 \
+		--no-host-directories \
+		--no-directories \
+		--no-parent \
+		--reject="index.html*" \
+		--directory-prefix="${DOWNLOAD_TMP}" \
+		"${SOURCE_URL}"
+
+	#cleanup and error out when wget fails
+	if [ $? -ne 0 ]; then
+		echo "Download failed!"
+		rm --force --recursive "${DOWNLOAD_TMP}"
+		exit 1
+	fi
+
+	#successful download, move tmp to destination
+	echo "Moving images to ${DEST_DIR}"
+	mv "${DOWNLOAD_TMP}" "${DEST_DIR}"
+
+	#fix permissions since this was a temp dir
+	chmod ug+rwx "${DEST_DIR}"
+	chmod o+rx "${DEST_DIR}"
+fi
+
+#DEBHELPER#
diff --git a/debian/limesuite-images17.02.prerm b/debian/limesuite-images17.02.prerm
new file mode 100644
index 0000000..778d583
--- /dev/null
+++ b/debian/limesuite-images17.02.prerm
@@ -0,0 +1,12 @@
+#!/bin/sh
+set -e
+
+RELEASE_NUM="17.01"
+DEST_DIR="/usr/share/LimeSuite/images/${RELEASE_NUM}"
+
+if [ "$1" = "remove" -o "$1" = "purge" ]; then
+	echo "Removing directory ${DEST_DIR}"
+	rm --force --recursive "${DEST_DIR}"
+fi
+
+#DEBHELPER#
diff --git a/debian/rules b/debian/rules
index 3e7e49a..b35a9a1 100644
--- a/debian/rules
+++ b/debian/rules
@@ -24,3 +24,6 @@ override_dh_auto_configure:
 		-DUDEV_RULES_PATH=/lib/udev/rules.d \
 		-DLIB_SUFFIX="/$(DEB_HOST_MULTIARCH)" \
 		-DLIME_SUITE_EXTVER="$(DEB_VERSION_EXTVER)"
+
+override_dh_installchangelogs:
+	dh_installchangelogs Changelog.txt
diff --git a/docs/Lime_Suite_Compilation_Guide.odt b/docs/Lime_Suite_Compilation_Guide.odt
new file mode 100644
index 0000000..6fec71d
Binary files /dev/null and b/docs/Lime_Suite_Compilation_Guide.odt differ
diff --git a/docs/Lime_Suite_Compilation_Guide.pdf b/docs/Lime_Suite_Compilation_Guide.pdf
new file mode 100644
index 0000000..5a1080d
Binary files /dev/null and b/docs/Lime_Suite_Compilation_Guide.pdf differ
diff --git a/docs/lms7suite_compilation_guide.odt b/docs/lms7suite_compilation_guide.odt
deleted file mode 100644
index ec31db5..0000000
Binary files a/docs/lms7suite_compilation_guide.odt and /dev/null differ
diff --git a/docs/lms7suite_compilation_guide.pdf b/docs/lms7suite_compilation_guide.pdf
deleted file mode 100644
index 074de65..0000000
Binary files a/docs/lms7suite_compilation_guide.pdf and /dev/null differ
diff --git a/mcu_program/common_src/lms7002m_calibrations.c b/mcu_program/common_src/lms7002m_calibrations.c
index 10b1351..527271e 100644
--- a/mcu_program/common_src/lms7002m_calibrations.c
+++ b/mcu_program/common_src/lms7002m_calibrations.c
@@ -5,6 +5,7 @@
 #include <math.h>
 
 #ifdef __cplusplus
+#include <cstdlib>
 #define VERBOSE 1
 //#define DRAW_GNU_PLOTS
 
@@ -65,7 +66,7 @@ static uint8_t toDCOffset(const int8_t offset)
 {
     if(offset >= 0)
         return offset;
-    return abs(offset) | 0x40;
+    return (uint8_t)(abs((int)offset) | 0x40);
 }
 
 static void FlipRisingEdge(const uint16_t addr, const uint8_t bits)
diff --git a/mcu_program/common_src/lms7002m_controls.c b/mcu_program/common_src/lms7002m_controls.c
index cbc40f1..c2cc184 100644
--- a/mcu_program/common_src/lms7002m_controls.c
+++ b/mcu_program/common_src/lms7002m_controls.c
@@ -6,6 +6,7 @@
 
 #ifdef __cplusplus
 #include <cmath>
+#include <cstdlib>
 using namespace std;
 #include <chrono>
 #include <thread>
diff --git a/mcu_program/host_src/mcu.c b/mcu_program/host_src/mcu.c
index 1b8c113..1f29cf1 100644
--- a/mcu_program/host_src/mcu.c
+++ b/mcu_program/host_src/mcu.c
@@ -14,7 +14,12 @@ void MCU_RunProcedure(uint8_t id)
     const uint16_t x0002reg = SPI_read(0x0002) & 0xFF;
     const uint16_t interupt6 = 0x0008;
     const uint16_t addrs[5] = {0x0006, 0x0, 0x0002, 0x0002, 0x0002};
-    const uint16_t values[5] = {id != 0, id, x0002reg & ~interupt6, x0002reg | interupt6, x0002reg & ~interupt6};
+    const uint16_t values[5] = {
+        (uint16_t)(id != 0),
+        (uint16_t)(id),
+        (uint16_t)(x0002reg & ~interupt6),
+        (uint16_t)(x0002reg | interupt6),
+        (uint16_t)(x0002reg & ~interupt6)};
     SPI_write_batch(addrs, values, 5);
 }
 
@@ -67,10 +72,10 @@ uint8_t MCU_SetParameter(MCU_Parameter param, float value)
 
 uint8_t MCU_UploadProgram(const uint8_t* binImage, const uint16_t len)
 {
-#ifdef __cplusplus
+#ifndef NDEBUG
     auto timeStart = std::chrono::high_resolution_clock::now();
-    const auto timeout = std::chrono::milliseconds(100);
 #endif // NDEBUG
+    const auto timeout = std::chrono::milliseconds(100);
     uint16_t i;
     const uint32_t controlAddr = 0x0002;
     const uint32_t statusReg = 0x0003;
diff --git a/mcu_program/host_src/spi.cpp b/mcu_program/host_src/spi.cpp
index 088ce90..b7225b1 100644
--- a/mcu_program/host_src/spi.cpp
+++ b/mcu_program/host_src/spi.cpp
@@ -42,7 +42,7 @@ void Modify_SPI_Reg_bits_WrOnly(const uint16_t SPI_reg_addr, const uint8_t bits,
     if(batchActive)
     {
     bool found = false;
-    for(int i=0; i<bAddr.size(); ++i)
+    for(size_t i=0; i<bAddr.size(); ++i)
     {
         if(bAddr[i] == SPI_reg_addr)
         {
@@ -71,7 +71,7 @@ void Modify_SPI_Reg_bits(const uint16_t SPI_reg_addr, const uint8_t bits, const
     if(batchActive)
     {
     bool found = false;
-    for(int i=0; i<bAddr.size(); ++i)
+    for(size_t i=0; i<bAddr.size(); ++i)
     {
         if(bAddr[i] == SPI_reg_addr)
         {
@@ -119,7 +119,7 @@ void SPI_write_batch(const uint16_t *addr, const uint16_t *values, uint8_t cnt)
         if(batchActive)
         {
             bool found = false;
-            for(int i=0; i<bAddr.size(); ++i)
+            for(size_t i=0; i<bAddr.size(); ++i)
             {
                 if(bAddr[i] == addr[i])
                 {
@@ -154,9 +154,9 @@ int BeginBatch(const char* name)
 void EndBatch()
 {
     //sort batch
-    for(int i=0; i<bAddr.size(); ++i)
+    for(size_t i=0; i<bAddr.size(); ++i)
     {
-        for(int j=i; j<bAddr.size(); ++j)
+        for(size_t j=i; j<bAddr.size(); ++j)
         {
             if(bAddr[i] > bAddr[j])
             {
diff --git a/octave/LimeSuite.cc b/octave/LimeSuite.cc
index 08b8019..b34ff4c 100644
--- a/octave/LimeSuite.cc
+++ b/octave/LimeSuite.cc
@@ -10,6 +10,7 @@ using namespace std;
 void FreeResources();
 
 lms_device_t* lmsDev = NULL;
+lms_stream_t streamConfig;
 
 struct complex16_t
 {
@@ -20,15 +21,14 @@ struct complex16_t
 bool WFMrunning = false;
 const int chCount = 1;
 const int samplesMaxCount = 16*1360/chCount;
-complex16_t** rxbuffers = NULL;
-complex16_t** txbuffers = NULL;
+complex16_t* rxbuffers = NULL;
+complex16_t* txbuffers = NULL;
 
 void StopStream()
 {
     if(lmsDev == NULL)
         return;
-    LMS_StopStream(lmsDev, false);
-    LMS_StopStream(lmsDev, true);
+    LMS_StopStream(&streamConfig);
 }
 
 void PrintDeviceInfo(lms_device_t* port)
@@ -86,13 +86,8 @@ DEFUN_DLD (LimeInitialize, args, nargout,
                   << nargin << " input arguments and "
                   << nargout << " output arguments.\n";
 
-    rxbuffers = new complex16_t*[chCount];
-    for(int i=0; i<chCount; ++i)
-        rxbuffers[i] = new complex16_t[samplesMaxCount];
-
-    txbuffers = new complex16_t*[chCount];
-    for(int i=0; i<chCount; ++i)
-        txbuffers[i] = new complex16_t[samplesMaxCount];
+    rxbuffers = new complex16_t[samplesMaxCount];
+    txbuffers = new complex16_t[samplesMaxCount];
 
     return octave_value(0);
 }
@@ -149,23 +144,18 @@ DEFUN_DLD (LimeStartStreaming, args, nargout,
         return octave_value(-1);
     }
 
-    lms_stream_conf_t streamConfig;
     if(nargin > 0)
         streamConfig.fifoSize = args(0).int_value();
     else
         streamConfig.fifoSize = 1360*64;
-    streamConfig.transferSize = 65536;
-    streamConfig.numTransfers = 16;
-    streamConfig.channels = 1;
-    streamConfig.dataFmt = lms_stream_conf_t::LMS_FMT_I16;
-    streamConfig.linkFmt = lms_stream_conf_t::LMS_LINK_12BIT;
+    streamConfig.throughputVsLatency = 0.5;
+    streamConfig.channel = 0;
+    streamConfig.dataFmt = lms_stream_t::LMS_FMT_I12;
 
-    if(LMS_SetupStream(lmsDev, streamConfig) != 0)
+    if(LMS_SetupStream(lmsDev, &streamConfig) != 0)
         octave_stdout << LMS_GetLastErrorMessage() << endl;
 
-    if(LMS_StartStream(lmsDev, false) != 0)
-        octave_stdout << LMS_GetLastErrorMessage() << endl;
-    if(LMS_StartStream(lmsDev, true) != 0)
+    if(LMS_StartStream(&streamConfig) != 0)
         octave_stdout << LMS_GetLastErrorMessage() << endl;
     return octave_value_list();
 }
@@ -200,7 +190,7 @@ DEFUN_DLD (LimeReceiveSamples, args, , "wfm = LimeReceiveSamplesLarge( samplesCo
     const int timeout_ms = 1000;
     lms_stream_meta_t meta;
     int samplesCollected = 0;
-    
+
     while(samplesCollected < samplesToReceive)
     {
         int samplesToRead = 0;
@@ -208,10 +198,10 @@ DEFUN_DLD (LimeReceiveSamples, args, , "wfm = LimeReceiveSamplesLarge( samplesCo
             samplesToRead = samplesMaxCount;
         else
             samplesToRead = samplesToReceive-samplesCollected;
-        int samplesRead = LMS_RecvStream(lmsDev, (void**)rxbuffers, samplesToRead, &meta, timeout_ms);
+        int samplesRead = LMS_RecvStream(&streamConfig, (void*)rxbuffers, samplesToRead, &meta, timeout_ms);
         for(int i=0; i<samplesRead; ++i)
         {
-            iqdata(samplesCollected+i)=Complex(rxbuffers[0][i].i/2048.0,rxbuffers[0][i].q/2048.0);
+            iqdata(samplesCollected+i)=Complex(rxbuffers[i].i/2048.0,rxbuffers[i].q/2048.0);
         }
         samplesCollected += samplesRead;
     }
@@ -238,16 +228,16 @@ DEFUN_DLD (LimeTransmitSamples, args, , "LimeTransmitSamples( wfm, timestamp)")
         Complex iqdatum2 = iqdatum.complex_value();
         short i_sample = iqdatum2.real(); //
         short q_sample = iqdatum2.imag(); //
-        txbuffers[0][i].i = i_sample;
-        txbuffers[0][i].q = q_sample;
+        txbuffers[i].i = i_sample;
+        txbuffers[i].q = q_sample;
     }
 
     const int timeout_ms = 1000;
     lms_stream_meta_t meta;
-    meta.has_timestamp = false;
+    meta.waitForTimestamp = false;
     meta.timestamp = 0;
     int samplesWrite = samplesCount;
-    samplesWrite = LMS_SendStream(lmsDev, (const void**)txbuffers, samplesCount, &meta, timeout_ms);
+    samplesWrite = LMS_SendStream(&streamConfig, (const void*)txbuffers, samplesCount, &meta, timeout_ms);
 
     return octave_value ();
 }
@@ -288,8 +278,8 @@ DEFUN_DLD (LimeLoopWFMStart, args, , "LimeTxLoopWFMStart (wfm)")
         wfmBuffers[0][i].q = q_sample;
     }
 
-    LMS_StreamStartLoopWFM(lmsDev, (const void**)wfmBuffers, samplesCount);
-
+    LMS_UploadWFM(lmsDev, (const void**)wfmBuffers, 1, samplesCount, 0);
+    LMS_EnableTxWFM(lmsDev,true);
     for(int i=0; i<chCount; ++i)
         delete wfmBuffers[i];
     delete wfmBuffers;
@@ -305,7 +295,7 @@ DEFUN_DLD (LimeLoopWFMStop, args, , "LimeTxLoopWFMStop")
         return octave_value(-1);
     }
     if(WFMrunning)
-        LMS_StreamStopLoopWFM(lmsDev);
+        LMS_EnableTxWFM(lmsDev,false);
     WFMrunning = false;
     return octave_value ();
 }
@@ -315,23 +305,19 @@ void FreeResources()
     if(lmsDev)
     {
         if(WFMrunning)
-            LMS_StreamStopLoopWFM(lmsDev);
+            LMS_EnableTxWFM(lmsDev,false);
         StopStream();
-        LMS_DestroyStream(lmsDev);
+        LMS_DestroyStream(lmsDev,&streamConfig);
         LMS_Close(lmsDev);
         lmsDev = NULL;
     }
     if(rxbuffers)
     {
-        for(int i=0; i<chCount; ++i)
-            delete rxbuffers[i];
         delete rxbuffers;
         rxbuffers = NULL;
     }
     if(txbuffers)
     {
-        for(int i=0; i<chCount; ++i)
-            delete txbuffers[i];
         delete txbuffers;
         txbuffers = NULL;
     }
diff --git a/octave/rx.m b/octave/rx.m
index 7414193..a3abb73 100644
--- a/octave/rx.m
+++ b/octave/rx.m
@@ -2,9 +2,9 @@ LoadLimeSuite
 
 LimeInitialize()
 LimeLoadConfig('rxTest.ini');
-samplesToBuffer = 1023*64*10; %octave has array limit around 20M
+samplesToBuffer = 1024*64; %octave has array limit around 20M
 
-batches = 60;
+batches = 32;
 FIFOsize = samplesToBuffer*batches % total number of samples to be buffered inside DLL, they will be contiguous
 LimeStartStreaming(FIFOsize);
 
@@ -25,6 +25,6 @@ end
 LimeStopStreaming();
 LimeDestroy();
 
-%plot(real(samplesBatch1));
+plot(real(samplesBatch1));
 %plot(real(samplesBatch2));
 %plot(real(samplesBatch3));
diff --git a/src/ADF4002/ADF4002_wxgui.cpp b/src/ADF4002/ADF4002_wxgui.cpp
index 5c404be..b59d274 100644
--- a/src/ADF4002/ADF4002_wxgui.cpp
+++ b/src/ADF4002/ADF4002_wxgui.cpp
@@ -421,7 +421,9 @@ void ADF4002_wxgui::Initialize(lms_device_t* pSerPort)
     lmsControl = pSerPort;
     if (lmsControl != nullptr)
     {
-        //m_adf4002SpiAddr = serPort->GetDeviceInfo().addrADF4002;
+        double refclk;
+        LMS_GetReferenceClock(lmsControl, &refclk);
+        txtFvco->SetValue(wxString::Format("%f", refclk/1e6));
     }
 }
 
@@ -547,7 +549,7 @@ void ADF4002_wxgui::OnbtnUploadClick(wxCommandEvent& event)
 
     config.fRef=-1;
     config.fVCO=-1;
-    
+
     spinNCnt->SetValue(config.nCounter);
     spinRCnt->SetValue(config.referenceCounter);
 
diff --git a/src/API/lms7_api.cpp b/src/API/lms7_api.cpp
index 5fec904..270d13c 100644
--- a/src/API/lms7_api.cpp
+++ b/src/API/lms7_api.cpp
@@ -516,8 +516,6 @@ API_EXPORT int CALL_CONV LMS_SetClockFreq(lms_device_t *device, size_t clk_id, f
         case LMS_CLOCK_CGEN:
         {
             int ret;
-            float_type fpgaTxPLL = lms->GetReferenceClk_TSP(lime::LMS7002M::Tx) / pow(2.0, lms->Get_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP)));
-            float_type fpgaRxPLL = lms->GetReferenceClk_TSP(lime::LMS7002M::Rx) / pow(2.0, lms->Get_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP)));
             if (freq <= 0)
             {
                 ret = lms->TuneVCO(lime::LMS7002M::VCO_CGEN);
@@ -534,6 +532,8 @@ API_EXPORT int CALL_CONV LMS_SetClockFreq(lms_device_t *device, size_t clk_id, f
                 lime::ReportError(EINVAL, "Device not connected");
                 return -1;
             }
+            float_type fpgaTxPLL = lms->GetReferenceClk_TSP(lime::LMS7002M::Tx) / pow(2.0, lms->Get_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP)));
+            float_type fpgaRxPLL = lms->GetReferenceClk_TSP(lime::LMS7002M::Rx) / pow(2.0, lms->Get_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP)));
             return conn->UpdateExternalDataRate(0,fpgaTxPLL/2,fpgaRxPLL/2);
         }
         case LMS_CLOCK_RXTSP:
@@ -1081,6 +1081,26 @@ API_EXPORT int CALL_CONV LMS_SetNormalizedGain(lms_device_t *device, bool dir_tx
    return lms->SetNormalizedGain(dir_tx,chan,gain);
 }
 
+API_EXPORT int CALL_CONV LMS_SetGaindB(lms_device_t *device, bool dir_tx,
+                                                size_t chan,unsigned gain)
+{
+    if (device == nullptr)
+    {
+        lime::ReportError(EINVAL, "Device cannot be NULL.");
+        return -1;
+    }
+
+    LMS7_Device* lms = (LMS7_Device*)device;
+
+    if (chan >= lms->GetNumChannels(dir_tx))
+    {
+        lime::ReportError(EINVAL, "Invalid channel number.");
+        return -1;
+    }
+
+   return lms->SetGain(dir_tx,chan,gain);
+}
+
 API_EXPORT int CALL_CONV LMS_GetNormalizedGain(lms_device_t *device, bool dir_tx, size_t chan,float_type *gain)
 {
     if (device == nullptr)
@@ -1103,6 +1123,28 @@ API_EXPORT int CALL_CONV LMS_GetNormalizedGain(lms_device_t *device, bool dir_tx
     return LMS_SUCCESS;
 }
 
+API_EXPORT int CALL_CONV LMS_GetGaindB(lms_device_t *device, bool dir_tx, size_t chan, unsigned *gain)
+{
+    if (device == nullptr)
+    {
+        lime::ReportError(EINVAL, "Device cannot be NULL.");
+        return -1;
+    }
+
+    LMS7_Device* lms = (LMS7_Device*)device;
+
+    if (chan >= lms->GetNumChannels(dir_tx))
+    {
+        lime::ReportError(EINVAL, "Invalid channel number.");
+        return -1;
+    }
+
+    *gain = lms->GetGain(dir_tx,chan);
+    if (gain < 0)
+        return -1;
+    return LMS_SUCCESS;
+}
+
 API_EXPORT int CALL_CONV LMS_Calibrate(lms_device_t *device, bool dir_tx, size_t chan, double bw, unsigned flags)
 {
     if (device == nullptr)
@@ -1440,10 +1482,10 @@ API_EXPORT int CALL_CONV LMS_ReadParam(lms_device_t *device, struct LMS7Paramete
         return -1;
     }
     LMS7_Device* lms = (LMS7_Device*)device;
-    bool forceReadFromChip = false; //bypass returning values from cache
+    bool forceReadFromChip = true; //bypass returning values from cache
     //registers containing read only registers, which values can change
     const uint16_t readOnlyRegs[] = {0,1,2,3,4,5,6, 0x002F, 0x008C, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0123, 0x0209, 0x020A, 0x020B, 0x040E, 0x040F};
-    for(int i = 0; i < sizeof(readOnlyRegs) / sizeof(uint16_t); ++i)
+    for(size_t i = 0; i < sizeof(readOnlyRegs) / sizeof(uint16_t); ++i)
     {
         if(param.address == readOnlyRegs[i])
         {
@@ -1537,7 +1579,7 @@ API_EXPORT int CALL_CONV LMS_SetupStream(lms_device_t *device, lms_stream_t *str
     LMS7_Device* lms = (LMS7_Device*)device;
 
     lime::StreamConfig config;
-    config.bufferLength = 65536;
+    config.bufferLength = stream->fifoSize;
     config.channelID = stream->channel;
     config.performanceLatency = stream->throughputVsLatency;
     switch(stream->dataFmt)
@@ -1633,6 +1675,9 @@ API_EXPORT int CALL_CONV LMS_UploadWFM(lms_device_t *device,
         case 2:
             fmt = lime::StreamConfig::StreamDataFormat::STREAM_COMPLEX_FLOAT32;
             break;
+        default:
+            fmt = lime::StreamConfig::StreamDataFormat::STREAM_12_BIT_COMPRESSED;
+            break;
     }
     return lms->GetConnection()->UploadWFM(samples, chCount, sample_count, fmt);
 }
@@ -1779,6 +1824,18 @@ API_EXPORT int CALL_CONV LMS_ProgramHPM7File(lms_device_t *device, const char *f
     return lms->ProgramHPM7(file,mode,callback);
 }
 
+API_EXPORT int CALL_CONV LMS_ProgramUpdate(lms_device_t *device, const bool download, lms_prog_callback_t callback)
+{
+    if (device == nullptr)
+    {
+        lime::ReportError(EINVAL, "Device cannot be NULL.");
+        return -1;
+    }
+
+    LMS7_Device* lms = (LMS7_Device*)device;
+    return lms->ProgramUpdate(download,callback);
+}
+
 API_EXPORT int CALL_CONV LMS_ProgramLMSMCU(lms_device_t *device, const char *data,
                                               size_t size, lms_target_t target, lms_prog_callback_t callback)
 {
diff --git a/src/API/lms7_device.cpp b/src/API/lms7_device.cpp
index 9ba17f0..bdadd1d 100644
--- a/src/API/lms7_device.cpp
+++ b/src/API/lms7_device.cpp
@@ -384,7 +384,7 @@ int LMS7_Device::SetRate(bool tx, float_type f_Hz, size_t oversample)
    }
 
 
-   if (nco_rx != 0 || nco_rx != 0)
+   if (nco_rx != 0 || nco_tx != 0)
    {
        retain_nco = true;
        min_int = 2+2*(nco_tx-1)/tx_channels[0].sample_rate;
@@ -616,7 +616,12 @@ int LMS7_Device::SetRate(bool tx, float_type f_Hz, size_t oversample)
         }
     }
 
-   return 0;
+    float_type fpgaTxPLL = GetReferenceClk_TSP(lime::LMS7002M::Tx) /
+                            pow(2.0, Get_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP)));
+    float_type fpgaRxPLL = GetReferenceClk_TSP(lime::LMS7002M::Rx) /
+                            pow(2.0, Get_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP)));
+
+    return this->streamPort->UpdateExternalDataRate(0,fpgaTxPLL/2,fpgaRxPLL/2);
 }
 
 
@@ -932,30 +937,10 @@ int LMS7_Device::SetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, const float_
     else
         div = (2<<(ratio));
 
-
-    L = div > 8 ? 8 : div;
-    div -= 1;
-
-    /*if (filt==LMS_GFIR3)
-    {
-       if (L*15 < count)
-       {
-           lime::ReportError(ERANGE, "Too many filter coefficients for current oversampling settings");
-           ret = -1;;
-           L = 1+(count-1)/15;
-           div = L-1;
-       }
-    }
+    if ((div > 8) || (count == 120) || (count == 40 && filt != LMS_GFIR3))
+        L = 8;
     else
-    {
-       if (L*5 < count)
-       {
-           lime::ReportError(ERANGE, "Too many filter coefficients for current oversampling settings");
-           ret = -1;
-           L = 1+(count-1)/5;
-           div = L-1;
-       }
-    }*/
+        L = div;
 
     float_type max=0;
     for (int i=0; i< (filt==LMS_GFIR3 ? 120 : 40); i++)
@@ -963,7 +948,9 @@ int LMS7_Device::SetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, const float_
             max=fabs(coef[i]);
 
     if (max < 1.0)
-        max = 1.0;
+        max = 1.0f;
+    else if (max > 100)
+        max = 32767.0f;
 
     size_t sample = 0;
     for(int i=0; i< (filt==LMS_GFIR3 ? 15 : 5); i++)
@@ -982,7 +969,8 @@ int LMS7_Device::SetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, const float_
         }
     }
 
-    L-=1;
+    div -= 1;
+    L = div > 7 ? 7 : div;
 
     if (tx)
     {
@@ -1045,7 +1033,7 @@ int LMS7_Device::GetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, float_type*
        for (int i = 0; i < (filt==LMS_GFIR3 ? 120 : 40) ; i++)
        {
            coef[i] = coef16[i];
-           coef[i] /= (1<<15);
+           coef[i] /= (1<<15)-1;
        }
    }
    return (filt==LMS_GFIR3) ? 120 : 40;
@@ -1097,55 +1085,62 @@ int LMS7_Device::SetGFIR(bool tx, size_t chan, lms_gfir_t filt, bool enabled)
 
 int LMS7_Device::SetNormalizedGain(bool dir_tx, size_t chan,double gain)
 {
+    const int gain_total = 27 + 12 + 31;
+    if (dir_tx)
+        return SetGain(dir_tx,chan,63*gain+0.49);
+    else
+        return SetGain(dir_tx,chan,gain*gain_total+0.49);
+}
+
+int LMS7_Device::SetGain(bool dir_tx, size_t chan, unsigned gain)
+{
     if (Modify_SPI_Reg_bits(LMS7param(MAC),chan+1,true)!=0)
         return -1;
 
     if (dir_tx)
     {
-        int g = (63*gain+0.49);
-        if (Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),g,true)!=0)
+        if (gain > 63)
+            gain = 63;
+        if (Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),gain,true)!=0)
             return -1;
     }
     else
     {
-        const int max_gain_lna = 30;
-        const int max_gain_tia = 12;
-        const int max_gain_pga = 31;
-        const int gain_total = max_gain_lna + max_gain_tia + max_gain_pga;
-        int target = gain*gain_total+0.49;
+        if (gain > 70)
+            gain = 70;
         unsigned lna = 0, tia = 0, pga = 0;
-
-        //adjust tia gain
-        if (target >= max_gain_tia)
-        {
+        //LNA table
+        const unsigned lnaTbl[71] = {
+            1,  1,  1,  2,  2,  2,  3,  3,  3,  4,  4,  4,  5,  5,  5,  6,
+            6,  6,  7,  7,  7,  8,  9,  10, 11, 11, 11, 11, 11, 11, 11, 11,
+            11, 11, 11, 11, 11, 12, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+            14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+            14, 14, 14, 14, 14, 14, 14
+        };
+        //PGA table
+        const unsigned pgaTbl[71] = {
+            0,  1,  2,  0,  1,  2,  0,  1,  2,  0,  1,  2,  0,  1,  2,  0,
+            1,  2,  0,  1,  2,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,
+            8,  9,  10, 11, 12, 12, 12, 12, 4,  5,  6,  7,  8,  9,  10, 11,
+            12, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+            25, 26, 27, 28, 29, 30, 31
+        };
+
+        //TIA table
+        if (gain > 48)
             tia = 2;
-            target -= max_gain_tia;
-        }
+        else if (gain > 39)
+            tia = 1;
 
-        //adjust lna gain
-        if (target >= max_gain_lna)
-        {
-            lna = 14;
-            target -= max_gain_lna;
-        }
-        else if (target < max_gain_lna-6)
-        {
-            lna = target/3;
-            target -= lna*3;
-        }
-        else
-        {
-            lna = (max_gain_lna-6)/3;
-            target -= lna*3;
-        }
+        lna = lnaTbl[gain];
+        pga = pgaTbl[gain];
 
-        //adjust pga gain
-        assert(target <= max_gain_pga);
-        pga = target;
+        int rcc_ctl_pga_rbb = (430*(pow(0.65,((double)pga/10)))-110.35)/20.4516+16;
 
         if ((Modify_SPI_Reg_bits(LMS7param(G_LNA_RFE),lna+1,true)!=0)
           ||(Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE),tia+1,true)!=0)
-          ||(Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),pga,true)!=0))
+          ||(Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),pga,true)!=0)
+          ||(Modify_SPI_Reg_bits(LMS7param(RCC_CTL_PGA_RBB),rcc_ctl_pga_rbb,true)!=0))
             return -1;
     }
     return 0;
@@ -1153,22 +1148,30 @@ int LMS7_Device::SetNormalizedGain(bool dir_tx, size_t chan,double gain)
 
 double LMS7_Device::GetNormalizedGain(bool dir_tx, size_t chan)
 {
+    const double gain_total = 27 + 12 + 31;
+    double ret = GetGain(dir_tx, chan);
+    if (dir_tx)
+        return ret / 63.0;
+    else
+        return ret / gain_total;
+}
+
+int LMS7_Device::GetGain(bool dir_tx, size_t chan)
+{
     if (Modify_SPI_Reg_bits(LMS7param(MAC),chan+1,true)!=0)
         return -1;
     if (dir_tx)
     {
-        double ret = Get_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),true);
-        ret /= 63.0;
+        int ret = Get_SPI_Reg_bits(LMS7param(CG_IAMP_TBB),true);
         return ret;
     }
     else
     {
-        const int max_gain_lna = 30;
+        const int max_gain_lna = 27;
         const int max_gain_tia = 12;
-        const int max_gain_pga = 31;
 
         int pga = Get_SPI_Reg_bits(LMS7param(G_PGA_RBB),true);
-        double ret = pga;
+        int ret = pga;
 
         int tia = Get_SPI_Reg_bits(LMS7param(G_TIA_RFE),true);
         if (tia == 3)
@@ -1181,9 +1184,8 @@ double LMS7_Device::GetNormalizedGain(bool dir_tx, size_t chan)
         if (lna > 8)
             ret += (max_gain_lna+lna-15);
         else if (lna > 1)
-            ret += (lna-1)*3;
+            ret += (lna-2)*3;
 
-        ret /= (max_gain_lna + max_gain_tia + max_gain_pga);
         return ret;
     }
     return 0;
@@ -1313,18 +1315,22 @@ int LMS7_Device::SetNCOFreq(bool tx, size_t ch, const float_type *freq, float_ty
 
 int LMS7_Device::SetNCO(bool tx,size_t ch,size_t ind,bool down)
 {
+    if ((!tx) && (Get_SPI_Reg_bits(LMS7_MASK, true) != 0))
+        down = !down;
     if (Modify_SPI_Reg_bits(LMS7param(MAC),ch+1,true)!=0)
         return -1;
     if (ind >= LMS_NCO_VAL_COUNT)
     {
         if (tx)
         {
-            if (Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_TXTSP),1,true)!=0)
+            if ((Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_TXTSP),1,true)!=0)
+            || (Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_TXTSP), 0, true)!=0))
                 return -1;
         }
         else
         {
-            if (Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP),1,true)!=0)
+            if ((Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP),1,true)!=0)
+            || (Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 0, true)!=0))
                 return -1;
         }
     }
@@ -1334,14 +1340,17 @@ int LMS7_Device::SetNCO(bool tx,size_t ch,size_t ind,bool down)
         {
             if ((Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_TXTSP),0,true)!=0)
             || (Modify_SPI_Reg_bits(LMS7param(SEL_TX),ind,true)!=0)
-            || (Modify_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP),down,true)!=0))
+            || (Modify_SPI_Reg_bits(LMS7param(CMIX_SC_TXTSP),down,true)!=0)
+            || (Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_TXTSP), 1, true)!=0))
                 return -1;
+            ;
         }
         else
         {
             if ((Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP),0,true)!=0)
             || (Modify_SPI_Reg_bits(LMS7param(SEL_RX),ind,true)!=0)
-            || (Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP),down,true)!=0))
+            || (Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP),down,true)!=0)
+            || (Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1, true)!=0))
                 return -1;
         }
     }
@@ -1560,6 +1569,11 @@ int LMS7_Device::ProgramHPM7(const char* data, size_t len, int mode,lime::IConne
     return streamPort->ProgramWrite(data,len,mode,0,callback);
 }
 
+int LMS7_Device::ProgramUpdate(const bool download,lime::IConnection::ProgrammingCallback callback)
+{
+    return streamPort->ProgramUpdate(download,callback);
+}
+
 int LMS7_Device::ProgramHPM7(std::string fname, int mode,lime::IConnection::ProgrammingCallback callback)
 {
     std::ifstream file(fname);
diff --git a/src/API/lms7_device.h b/src/API/lms7_device.h
index 1269a5a..54f6b5e 100644
--- a/src/API/lms7_device.h
+++ b/src/API/lms7_device.h
@@ -50,6 +50,8 @@ public:
     virtual int SetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, const float_type* coef,size_t count);
     virtual int GetGFIRCoef(bool tx, size_t chan, lms_gfir_t filt, float_type* coef);
     virtual int SetGFIR(bool tx, size_t chan, lms_gfir_t filt, bool enabled);
+    virtual int SetGain(bool dir_tx, size_t chan,unsigned gain);
+    virtual int GetGain(bool dir_tx, size_t chan);
     virtual int SetNormalizedGain(bool dir_tx, size_t chan,float_type gain);
     virtual float_type GetNormalizedGain(bool dir_tx, size_t chan);
     virtual int SetTestSignal(bool dir_tx, size_t chan,lms_testsig_t sig,int16_t dc_i =0, int16_t dc_q = 0);
@@ -66,6 +68,7 @@ public:
     virtual int ProgramFW(std::string name, lms_target_t mode,lime::IConnection::ProgrammingCallback callback);
     virtual int ProgramHPM7(const char* data, size_t len, int mode,lime::IConnection::ProgrammingCallback callback);
     virtual int ProgramHPM7(std::string fname, int mode,lime::IConnection::ProgrammingCallback callback);
+    virtual int ProgramUpdate(const bool download, lime::IConnection::ProgrammingCallback callback);
     virtual int ProgramMCU(const char* data=nullptr, size_t len=0, lms_target_t mode=LMS_TARGET_RAM,lime::IConnection::ProgrammingCallback callback=nullptr);
     virtual int DACWrite(uint16_t val);
     virtual int DACRead();
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 102da5c..fd03286 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -5,6 +5,7 @@ set(LIME_SUITE_PUBLIC_HEADERS
     lime/LimeSuite.h
     VersionInfo.h
     ErrorReporting.h
+    SystemResources.h
     LimeSuiteConfig.h
     ADF4002/ADF4002.h
     lms7002m_mcu/MCU_BD.h
@@ -88,6 +89,10 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/VersionInfo.in.cpp
     ${CMAKE_CURRENT_BINARY_DIR}/VersionInfo.cpp @ONLY)
 list(APPEND LIME_SUITE_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/VersionInfo.cpp)
 
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/SystemResources.in.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/SystemResources.cpp @ONLY)
+list(APPEND LIME_SUITE_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/SystemResources.cpp)
+
 if(CMAKE_COMPILER_IS_GNUCXX)
     list(APPEND LIME_SUITE_LIBRARIES -pthread)
 endif(CMAKE_COMPILER_IS_GNUCXX)
@@ -187,6 +192,7 @@ set(LMS7SUITE_GUI_SOURCES
     lms7002_wxgui/lms7002_pnlBIAS_view.cpp
     lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp
     lms7002_wxgui/lms7002_pnlTxTSP_view.cpp
+    lms7002_wxgui/lms7002_pnlR3.cpp
     LMS_Programing/LMS_Programing_wxgui.cpp
     utilities_gui/dlgConnectionSettings.cpp
     utilities_gui/pnlMiniLog.cpp
@@ -210,6 +216,7 @@ set(LMS7SUITE_GUI_SOURCES
     lms7suiteEvents/lms7suiteEvents.cpp
     boards_wxgui/pnlQSpark.cpp
     boards_wxgui/pnluLimeSDR.cpp
+    boards_wxgui/pnlUltimateEVB.cpp
     kissFFT/kiss_fft.c
     windowFunction.cpp
     boards_wxgui/pnlLimeSDR.cpp
diff --git a/src/ConnectionNovenaRF7/CMakeLists.txt b/src/ConnectionNovenaRF7/CMakeLists.txt
index e48a44c..d96da6a 100644
--- a/src/ConnectionNovenaRF7/CMakeLists.txt
+++ b/src/ConnectionNovenaRF7/CMakeLists.txt
@@ -16,12 +16,21 @@ set(CMAKE_REQUIRED_DEFINITIONS -DNULL=0)
 CHECK_INCLUDE_FILE(linux/spi/spidev.h HAS_SPIDEV_H)
 CHECK_INCLUDE_FILE(linux/i2c-dev.h HAS_I2CDEV_H)
 
+#require a special version of i2c-dev.h that comes with the libi2c-dev package
+if (HAS_I2CDEV_H)
+    include(CheckCSourceCompiles)
+    set(code "#include <linux/i2c-dev.h>\nint main(){struct i2c_msg messages[2]; return 0;}")
+    CHECK_C_SOURCE_COMPILES("${code}" HAS_I2C_MSG)
+else (HAS_I2CDEV_H)
+    set(HAS_I2C_MSG FALSE)
+endif (HAS_I2CDEV_H)
+
 ########################################################################
 ## Feature registration
 ########################################################################
 include(FeatureSummary)
 include(CMakeDependentOption)
-cmake_dependent_option(ENABLE_NOVENARF7 "Enable NovenaRF7" ON "ENABLE_LIBRARY;HAS_SPIDEV_H;HAS_I2CDEV_H" OFF)
+cmake_dependent_option(ENABLE_NOVENARF7 "Enable NovenaRF7" ON "ENABLE_LIBRARY;HAS_SPIDEV_H;HAS_I2C_MSG" OFF)
 add_feature_info(ConnectionNovenaRF7 ENABLE_NOVENARF7 "NovenaRF7 Connection support")
 if (NOT ENABLE_NOVENARF7)
     return()
diff --git a/src/ConnectionNovenaRF7/ConnectionNovenaRF7_streaming.cpp b/src/ConnectionNovenaRF7/ConnectionNovenaRF7_streaming.cpp
index b96a1e1..0ea7c41 100644
--- a/src/ConnectionNovenaRF7/ConnectionNovenaRF7_streaming.cpp
+++ b/src/ConnectionNovenaRF7/ConnectionNovenaRF7_streaming.cpp
@@ -142,7 +142,7 @@ int fpga_read(unsigned const int addr, unsigned short *buf, const int len)
 int readKernelMemory(long offset, int virtualized, int size)
 {
 #ifdef __linux__
-    int result;
+    int result(0);
 
     int *mem_range = (int *)(offset & ~0xFFFF);
     if (mem_range != prev_mem_range)
diff --git a/src/ConnectionNovenaRF7/StreamChannel.cpp b/src/ConnectionNovenaRF7/StreamChannel.cpp
index bcb2f97..398487c 100644
--- a/src/ConnectionNovenaRF7/StreamChannel.cpp
+++ b/src/ConnectionNovenaRF7/StreamChannel.cpp
@@ -47,7 +47,7 @@ int ConnectionNovenaRF7::StreamChannel::Write(const void* samples, const uint32_
             samplesShort[i] = samplesFloat[i]*2047;
         const complex16_t* ptr = (const complex16_t*)samplesShort ;
         pushed = fifo->push_samples(ptr, count, 1, meta->timestamp, timeout_ms, meta->flags);
-        delete samplesShort;
+        delete[] samplesShort;
     }
     //else if(config.format == StreamConfig::STREAM_12_BIT_IN_16)
     else
diff --git a/src/ConnectionRegistry/ConnectionHandle.cpp b/src/ConnectionRegistry/ConnectionHandle.cpp
index 7d4d2de..e7d6c34 100644
--- a/src/ConnectionRegistry/ConnectionHandle.cpp
+++ b/src/ConnectionRegistry/ConnectionHandle.cpp
@@ -67,7 +67,7 @@ ConnectionHandle::ConnectionHandle(void):
 ConnectionHandle::ConnectionHandle(const std::string &args):
     index(-1)
 {
-    auto kwmap = argsToMap(args);
+    auto kwmap = argsToMap("name="+args); //append name= since it was stripped in serialize
     if (kwmap.count("module") != 0) module = kwmap.at("module");
     if (kwmap.count("media") != 0) media = kwmap.at("media");
     if (kwmap.count("name") != 0) name = kwmap.at("name");
@@ -80,8 +80,8 @@ std::string ConnectionHandle::serialize(void) const
 {
     std::string out;
     if (not name.empty()) out += name;
-    if (not media.empty()) out += ", media="+media; 
-    if (not module.empty()) out += ", module="+module;  
+    if (not media.empty()) out += ", media="+media;
+    if (not module.empty()) out += ", module="+module;
     if (not addr.empty()) out += ", addr="+addr;
     if (not serial.empty()) out += ", serial="+serial;
     if (index != -1) out += ", index="+std::to_string(index);
@@ -91,10 +91,19 @@ std::string ConnectionHandle::serialize(void) const
 
 std::string ConnectionHandle::ToString(void) const
 {
-    std::string out;
+    //name and media format
+    std::string out(name);
+    if (not media.empty()) out += " [" + media + "]";
 
-    if (not name.empty()) out = name;
+    //remove leading zeros for a displayable serial
+    std::string trimmedSerial(serial);
+    while (not trimmedSerial.empty() and trimmedSerial.at(0) == '0')
+    {
+        trimmedSerial = trimmedSerial.substr(1);
+    }
+    if (not trimmedSerial.empty()) out += " " + trimmedSerial;
 
+    //backup condition if we are empty somehow
     if (out.empty()) out = this->serialize();
 
     return out;
diff --git a/src/ConnectionRegistry/IConnection.cpp b/src/ConnectionRegistry/IConnection.cpp
index 6155fba..c8ed87a 100644
--- a/src/ConnectionRegistry/IConnection.cpp
+++ b/src/ConnectionRegistry/IConnection.cpp
@@ -212,7 +212,7 @@ int IConnection::ReadStreamStatus(const size_t streamID, const long timeout_ms,
 
 int IConnection::UploadWFM(const void * const* samples, uint8_t chCount, size_t sample_count, StreamConfig::StreamDataFormat format)
 {
-    return ReportError(EPERM, "UploadTxWFM not implemented");   
+    return ReportError(EPERM, "UploadTxWFM not implemented");
 }
 
 /** @brief Sets callback function which gets called each time data is sent or received
@@ -222,6 +222,10 @@ void IConnection::SetDataLogCallback(std::function<void(bool, const unsigned cha
     callback_logData = callback;
 }
 
+int IConnection::ReadRawStreamData(char* buffer, unsigned length, int timeout_ms)
+{
+    return 0;
+}
 /***********************************************************************
  * Programming API
  **********************************************************************/
@@ -321,6 +325,11 @@ int IConnection::ProgramMCU(const uint8_t *buffer, const size_t length,
     return 0;
 }
 
+int IConnection::ProgramUpdate(const bool download, ProgrammingCallback callback)
+{
+    return 0;
+}
+
 /***********************************************************************
  * GPIO API
  **********************************************************************/
diff --git a/src/ConnectionRegistry/IConnection.h b/src/ConnectionRegistry/IConnection.h
index ee28105..0a1ccc3 100644
--- a/src/ConnectionRegistry/IConnection.h
+++ b/src/ConnectionRegistry/IConnection.h
@@ -170,14 +170,6 @@ struct LIME_API StreamConfig
 class LIME_API IConnection
 {
 public:
-    /*!
-     * Callback from programming processes
-     * @param bsent number of bytes transferred
-     * @param btotal total number of bytes to send
-     * @param progressMsg string describing current progress state
-     * @return 0-continue programming, 1-abort operation
-     */
-    typedef std::function<bool(int bsent, int btotal, const char* progressMsg)> ProgrammingCallback;
 
     //! IConnection constructor
     IConnection(void);
@@ -444,10 +436,26 @@ public:
     */
     virtual int UploadWFM(const void* const* samples, uint8_t chCount, size_t sample_count, StreamConfig::StreamDataFormat format);
 
+    /**	@brief Read raw stream data from device streaming port
+    @param buffer       read buffer pointer
+    @param length       number of bytes to read
+    @param timeout_ms   timeout in milliseconds
+    */
+    virtual int ReadRawStreamData(char* buffer, unsigned length, int timeout_ms = 100);
+
     /***********************************************************************
      * Programming API
      **********************************************************************/
 
+    /*!
+     * Callback from programming processes
+     * @param bsent number of bytes transferred
+     * @param btotal total number of bytes to send
+     * @param progressMsg string describing current progress state
+     * @return 0-continue programming, 1-abort operation
+     */
+    typedef std::function<bool(int bsent, int btotal, const char* progressMsg)> ProgrammingCallback;
+
     /** @brief Uploads program to selected device
         @param buffer binary program data
         @param length buffer length
@@ -488,6 +496,24 @@ public:
     */
     virtual int ProgramMCU(const uint8_t *buffer, const size_t length, const MCU_PROG_MODE mode, ProgrammingCallback callback = 0);
 
+    /*!
+     * Download up-to-date images files and flash the board when applicable.
+     *
+     * Program update is an implementation specific function that may handle
+     * several different use cases depending upon what options are applicable:
+     *
+     * - If a board relies on certain firmware and gateware images,
+     *   these images will be downloaded if not present on the system.
+     *
+     * - If the board has a programmable flash for firmware and gateware,
+     *   then up-to-date images will be written to the flash on the board.
+     *
+     * @param download true to enable downloading missing images
+     * @param callback callback for progress reporting or early termination
+     * @return 0-success
+     */
+    virtual int ProgramUpdate(const bool download = true, ProgrammingCallback callback = 0);
+
     /***********************************************************************
      * GPIO API
      **********************************************************************/
@@ -562,7 +588,6 @@ public:
     /** @brief Sets callback function which gets called each time data is sent or received
     */
     void SetDataLogCallback(std::function<void(bool, const unsigned char*, const unsigned int)> callback);
-
 protected:
     std::function<void(bool, const unsigned char*, const unsigned int)> callback_logData;
     bool mSystemBigEndian;
@@ -597,7 +622,7 @@ public:
         uint64_t timestamp;
     };
     IStreamChannel(){};
-    IStreamChannel(IConnection* port){};
+    IStreamChannel(IConnection* port, StreamConfig conf){};
     virtual int Start() = 0;
     virtual int Stop() = 0;
     virtual ~IStreamChannel(){};
diff --git a/src/ConnectionSTREAM/CMakeLists.txt b/src/ConnectionSTREAM/CMakeLists.txt
index 3308d69..1638b6d 100644
--- a/src/ConnectionSTREAM/CMakeLists.txt
+++ b/src/ConnectionSTREAM/CMakeLists.txt
@@ -23,6 +23,7 @@ set(CONNECTION_STREAM_SOURCES
     ${THIS_SOURCE_DIR}/ConnectionSTREAMEntry.cpp
     ${THIS_SOURCE_DIR}/ConnectionSTREAM.cpp
     ${THIS_SOURCE_DIR}/ConnectionSTREAMing.cpp
+    ${THIS_SOURCE_DIR}/ConnectionSTREAMImages.cpp
 )
 
 set(CONNECTION_STREAM_LIBRARIES
diff --git a/src/ConnectionSTREAM/ConnectionSTREAM.cpp b/src/ConnectionSTREAM/ConnectionSTREAM.cpp
index 3aac10f..3e33c08 100644
--- a/src/ConnectionSTREAM/ConnectionSTREAM.cpp
+++ b/src/ConnectionSTREAM/ConnectionSTREAM.cpp
@@ -52,7 +52,7 @@ const std::set<uint8_t> ConnectionSTREAM::commandsToBulkCtrlHw2 =
 
 /**	@brief Initializes port type and object necessary to communicate to usb device.
 */
-ConnectionSTREAM::ConnectionSTREAM(void *arg, const unsigned index, const int vid, const int pid)
+ConnectionSTREAM::ConnectionSTREAM(void *arg, const std::string &vidpid, const std::string &serial, const unsigned index)
 {
     bulkCtrlAvailable = false;
     bulkCtrlInProgress = false;
@@ -69,18 +69,12 @@ ConnectionSTREAM::ConnectionSTREAM(void *arg, const unsigned index, const int vi
 	InCtrlBulkEndPt = nullptr;
 	OutCtrlBulkEndPt = nullptr;
 #else
-    dev_handle = 0;
-    devs = 0;
+    dev_handle = nullptr;
     ctx = (libusb_context *)arg;
 #endif
-    if (this->Open(index, vid, pid) != 0)
+    if (this->Open(vidpid, serial, index) != 0)
         std::cerr << GetLastErrorMessage() << std::endl;
 
-    struct ExpectedVersion
-    {
-        int hw, fw, gw, gw_rev;
-    };
-
     commandsToBulkCtrl = commandsToBulkCtrlHw2;
 
     LMSinfo info = this->GetInfo();
@@ -90,75 +84,12 @@ ConnectionSTREAM::ConnectionSTREAM(void *arg, const unsigned index, const int vi
         commandsToBulkCtrl = commandsToBulkCtrlHw1;
     }
 
-    FPGAinfo fpgaInfo = this->GetFPGAInfo();
-    //expected version numbers based on HW number
-    vector<ExpectedVersion> versionList; //expected HW,FW,GW combinations
-    bool correctFWHW = false;
-    if (info.device == LMS_DEV_LIMESDR)
-    {
-        versionList = {
-            {4, 2, 2, 2},
-            {3, 2, 1, 20},
-            {2, 2, 1, 20},
-            {1, 6, 1, 20},
-        };
-    }
-    else if(info.device == LMS_DEV_STREAM)
-    {
-        versionList = {
-            {3, 8, 1, 2},
-        };
-    }
-
-    for(auto iter : versionList)
-        if(info.hardware == iter.hw
-           && info.firmware == iter.fw
-           && fpgaInfo.gatewareVersion == iter.gw
-           && fpgaInfo.gatewareRevision == iter.gw_rev)
-        {
-            correctFWHW = true;
-            break;
-        }
+    this->VersionCheck();
 
-    if(not correctFWHW)
-    {
-        ExpectedVersion expected = {-1, -1, -1, -1};
-        bool knownHardware = false;
-        for(auto iter : versionList)
-            if(info.hardware == iter.hw)
-        {
-            knownHardware = true;
-            expected = iter;
-            break;
-        }
-        if(not knownHardware)
-            std::cerr << "Unsupported hardware connected" << std::endl;
-
-        //check and warn about firmware mismatch problems
-        if (knownHardware && info.firmware != expected.fw)
-            std::cerr << std::endl
-            << "########################################################" << std::endl
-            << "##   !!!  Warning: firmware version mismatch  !!!" << std::endl
-            << "## Expected firmware version " << expected.fw << ", but found version " << info.firmware << std::endl
-            << "## Follow the FW and FPGA upgrade instructions:" << std::endl
-            << "## http://wiki.myriadrf.org/Lime_Suite#Flashing_images" << std::endl
-            << "########################################################" << std::endl
-            << std::endl;
-
-        //check and warn about gateware mismatch problems
-        if (knownHardware && (fpgaInfo.gatewareVersion != expected.gw
-            || fpgaInfo.gatewareRevision != expected.gw_rev))
-            std::cerr << std::endl
-            << "########################################################" << std::endl
-            << "##   !!!  Warning: gateware version mismatch  !!!" << std::endl
-            << "## Expected gateware version " << expected.gw << ", revision " << expected.gw_rev << std::endl
-            << "## But found version " << fpgaInfo.gatewareVersion << ", revision " << fpgaInfo.gatewareRevision<< std::endl
-            << "## Follow the FW and FPGA upgrade instructions:" << std::endl
-            << "## http://wiki.myriadrf.org/Lime_Suite#Flashing_images" << std::endl
-            << "########################################################" << std::endl
-            << std::endl;
-    }
+    if (info.device == LMS_DEV_LIMESDR || info.device == LMS_DEV_LIMESDR_USB_SP || info.device == LMS_DEV_LMS7002M_ULTIMATE_EVB)
+        DetectRefClk();
 
+    GetChipVersion();
     //must configure synthesizer before using LimeSDR
     if (info.device == LMS_DEV_LIMESDR && info.hardware < 4)
     {
@@ -183,6 +114,64 @@ ConnectionSTREAM::ConnectionSTREAM(void *arg, const unsigned index, const int vi
     }
 }
 
+double ConnectionSTREAM::DetectRefClk(void)
+{
+    const double fx3Clk = 100e6 * 1.008;    //fx3 clock 100MHz (adjusted to 100.8 MHz based on measurement on multiple boards)
+    const double fx3Cnt = 16777210;         //fixed fx3 counter in FPGA
+    const double clkTbl[] = { 30.72e6, 38.4e6, 40e6, 52e6 };
+    const uint32_t addr[] = { 0x61, 0x63 };
+    const uint32_t vals[] = { 0x0, 0x0 };
+    if (this->WriteRegisters(addr, vals, 2) != 0)
+    {
+        return -1;
+    }
+    auto start = std::chrono::steady_clock::now();
+    if (this->WriteRegister(0x61, 0x4) != 0)
+    {
+        return -1;
+    }
+
+    while (1) //wait for test to finish
+    {
+        unsigned completed;
+        if (this->ReadRegister(0x65, completed) != 0)
+        {
+            return -1;
+        }
+        if (completed & 0x4)
+            break;
+
+        auto end = std::chrono::steady_clock::now();
+        std::chrono::duration<double> elapsed_seconds = end - start;
+        if (elapsed_seconds.count() > 0.5) //timeout
+        {
+            return -1;
+        }
+    }
+
+    const uint32_t addr2[] = { 0x72, 0x73 };
+    uint32_t vals2[2];
+    if (this->ReadRegisters(addr2, vals2, 2) != 0)
+    {
+        return -1;
+    }
+    double count = (vals2[0] | (vals2[1] << 16)); //cock counter
+    count *= fx3Clk / fx3Cnt;   //estimate ref clock based on FX3 Clock
+    printf("Estimated reference clock %1.4f MHz\n", count/1e6);
+    unsigned i = 0;
+    double delta = 100e6;
+
+    while (i < sizeof(clkTbl) / sizeof(*clkTbl))
+        if (delta < fabs(count - clkTbl[i]))
+            break;
+        else
+            delta = fabs(count - clkTbl[i++]);
+
+    this->SetReferenceClockRate(clkTbl[i-1]);
+    printf("Selected reference clock %1.3f MHz\n", clkTbl[i - 1] / 1e6);
+    return clkTbl[i - 1];
+}
+
 /**	@brief Closes connection to chip and deallocates used memory.
 */
 ConnectionSTREAM::~ConnectionSTREAM()
@@ -205,7 +194,7 @@ ConnectionSTREAM::~ConnectionSTREAM()
 /**	@brief Tries to open connected USB device and find communication endpoints.
 	@return Returns 0-Success, other-EndPoints not found or device didn't connect.
 */
-int ConnectionSTREAM::Open(const unsigned index, const int vid, const int pid)
+int ConnectionSTREAM::Open(const std::string &vidpid, const std::string &serial, const unsigned index)
 {
     bulkCtrlAvailable = false;
 #ifndef __unix__
@@ -277,7 +266,46 @@ int ConnectionSTREAM::Open(const unsigned index, const int vid, const int pid)
     isConnected = true;
     return 0;
 #else
-    dev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
+    const auto splitPos = vidpid.find(":");
+    const auto vid = std::stoi(vidpid.substr(0, splitPos), nullptr, 16);
+    const auto pid = std::stoi(vidpid.substr(splitPos+1), nullptr, 16);
+
+    libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices
+    int usbDeviceCount = libusb_get_device_list(ctx, &devs);
+
+    if (usbDeviceCount < 0) {
+        return ReportError(-1, "ConnectionSTREAM: libusb_get_device_list failed: %s", libusb_strerror(libusb_error(usbDeviceCount)));
+    }
+
+    for(int i=0; i<usbDeviceCount; ++i)
+    {
+        libusb_device_descriptor desc;
+        int r = libusb_get_device_descriptor(devs[i], &desc);
+        if(r<0) {
+            printf("failed to get device description\n");
+            continue;
+        }
+        if (desc.idProduct != pid) continue;
+        if (desc.idVendor != vid) continue;
+        if(libusb_open(devs[i], &dev_handle) != 0) continue;
+
+        std::string foundSerial;
+        if (desc.iSerialNumber > 0)
+        {
+            char data[255];
+            r = libusb_get_string_descriptor_ascii(dev_handle,desc.iSerialNumber,(unsigned char*)data, sizeof(data));
+            if(r<0)
+                printf("failed to get serial number\n");
+            else
+                foundSerial = std::string(data, size_t(r));
+        }
+
+        if (serial == foundSerial) break; //found it
+        libusb_close(dev_handle);
+        dev_handle = nullptr;
+    }
+    libusb_free_device_list(devs, 1);
+
     if(dev_handle == nullptr)
         return ReportError(-1, "ConnectionSTREAM: libusb_open failed");
     if(libusb_kernel_driver_active(dev_handle, 0) == 1)   //find out if kernel driver is attached
@@ -321,7 +349,6 @@ int ConnectionSTREAM::Open(const unsigned index, const int vid, const int pid)
     return 0;
 #endif
 }
-
 /**	@brief Closes communication to device.
 */
 void ConnectionSTREAM::Close()
@@ -404,7 +431,7 @@ int ConnectionSTREAM::Write(const unsigned char *buffer, const int length, int t
     else
         len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR,CTR_W_REQCODE ,CTR_W_VALUE, CTR_W_INDEX, wbuffer, length, timeout_ms);
     #endif
-    delete wbuffer;
+    delete[] wbuffer;
     return len;
 }
 
diff --git a/src/ConnectionSTREAM/ConnectionSTREAM.h b/src/ConnectionSTREAM/ConnectionSTREAM.h
index 96ec7bd..ba93179 100644
--- a/src/ConnectionSTREAM/ConnectionSTREAM.h
+++ b/src/ConnectionSTREAM/ConnectionSTREAM.h
@@ -15,6 +15,7 @@
 #include <memory>
 #include <thread>
 #include "fifo.h"
+#include <ciso646>
 
 #ifndef __unix__
 #include "windows.h"
@@ -90,10 +91,11 @@ public:
 class ConnectionSTREAM : public ILimeSDRStreaming
 {
 public:
-    ConnectionSTREAM(void* ctx, const unsigned index, const int vid=-1, const int pid=-1);
+    ConnectionSTREAM(void* arg, const std::string &vidpid, const std::string &serial, const unsigned index);
     ~ConnectionSTREAM(void);
+    void VersionCheck(void);
 
-    int Open(const unsigned index, const int vid, const int pid);
+    int Open(const std::string &vidpid, const std::string &serial, const unsigned index);
     void Close();
     bool IsOpen();
     int GetOpenedIndex();
@@ -106,6 +108,8 @@ public:
     //hooks to update FPGA plls when baseband interface data rate is changed
     virtual int UpdateExternalDataRate(const size_t channel, const double txRate, const double rxRate) override;
     virtual int ProgramWrite(const char *buffer, const size_t length, const int programmingMode, const int device, ProgrammingCallback callback) override;
+    int ProgramUpdate(const bool download, ProgrammingCallback callback);
+    int ReadRawStreamData(char* buffer, unsigned length, int timeout_ms = 100)override;
 protected:
     virtual void ReceivePacketsLoop(const ThreadData args) override;
     virtual void TransmitPacketsLoop(const ThreadData args) override;
@@ -119,9 +123,10 @@ protected:
     virtual int WaitForSending(int contextHandle, uint32_t timeout_ms);
     virtual int FinishDataSending(const char* buffer, uint32_t length, int contextHandle);
     virtual void AbortSending();
-
     eConnectionType GetType(void) {return USB_PORT;}
 
+    double DetectRefClk(void);
+
     USBTransferContext contexts[USB_MAX_CONTEXTS];
     USBTransferContext contextsToSend[USB_MAX_CONTEXTS];
 
@@ -140,7 +145,6 @@ protected:
     CCyUSBEndPoint* InCtrlBulkEndPt;
     CCyUSBEndPoint* OutCtrlBulkEndPt;
 #else
-    libusb_device** devs; //pointer to pointer of device, used to retrieve a list of devices
     libusb_device_handle* dev_handle; //a device handle
     libusb_context* ctx; //a libusb session
     int read_firmware_image(unsigned char *buf, int len);
@@ -170,6 +174,7 @@ public:
 protected:
 #ifndef __unix__
     std::string DeviceName(unsigned int index);
+    void *ctx; //not used, just for mirroring unix
 #else
     libusb_context* ctx; //a libusb session
     std::thread mUSBProcessingThread;
diff --git a/src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp b/src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp
index cf6a0fc..9ba8300 100644
--- a/src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp
+++ b/src/ConnectionSTREAM/ConnectionSTREAMEntry.cpp
@@ -113,102 +113,88 @@ std::vector<ConnectionHandle> ConnectionSTREAMEntry::enumerate(const ConnectionH
             handle.index = i;
             std::wstring ws(device.SerialNumber);
             handle.serial = std::string(ws.begin(),ws.end());
-            handles.push_back(handle);
-			device.Close();
+            if (hint.serial.empty() or hint.serial == handle.serial)
+            {
+                handles.push_back(handle); //filter on serial
+            }
+            device.Close();
         }
     }
 #else
     libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices
     int usbDeviceCount = libusb_get_device_list(ctx, &devs);
-    if(usbDeviceCount > 0)
+
+    if (usbDeviceCount < 0) {
+        printf("failed to get libusb device list: %s\n", libusb_strerror(libusb_error(usbDeviceCount)));
+        return handles;
+    }
+
+    for(int i=0; i<usbDeviceCount; ++i)
     {
         libusb_device_descriptor desc;
-        for(int i=0; i<usbDeviceCount; ++i)
+        int r = libusb_get_device_descriptor(devs[i], &desc);
+        if(r<0)
+            printf("failed to get device description\n");
+        int pid = desc.idProduct;
+        int vid = desc.idVendor;
+
+        if(vid == 1204 && pid == 34323)
         {
-            int r = libusb_get_device_descriptor(devs[i], &desc);
-            if(r<0)
-                printf("failed to get device description\n");
-            int pid = desc.idProduct;
-            int vid = desc.idVendor;
+            ConnectionHandle handle;
+            handle.media = "USB";
+            handle.name = "DigiGreen";
+            handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
+            handles.push_back(handle);
+        }
+        else if((vid == 1204 && pid == 241) || (vid == 1204 && pid == 243) || (vid == 7504 && pid == 24840))
+        {
+            libusb_device_handle *tempDev_handle(nullptr);
+            if(libusb_open(devs[i], &tempDev_handle) != 0 || tempDev_handle == nullptr)
+                continue;
 
-            if(vid == 1204 && pid == 34323)
-            {
-                ConnectionHandle handle;
+            ConnectionHandle handle;
+
+            //check operating speed
+            int speed = libusb_get_device_speed(devs[i]);
+            if(speed == LIBUSB_SPEED_HIGH)
+                handle.media = "USB 2.0";
+            else if(speed == LIBUSB_SPEED_SUPER)
+                handle.media = "USB 3.0";
+            else
                 handle.media = "USB";
-                handle.name = "DigiGreen";
-                handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
-                handles.push_back(handle);
-            }
-            else if((vid == 1204 && pid == 241) || (vid == 1204 && pid == 243) || (vid == 7504 && pid == 24840))
+
+            //read device name
+            char data[255];
+            r = libusb_get_string_descriptor_ascii(tempDev_handle,  LIBUSB_CLASS_COMM, (unsigned char*)data, sizeof(data));
+            if(r > 0) handle.name = std::string(data, size_t(r));
+
+            r = std::sprintf(data, "%.4x:%.4x", int(vid), int(pid));
+            if (r > 0) handle.addr = std::string(data, size_t(r));
+
+            if (desc.iSerialNumber > 0)
             {
-                libusb_device_handle *tempDev_handle;
-                tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
-                if(tempDev_handle == nullptr)
-                    continue;
-                if(libusb_kernel_driver_active(tempDev_handle, 0) == 1)   //find out if kernel driver is attached
-                {
-                    if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it
-                        printf("Kernel Driver Detached!\n");
-                }
-                if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device
-                {
-                    printf("Cannot Claim Interface\n");
-                }
-
-                std::string fullName;
-                //check operating speed
-                int speed = libusb_get_device_speed(devs[i]);
-                if(speed == LIBUSB_SPEED_HIGH)
-                    fullName = "USB 2.0";
-                else if(speed == LIBUSB_SPEED_SUPER)
-                    fullName = "USB 3.0";
+                r = libusb_get_string_descriptor_ascii(tempDev_handle,desc.iSerialNumber,(unsigned char*)data, sizeof(data));
+                if(r<0)
+                    printf("failed to get serial number\n");
                 else
-                    fullName = "USB";
-                fullName += " (";
-                //read device name
-                char data[255];
-                memset(data, 0, 255);
-                libusb_get_string_descriptor_ascii(tempDev_handle,  LIBUSB_CLASS_COMM, (unsigned char*)data, 255);
-                if(strlen(data) > 0)
-                    fullName += data;
-                fullName += ")";
-
-                ConnectionHandle handle;
-                handle.media = "USB";
-                handle.name = fullName;
-                handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
-
-                if (desc.iSerialNumber > 0)
-                {
-                    r = libusb_get_string_descriptor_ascii(tempDev_handle,desc.iSerialNumber,(unsigned char*)data, 255);
-                    if(r<0)
-                        printf("failed to get serial number\n");
-                    else if (strlen(data) > 0)
-                        handle.serial = std::string((const char*)data);
-                }
-                libusb_close(tempDev_handle);
+                    handle.serial = std::string(data, size_t(r));
+            }
+            libusb_close(tempDev_handle);
 
+            //add handle conditionally, filter by serial number
+            if (hint.serial.empty() or hint.serial == handle.serial)
+            {
                 handles.push_back(handle);
             }
         }
     }
-    else
-    {
-        libusb_free_device_list(devs, 1);
-    }
+
+    libusb_free_device_list(devs, 1);
 #endif
     return handles;
 }
 
 IConnection *ConnectionSTREAMEntry::make(const ConnectionHandle &handle)
 {
-#ifndef __unix__
-    return new ConnectionSTREAM(nullptr, handle.index);
-#else
-    const auto pidvid = handle.addr;
-    const auto splitPos = pidvid.find(":");
-    const auto pid = std::stoi(pidvid.substr(0, splitPos));
-    const auto vid = std::stoi(pidvid.substr(splitPos+1));
-    return new ConnectionSTREAM(ctx, handle.index, vid, pid);
-#endif
+    return new ConnectionSTREAM(ctx, handle.addr, handle.serial, handle.index);
 }
diff --git a/src/ConnectionSTREAM/ConnectionSTREAMImages.cpp b/src/ConnectionSTREAM/ConnectionSTREAMImages.cpp
new file mode 100644
index 0000000..c827a45
--- /dev/null
+++ b/src/ConnectionSTREAM/ConnectionSTREAMImages.cpp
@@ -0,0 +1,190 @@
+/**
+    @file ConnectionSTREAMImages.cpp
+    @author Lime Microsystems
+    @brief Image updating and version checking
+*/
+
+#include "ConnectionSTREAM.h"
+#include "ErrorReporting.h"
+#include "SystemResources.h"
+#include "LMS64CProtocol.h"
+#include "LMSBoards.h"
+#include <iostream>
+#include <fstream>
+#include <ciso646>
+
+using namespace lime;
+
+/*!
+ * The entry structure that describes a board revision and its fw/gw images
+ */
+struct ConnectionSTREAMImageEntry
+{
+    eLMS_DEV dev;
+    int hw_rev;
+
+    int fw_ver;
+    const char *fw_img;
+
+    int gw_ver;
+    int gw_rev;
+    const char *gw_rbf;
+};
+
+/*!
+ * Lookup the board information given hardware type and revision.
+ * Edit each entry for supported hardware and image updates.
+ */
+static const ConnectionSTREAMImageEntry &lookupImageEntry(const LMS64CProtocol::LMSinfo &info)
+{
+    static const std::vector<ConnectionSTREAMImageEntry> imageEntries = {
+        ConnectionSTREAMImageEntry({LMS_DEV_UNKNOWN, -1, -1, "Unknown-USB.img", -1, -1, "Unknown-USB.rbf"}),
+        ConnectionSTREAMImageEntry({LMS_DEV_LIMESDR, 4, 3, "LimeSDR-USB_HW_1.3_r3.0.img", 2, 6,  "LimeSDR-USB_HW_1.4_r2.6.rbf"}),
+        ConnectionSTREAMImageEntry({LMS_DEV_LIMESDR, 3, 3, "LimeSDR-USB_HW_1.3_r3.0.img", 1, 20, "LimeSDR-USB_HW_1.1_r1.20.rbf"}),
+        ConnectionSTREAMImageEntry({LMS_DEV_LIMESDR, 2, 3, "LimeSDR-USB_HW_1.2_r3.0.img", 1, 20, "LimeSDR-USB_HW_1.1_r1.20.rbf"}),
+        ConnectionSTREAMImageEntry({LMS_DEV_LIMESDR, 1, 7, "LimeSDR-USB_HW_1.1_r7.0.img", 1, 20, "LimeSDR-USB_HW_1.1_r1.20.rbf"}),
+        ConnectionSTREAMImageEntry({LMS_DEV_STREAM,  3, 8, "STREAM-USB_HW_1.1_r8.0.img",  1, 2,  "STREAM-USB_HW_1.3_r1.2.rbf"})};
+
+    for(const auto &iter : imageEntries)
+    {
+        if (info.device == iter.dev and info.hardware == iter.hw_rev)
+        {
+            return iter;
+        }
+    }
+
+    return imageEntries.front(); //the -1 unknown entry
+}
+
+void ConnectionSTREAM::VersionCheck(void)
+{
+    const auto info = this->GetInfo();
+    const auto &entry = lookupImageEntry(info);
+
+    //an entry match was not found
+    if (entry.dev == LMS_DEV_UNKNOWN)
+    {
+        std::cerr << "Unsupported hardware connected: " << GetDeviceName(info.device) << "[HW=" << info.hardware << "]" << std::endl;
+        return;
+    }
+
+    //check and warn about firmware mismatch problems
+    if (info.firmware != entry.fw_ver)
+        std::cerr << std::endl
+        << "########################################################" << std::endl
+        << "##   !!!  Warning: firmware version mismatch  !!!" << std::endl
+        << "## Expected firmware version " << entry.fw_ver << ", but found version " << info.firmware << std::endl
+        << "## Follow the FW and FPGA upgrade instructions:" << std::endl
+        << "## http://wiki.myriadrf.org/Lime_Suite#Flashing_images" << std::endl
+        << "## Or run update on the command line: LimeUtil --update" << std::endl
+        << "########################################################" << std::endl
+        << std::endl;
+
+    //check and warn about gateware mismatch problems
+    const auto fpgaInfo = this->GetFPGAInfo();
+    if (fpgaInfo.gatewareVersion != entry.gw_ver
+        || fpgaInfo.gatewareRevision != entry.gw_rev)
+        std::cerr << std::endl
+        << "########################################################" << std::endl
+        << "##   !!!  Warning: gateware version mismatch  !!!" << std::endl
+        << "## Expected gateware version " << entry.gw_ver << ", revision " << entry.gw_rev << std::endl
+        << "## But found version " << fpgaInfo.gatewareVersion << ", revision " << fpgaInfo.gatewareRevision<< std::endl
+        << "## Follow the FW and FPGA upgrade instructions:" << std::endl
+        << "## http://wiki.myriadrf.org/Lime_Suite#Flashing_images" << std::endl
+        << "## Or run update on the command line: LimeUtil --update" << std::endl
+        << "########################################################" << std::endl
+        << std::endl;
+}
+
+static bool programmingCallbackStream(
+    int bsent, int btotal, const char* progressMsg,
+    const std::string &image,
+    IConnection::ProgrammingCallback callback)
+{
+    const auto msg = std::string(progressMsg) + " (" + image + ")";
+    return callback(bsent, btotal, msg.c_str());
+}
+
+int ConnectionSTREAM::ProgramUpdate(const bool download, IConnection::ProgrammingCallback callback)
+{
+    const auto info = this->GetInfo();
+    const auto &entry = lookupImageEntry(info);
+
+    //an entry match was not found
+    if (entry.dev == LMS_DEV_UNKNOWN)
+    {
+        return lime::ReportError("Unsupported hardware connected: %s[HW=%d]", GetDeviceName(info.device), info.hardware);
+    }
+
+    //download images when missing
+    if (download)
+    {
+        const std::vector<std::string> images = {entry.fw_img, entry.gw_rbf};
+        for (const auto &image : images)
+        {
+            if (not lime::locateImageResource(image).empty()) continue;
+            const std::string msg("Downloading: " + image);
+            if (callback) callback(0, 1, msg.c_str());
+            int ret = lime::downloadImageResource(image);
+            if (ret != 0) return ret; //error set by download call
+            if (callback) callback(1, 1, "Done!");
+        }
+    }
+
+    //load firmware into flash
+    {
+        //open file
+        std::ifstream file;
+        const auto path = lime::locateImageResource(entry.fw_img);
+        file.open(path.c_str(), std::ios::in | std::ios::binary);
+        if (not file.good()) return lime::ReportError("Error opening %s", path.c_str());
+
+        //read file
+        std::streampos fileSize;
+        file.seekg(0, std::ios::end);
+        fileSize = file.tellg();
+        file.seekg(0, std::ios::beg);
+        std::vector<char> progData(fileSize, 0);
+        file.read(progData.data(), fileSize);
+
+        int device = LMS64CProtocol::FX3; //FX3
+        int progMode = 2; //Firmware to FLASH
+        using namespace std::placeholders;
+        const auto cb = std::bind(&programmingCallbackStream, _1, _2, _3, path, callback);
+        auto status = this->ProgramWrite(progData.data(), progData.size(), progMode, device, cb);
+        if (status != 0) return status;
+    }
+
+    //load gateware into flash
+    {
+        //open file
+        std::ifstream file;
+        const auto path = lime::locateImageResource(entry.gw_rbf);
+        file.open(path.c_str(), std::ios::in | std::ios::binary);
+        if (not file.good()) return lime::ReportError("Error opening %s", path.c_str());
+
+        //read file
+        std::streampos fileSize;
+        file.seekg(0, std::ios::end);
+        fileSize = file.tellg();
+        file.seekg(0, std::ios::beg);
+        std::vector<char> progData(fileSize, 0);
+        file.read(progData.data(), fileSize);
+
+        int device = LMS64CProtocol::FPGA; //Altera FPGA
+        int progMode = 1; //Bitstream to FLASH
+        using namespace std::placeholders;
+        const auto cb = std::bind(&programmingCallbackStream, _1, _2, _3, path, callback);
+        auto status = this->ProgramWrite(progData.data(), progData.size(), progMode, device, cb);
+        if (status != 0) return status;
+    }
+
+    //Reset FX3, FPGA should be reloaded on boot
+    {
+        int device = LMS64CProtocol::FX3; //FX3
+        auto status = this->ProgramWrite(nullptr, 0, 0, device, nullptr);
+        if (status != 0) return status;
+    }
+
+    return 0;
+}
diff --git a/src/ConnectionSTREAM/ConnectionSTREAMing.cpp b/src/ConnectionSTREAM/ConnectionSTREAMing.cpp
index 7246783..1643e7f 100644
--- a/src/ConnectionSTREAM/ConnectionSTREAMing.cpp
+++ b/src/ConnectionSTREAM/ConnectionSTREAMing.cpp
@@ -62,6 +62,8 @@ int ConnectionSTREAM::UploadWFM(const void* const* samples, uint8_t chCount, siz
         FinishDataSending((char*)&pkt, bToSend , context);
     }
     delete[] batch;
+    /*Give FX3 some time to load samples to FPGA*/
+    std::this_thread::sleep_for(std::chrono::milliseconds(30));
     if(cnt == 0)
         return 0;
     else
@@ -75,44 +77,169 @@ int ConnectionSTREAM::UpdateExternalDataRate(const size_t channel, const double
     std::cout << "ConnectionSTREAM::ConfigureFPGA_PLL(tx=" << txRate_Hz/1e6 << "MHz, rx=" << rxRate_Hz/1e6 << "MHz)" << std::endl;
     const float txInterfaceClk = 2 * txRate_Hz;
     const float rxInterfaceClk = 2 * rxRate_Hz;
-    mExpectedSampleRate = rxRate_Hz;
     int status = 0;
-    if(txInterfaceClk >= 5e6)
+    uint32_t reg20;
+    const double rxPhC1[] = { 91.08, 89.46 };
+    const double rxPhC2[] = { -1 / 6e6, 1.24e-6 };
+    const double txPhC1[] = { 89.75, 89.61 };
+    const double txPhC2[] = { -3.0e-7, 2.71e-7 };
+
+    const std::vector<uint32_t> spiAddr = {0x0021, 0x0022, 0x0023, 0x0024,
+                                           0x0027, 0x002A, 0x0400, 0x040C,
+                                           0x040B, 0x0400, 0x040B, 0x0400};
+    const int bakRegCnt = spiAddr.size() - 4;
+    auto info = GetDeviceInfo();
+    const int addrLMS7002M = info.addrsLMS7002M.at(0);
+    bool phaseSearch = false;
+    if (this->chipVersion == 0x3841 && stoi(info.gatewareRevision) >= 7 && stoi(info.gatewareVersion) >= 2) //0x3840 LMS7002Mr2, 0x3841 LMS7002Mr3
+        if(rxInterfaceClk >= 5e6 || txInterfaceClk >= 5e6)
+            phaseSearch = true;
+    mExpectedSampleRate = rxRate_Hz;
+
+    std::vector<uint32_t> dataWr;
+    std::vector<uint32_t> dataRd;
+
+    if (phaseSearch)
+    {
+        dataWr.resize(spiAddr.size());
+        dataRd.resize(spiAddr.size());
+        //backup registers
+        dataWr[0] = (uint32_t(0x0020) << 16);
+        TransactSPI(addrLMS7002M, dataWr.data(), &reg20, 1);
+
+        dataWr[0] = (1 << 31) | (uint32_t(0x0020) << 16) | 0xFFFD; //msbit 1=SPI write
+        TransactSPI(addrLMS7002M, dataWr.data(), nullptr, 1);
+
+        for (int i = 0; i < bakRegCnt; ++i)
+            dataWr[i] = (spiAddr[i] << 16);
+        TransactSPI(addrLMS7002M, dataWr.data(), dataRd.data(), bakRegCnt);
+        UpdateThreads(true);
+    }
+
+    if(rxInterfaceClk >= 5e6)
     {
+        if (phaseSearch)
+        {
+            const std::vector<uint32_t> spiData = { 0x0E9F, 0x07FF, 0x5550, 0xE4E4,
+                                                    0xE4E4, 0x0086, 0x028D, 0x00FF,
+                                                    0x5555, 0x02CD, 0xAAAA, 0x02ED};
+            //Load test config
+            const int setRegCnt = spiData.size();
+            for (int i = 0; i < setRegCnt; ++i)
+                dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | spiData[i]; //msbit 1=SPI write
+            TransactSPI(addrLMS7002M, dataWr.data(), nullptr, setRegCnt);
+        }
         lime::fpga::FPGA_PLL_clock clocks[2];
         clocks[0].bypass = false;
         clocks[0].index = 0;
-        clocks[0].outFrequency = txInterfaceClk;
+        clocks[0].outFrequency = rxInterfaceClk;
         clocks[0].phaseShift_deg = 0;
+        clocks[0].findPhase = false;
         clocks[1].bypass = false;
         clocks[1].index = 1;
-        clocks[1].outFrequency = txInterfaceClk;
-        clocks[1].phaseShift_deg = 90;
-        status = lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 2);
+        clocks[1].outFrequency = rxInterfaceClk;
+        if (this->chipVersion == 0x3841)
+            clocks[1].phaseShift_deg = rxPhC1[1] + rxPhC2[1] * rxInterfaceClk;
+        else
+            clocks[1].phaseShift_deg = rxPhC1[0] + rxPhC2[0] * rxInterfaceClk;
+
+        if (phaseSearch)
+        {
+            clocks[1].findPhase = true;
+        }
+        else
+        {
+            clocks[1].findPhase = false;
+        }
+        status = lime::fpga::SetPllFrequency(this, 1, rxInterfaceClk, clocks, 2);
     }
     else
-        status = lime::fpga::SetDirectClocking(this, 0, txInterfaceClk, 90);
-    if(status != 0)
-        return status;
+        status = lime::fpga::SetDirectClocking(this, 1, rxInterfaceClk, 90);
 
-    if(rxInterfaceClk >= 5e6)
+    if(txInterfaceClk >= 5e6)
     {
+        if (phaseSearch)
+        {
+            const std::vector<uint32_t> spiData = {0x0E9F, 0x07FF, 0x5550, 0xE4E4,
+                                                   0xE4E4, 0x0484};
+            WriteRegister(0x000A, 0x0000);
+            //Load test config
+            const int setRegCnt = spiData.size();
+            for (int i = 0; i < setRegCnt; ++i)
+                dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | spiData[i]; //msbit 1=SPI write
+            TransactSPI(addrLMS7002M, dataWr.data(), nullptr, setRegCnt);
+        }
+
         lime::fpga::FPGA_PLL_clock clocks[2];
         clocks[0].bypass = false;
         clocks[0].index = 0;
-        clocks[0].outFrequency = rxInterfaceClk;
+        clocks[0].outFrequency = txInterfaceClk;
         clocks[0].phaseShift_deg = 0;
+        clocks[0].findPhase = false;
         clocks[1].bypass = false;
         clocks[1].index = 1;
-        clocks[1].outFrequency = rxInterfaceClk;
-        clocks[1].phaseShift_deg = 90;
-        status = lime::fpga::SetPllFrequency(this, 1, rxInterfaceClk, clocks, 2);
+        clocks[1].outFrequency = txInterfaceClk;
+        if (this->chipVersion == 0x3841)
+            clocks[1].phaseShift_deg = txPhC1[1] + txPhC2[1] * txInterfaceClk;
+        else
+            clocks[1].phaseShift_deg = txPhC1[0] + txPhC2[0] * txInterfaceClk;
+
+        if (phaseSearch)
+        {
+            clocks[1].findPhase = true;
+            WriteRegister(0x000A, 0x0200);
+        }
+        else
+        {
+            clocks[1].findPhase = false;
+        }
+        status = lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 2);
     }
     else
-        status = lime::fpga::SetDirectClocking(this, 1, rxInterfaceClk, 90);
+        status = lime::fpga::SetDirectClocking(this, 0, txInterfaceClk, 90);
+
+    if (phaseSearch)
+    {
+        //Restore registers
+        for (int i = 0; i < bakRegCnt; ++i)
+            dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | dataRd[i]; //msbit 1=SPI write
+        TransactSPI(addrLMS7002M, dataWr.data(), nullptr, bakRegCnt);
+        dataWr[0] = (1 << 31) | (uint32_t(0x0020) << 16) | reg20; //msbit 1=SPI write
+        TransactSPI(addrLMS7002M, dataWr.data(), nullptr, 1);
+        WriteRegister(0x000A, 0);
+        UpdateThreads();
+    }
+
     return status;
 }
 
+int ConnectionSTREAM::ReadRawStreamData(char* buffer, unsigned length, int timeout_ms)
+{
+        fpga::StopStreaming(this);
+        //USB FIFO reset
+        LMS64CProtocol::GenericPacket ctrPkt;
+        ctrPkt.cmd = CMD_USB_FIFO_RST;
+        ctrPkt.outBuffer.push_back(0x00);
+        TransferPacket(ctrPkt);
+
+        WriteRegister(0x0008, 0x0100 | 0x2);
+        WriteRegister(0x0007, 1);
+
+        fpga::StartStreaming(this);
+
+        int handle = BeginDataReading(buffer, length);
+        if (WaitForReading(handle, timeout_ms) == false)
+        {
+            AbortReading();
+        }
+
+        fpga::StopStreaming(this);
+
+        int totalBytesReceived = FinishDataReading(buffer, length, handle);
+
+	return totalBytesReceived;
+}
+
 /** @brief Function dedicated for receiving data samples from board
     @param rxFIFO FIFO to store received data
     @param terminate periodically pooled flag to terminate thread
@@ -303,9 +430,9 @@ void ConnectionSTREAM::ReceivePacketsLoop(const ThreadData args)
             t1 = t2;
             //total number of bytes sent per second
             double dataRate = 1000.0*totalBytesReceived / timePeriod;
+#ifndef NDEBUG
             //each channel sample rate
             float samplingRate = 1000.0*samplesReceived[0] / timePeriod;
-#ifndef NDEBUG
             printf("Rx: %.3f MB/s, Fs: %.3f MHz, overrun: %i, loss: %i \n", dataRate / 1000000.0, samplingRate / 1000000.0, droppedSamples, packetLoss);
 #endif
             samplesReceived[0] = 0;
@@ -447,8 +574,6 @@ void ConnectionSTREAM::TransmitPacketsLoop(const ThreadData args)
         {
             //total number of bytes sent per second
             float dataRate = 1000.0*totalBytesSent / timePeriod;
-            //total number of samples from all channels per second
-            float sampleRate = 1000.0*samplesSent / timePeriod;
             if(dataRate_Bps)
                 dataRate_Bps->store(dataRate);
             m_bufferFailures = 0;
@@ -456,6 +581,8 @@ void ConnectionSTREAM::TransmitPacketsLoop(const ThreadData args)
             totalBytesSent = 0;
             t1 = t2;
 #ifndef NDEBUG
+            //total number of samples from all channels per second
+            float sampleRate = 1000.0*samplesSent / timePeriod;
             printf("Tx: %.3f MB/s, Fs: %.3f MHz, failures: %i, ts:%li\n", dataRate / 1000000.0, sampleRate / 1000000.0, m_bufferFailures, timestamp);
 #endif
         }
diff --git a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.cpp b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.cpp
index c64e60a..fac3baa 100644
--- a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.cpp
+++ b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.cpp
@@ -10,8 +10,8 @@ using namespace std;
 namespace lime
 {
 
-ConnectionSTREAM_UNITE::ConnectionSTREAM_UNITE(void* ctx, const unsigned index, const int vid, const int pid, const char* comPortName)
-    : ConnectionSTREAM(ctx, index, vid, pid), comPort(nullptr)
+ConnectionSTREAM_UNITE::ConnectionSTREAM_UNITE(void* ctx, const std::string &vidpid, const std::string &serial, const unsigned index, const char* comPortName)
+    : ConnectionSTREAM(ctx, vidpid, serial, index), comPort(nullptr)
 {
     if(comPortName && strlen(comPortName))
     {
diff --git a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.h b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.h
index 13b4a8d..bdc2dbe 100644
--- a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.h
+++ b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITE.h
@@ -15,7 +15,7 @@ namespace lime
 class ConnectionSTREAM_UNITE : public virtual ConnectionSTREAM
 {
 public:
-    ConnectionSTREAM_UNITE(void* ctx, const unsigned index, const int vid=-1, const int pid=-1, const char* comPortName=nullptr);
+    ConnectionSTREAM_UNITE(void* ctx, const std::string &vidpid, const std::string &serial, const unsigned index, const char* comPortName=nullptr);
     virtual ~ConnectionSTREAM_UNITE(void);
 
     virtual DeviceInfo GetDeviceInfo(void) override;
diff --git a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITEEntry.cpp b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITEEntry.cpp
index ab8d609..daa66a7 100644
--- a/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITEEntry.cpp
+++ b/src/ConnectionSTREAM_UNITE/ConnectionSTREAM_UNITEEntry.cpp
@@ -141,18 +141,15 @@ std::vector<ConnectionHandle> ConnectionSTREAM_UNITEEntry::enumerate(const Conne
         comHandles.push_back(hnd);
     }
 
-    int index = 0;
     for(auto usb : usbHandles)
     {
         for(auto com : comHandles)
         {
-            ConnectionHandle hnd;
+            ConnectionHandle hnd(usb); //copy the usb index and serial
             hnd.module = "STREAM+UNITE";
             hnd.media = "USB+COM";
             hnd.name = usb.name+"+"+com.name;
             hnd.addr = usb.addr+"+"+com.addr;
-            hnd.serial = "";
-            hnd.index = index++;
             handles.push_back(hnd);
         }
     }
@@ -161,35 +158,12 @@ std::vector<ConnectionHandle> ConnectionSTREAM_UNITEEntry::enumerate(const Conne
 
 IConnection *ConnectionSTREAM_UNITEEntry::make(const ConnectionHandle &handle)
 {
-#ifndef __unix__
-    const auto pidvid = handle.addr;
-    const auto comAddrPos = pidvid.find("+");
-    std::string comName;
-    if(comAddrPos == std::string::npos)
-    {
-        return new ConnectionSTREAM_UNITE(nullptr, handle.index);
-    }
-    else
-    {
-        comName = pidvid.substr(comAddrPos + 1);
-        return new ConnectionSTREAM_UNITE(nullptr, handle.index, -1, -1, comName.c_str());
-    }
-#else
-    const auto pidvid = handle.addr;
-    const auto splitPos = pidvid.find(":");
-    const auto pid = std::stoi(pidvid.substr(0, splitPos));
-    const auto comAddrPos = pidvid.find("+");
-    if(comAddrPos == std::string::npos)
-    {
-        const auto vid = std::stoi(pidvid.substr(splitPos+1));
-        return new ConnectionSTREAM_UNITE(ctx, handle.index, vid, pid, nullptr);
-    }
-    else
-    {
-        const auto vid = std::stoi(pidvid.substr(splitPos+1, comAddrPos));
-        const auto comName = pidvid.substr(comAddrPos+1);
-        return new ConnectionSTREAM_UNITE(ctx, handle.index, vid, pid, comName.c_str());
-    }
-
-#endif
+    //separate the addr field into usb IDs and com device
+    const auto idsPlusCom = handle.addr;
+    const auto comAddrPos = idsPlusCom.find("+");
+    const auto vidPid = idsPlusCom.substr(0, comAddrPos);
+    const auto comName = idsPlusCom.substr(comAddrPos+1);
+
+    //now make the hybrid connection with com device
+    return new ConnectionSTREAM_UNITE(ctx, vidPid, handle.serial, handle.index, comName.c_str());
 }
diff --git a/src/ConnectionXillybus/ConnectionXillybus.cpp b/src/ConnectionXillybus/ConnectionXillybus.cpp
index 18a59c0..50f7e73 100644
--- a/src/ConnectionXillybus/ConnectionXillybus.cpp
+++ b/src/ConnectionXillybus/ConnectionXillybus.cpp
@@ -28,7 +28,7 @@ using namespace std;
 
 using namespace lime;
 
-/**	@brief Initializes port type and object necessary to communicate to usb device.
+/** @brief Initializes port type and object necessary to communicate to usb device.
 */
 ConnectionXillybus::ConnectionXillybus(const unsigned index)
 {
@@ -51,8 +51,7 @@ ConnectionXillybus::ConnectionXillybus(const unsigned index)
     if (this->Open(index) != 0)
         std::cerr << GetLastErrorMessage() << std::endl;
 
-    DeviceInfo info = this->GetDeviceInfo();
-
+    GetChipVersion();
     std::shared_ptr<Si5351C> si5351module(new Si5351C());
     si5351module->Initialize(this);
     si5351module->SetPLL(0, 25000000, 0);
@@ -73,84 +72,76 @@ ConnectionXillybus::ConnectionXillybus(const unsigned index)
     std::this_thread::sleep_for(std::chrono::milliseconds(10)); //some settle time
 }
 
-/**	@brief Closes connection to chip and deallocates used memory.
+/** @brief Closes connection to chip and deallocates used memory.
 */
 ConnectionXillybus::~ConnectionXillybus()
 {
     Close();
 }
 
-/**	@brief Tries to open connected USB device and find communication endpoints.
-	@return Returns 0-Success, other-EndPoints not found or device didn't connect.
+/** @brief Tries to open connected USB device and find communication endpoints.
+    @return Returns 0-Success, other-EndPoints not found or device didn't connect.
 */
 int ConnectionXillybus::Open(const unsigned index)
 {
     Close();
-
-    string writePort;
-    string readPort;
-
  #ifndef __unix__
-        writePort = "\\\\.\\xillybus_write_8";
-        readPort = "\\\\.\\xillybus_read_8";
-        writeStreamPort = "\\\\.\\xillybus_write_32";
-        readStreamPort = "\\\\.\\xillybus_read_32";
+    const char writePort[] = "\\\\.\\xillybus_write_8";
+    const char readPort[] = "\\\\.\\xillybus_read_8";
 #else
-        writePort = "/dev/xillybus_write_8";
-        readPort = "/dev/xillybus_read_8";
-        writeStreamPort = "/dev/xillybus_write_32";
-        readStreamPort = "/dev/xillybus_read_32";
+    const char writePort[] = "/dev/xillybus_write_8";
+    const char readPort[] = "/dev/xillybus_read_8";
 #endif
 
 #ifndef __unix__
-	hWrite = CreateFileA(writePort.c_str(), GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
-	hRead = CreateFileA(readPort.c_str(), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
+    hWrite = CreateFileA(writePort, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
+    hRead = CreateFileA(readPort, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
 
-    //hWriteStream = CreateFileA("\\\\.\\xillybus_write_32", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);;
-    //hReadStream = CreateFileA("\\\\.\\xillybus_read_32", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
-
-	// Check the results
-	if (hWrite == INVALID_HANDLE_VALUE || hRead == INVALID_HANDLE_VALUE)
-	{
-		CloseHandle(hWrite);
+    // Check the results
+    if (hWrite == INVALID_HANDLE_VALUE || hRead == INVALID_HANDLE_VALUE)
+    {
+        CloseHandle(hWrite);
         CloseHandle(hRead);
-		hWrite = INVALID_HANDLE_VALUE;
+        hWrite = INVALID_HANDLE_VALUE;
         hRead = INVALID_HANDLE_VALUE;
-		return -1;
-	}
+        ReportError("Failed to open Xillybus");
+        return -1;
+    }
 #else
-    hWrite = open(writePort.c_str(), O_WRONLY | O_NOCTTY | O_NONBLOCK);
-    hRead = open(readPort.c_str(), O_RDONLY | O_NOCTTY | O_NONBLOCK);
+    hWrite = open(writePort, O_WRONLY | O_NOCTTY | O_NONBLOCK);
+    hRead = open(readPort, O_RDONLY | O_NOCTTY | O_NONBLOCK);
     if (hWrite == -1 || hRead == -1)
-	{
-            close(hWrite);
-            close(hRead);
-            hWrite = -1;
-            hRead = -1;
-            ReportError(errno);
-            return -1;
-	}
+    {
+        close(hWrite);
+        close(hRead);
+        hWrite = -1;
+        hRead = -1;
+        ReportError(errno);
+        return -1;
+    }
 #endif
     return 0;
 }
 
-/**	@brief Closes communication to device.
+/** @brief Closes communication to device.
 */
 void ConnectionXillybus::Close()
 {
     isConnected = false;
 #ifndef __unix__
-	if (hWrite != INVALID_HANDLE_VALUE)
-		CloseHandle(hWrite);
-	hWrite = INVALID_HANDLE_VALUE;
+    if (hWrite != INVALID_HANDLE_VALUE)
+        CloseHandle(hWrite);
+    hWrite = INVALID_HANDLE_VALUE;
     if (hRead != INVALID_HANDLE_VALUE)
-		CloseHandle(hRead);
-	hRead = INVALID_HANDLE_VALUE;
+        CloseHandle(hRead);
+    hRead = INVALID_HANDLE_VALUE;
 
-	if (hWriteStream != INVALID_HANDLE_VALUE)
-		CloseHandle(hWriteStream);
-	if (hReadStream != INVALID_HANDLE_VALUE)
-		CloseHandle(hReadStream);
+    if (hWriteStream != INVALID_HANDLE_VALUE)
+        CloseHandle(hWriteStream);
+    hWriteStream = INVALID_HANDLE_VALUE;
+    if (hReadStream != INVALID_HANDLE_VALUE)
+        CloseHandle(hReadStream);
+    hReadStream = INVALID_HANDLE_VALUE;
 #else
     if( hWrite >= 0)
         close(hWrite);
@@ -167,14 +158,14 @@ void ConnectionXillybus::Close()
 #endif
 }
 
-/**	@brief Returns connection status
-	@return 1-connection open, 0-connection closed.
+/** @brief Returns connection status
+    @return 1-connection open, 0-connection closed.
 */
 bool ConnectionXillybus::IsOpen()
 {
 #ifndef __unix__
     if (hWrite != INVALID_HANDLE_VALUE && hRead != INVALID_HANDLE_VALUE )
-            return true;
+        return true;
 #else
     if( hWrite != -1 && hRead != -1 )
         return true;
@@ -182,262 +173,237 @@ bool ConnectionXillybus::IsOpen()
     return false;
 }
 
-/**	@brief Sends given data buffer to chip through USB port.
-	@param buffer data buffer, must not be longer than 64 bytes.
-	@param length given buffer size.
+/** @brief Sends given data buffer to chip through USB port.
+    @param buffer data buffer, must not be longer than 64 bytes.
+    @param length given buffer size.
     @param timeout_ms timeout limit for operation in milliseconds
-	@return number of bytes sent.
+    @return number of bytes sent.
 */
 int ConnectionXillybus::Write(const unsigned char *buffer, const int length, int timeout_ms)
 {
-    long totalBytesWritten = 0;
-    long bytesToWrite = length;
-
 #ifndef __unix__
-	if (hWrite == INVALID_HANDLE_VALUE)
+    if (hWrite == INVALID_HANDLE_VALUE)
 #else
-	if (hWrite == -1)
+    if (hWrite == -1)
 #endif
         return -1;
 
+    int totalBytesWritten = 0;
+    int bytesToWrite = length;
     auto t1 = chrono::high_resolution_clock::now();
-    auto t2 = chrono::high_resolution_clock::now();
 
-    while (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < 500)
+    do
     {
 #ifndef __unix__
-		DWORD bytesSent = 0;
-		OVERLAPPED	vOverlapped;
-		memset(&vOverlapped, 0, sizeof(OVERLAPPED));
-		vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
-		WriteFile(hWrite, buffer + totalBytesWritten, bytesToWrite, &bytesSent, &vOverlapped);
-		if (::GetLastError() != ERROR_IO_PENDING)
-		{
-			CloseHandle(vOverlapped.hEvent);
-			return totalBytesWritten;
-		}
-		std::this_thread::yield();
-		DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, 500);
-		if (dwRet == WAIT_OBJECT_0)
-		{
-			if (GetOverlappedResult(hWrite, &vOverlapped, &bytesSent, FALSE) == FALSE)
-			{
-				bytesSent = 0;
-			}
-		}
-		else
-		{
-			CancelIo(hWrite);
-			bytesSent = 0;
-		}
-		CloseHandle(vOverlapped.hEvent);
+        DWORD bytesSent = 0;
+        OVERLAPPED	vOverlapped;
+        memset(&vOverlapped, 0, sizeof(OVERLAPPED));
+        vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
+        WriteFile(hWrite, buffer + totalBytesWritten, bytesToWrite, &bytesSent, &vOverlapped);
+        if (::GetLastError() != ERROR_IO_PENDING)
+        {
+            CloseHandle(vOverlapped.hEvent);
+            return totalBytesWritten;
+        }
+        std::this_thread::yield();
+        DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, 500);
+        if (dwRet == WAIT_OBJECT_0)
+        {
+            if (GetOverlappedResult(hWrite, &vOverlapped, &bytesSent, FALSE) == FALSE)
+            {
+                bytesSent = 0;
+            }
+        }
+        else
+        {
+            CancelIo(hWrite);
+            bytesSent = 0;
+        }
+        CloseHandle(vOverlapped.hEvent);
 #else
-		int bytesSent;
+        int bytesSent;
         if ((bytesSent  = write(hWrite, buffer+ totalBytesWritten, bytesToWrite))<0)
         {
-
-            if(errno == EINTR)
+            if(errno == EINTR || errno == EAGAIN)
                  continue;
-            else if (errno != EAGAIN)
-            {
-                ReportError(errno);
-                return totalBytesWritten;
-            }
+            ReportError(errno);
+            return totalBytesWritten;
         }
-		else
 #endif
         totalBytesWritten += bytesSent;
         if (totalBytesWritten < length)
-        {
             bytesToWrite -= bytesSent;
-            t2 = chrono::high_resolution_clock::now();
-        }
         else
             break;
-    }
+
+    }while (std::chrono::duration_cast<std::chrono::milliseconds>(chrono::high_resolution_clock::now() - t1).count() < timeout_ms);
 #ifdef __unix__
     //Flush data to FPGA
-    while (1)
+    while (write(hWrite, NULL, 0) < 0)
     {
-        int rc = write(hWrite, NULL, 0);
-        if (rc < 0)
-        {
-            if (errno == EINTR)
-                continue;
-            else
-            {
-                ReportError(errno);
-            }
-        }
+        if (errno == EINTR)
+            continue;
+        ReportError(errno);
         break;
     }
 #endif
     return totalBytesWritten;
 }
 
-/**	@brief Reads data coming from the chip through USB port.
-	@param buffer pointer to array where received data will be copied, array must be
-	big enough to fit received data.
-	@param length number of bytes to read from chip.
+/** @brief Reads data coming from the chip through USB port.
+    @param buffer pointer to array where received data will be copied, array must be
+    big enough to fit received data.
+    @param length number of bytes to read from chip.
     @param timeout_ms timeout limit for operation in milliseconds
-	@return number of bytes received.
+    @return number of bytes received.
 */
 int ConnectionXillybus::Read(unsigned char *buffer, const int length, int timeout_ms)
 {
     memset(buffer, 0, length);
 #ifndef __unix__
-	if (hRead == INVALID_HANDLE_VALUE)
+    if (hRead == INVALID_HANDLE_VALUE)
 #else
-	if (hRead == -1)
+    if (hRead == -1)
 #endif
-            return -1;
+        return -1;
 
-	long totalBytesReaded = 0;
-	long bytesToRead = length;
-	auto t1 = chrono::high_resolution_clock::now();
-	auto t2 = chrono::high_resolution_clock::now();
+    int totalBytesReaded = 0;
+    int bytesToRead = length;
+    auto t1 = chrono::high_resolution_clock::now();
 
-	while (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < 1000)
-	{
+    do
+    {
  #ifndef __unix__
-	   DWORD bytesReceived = 0;
-	   OVERLAPPED	vOverlapped;
-	   memset(&vOverlapped, 0, sizeof(OVERLAPPED));
-	   vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
-	   ReadFile(hRead, buffer + totalBytesReaded, bytesToRead, &bytesReceived, &vOverlapped);
-	   if (::GetLastError() != ERROR_IO_PENDING)
-	   {
-		 CloseHandle(vOverlapped.hEvent);
-		 return totalBytesReaded;
-	   }
-	   std::this_thread::yield();
-	   DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, 1000);
-	   if (dwRet == WAIT_OBJECT_0)
-	   {
-		   if (GetOverlappedResult(hRead, &vOverlapped, &bytesReceived, TRUE) == FALSE)
-		   {
-			   bytesReceived = 0;
-		   }
-	   }
-	   else
-	   {
-		   CancelIo(hRead);
-		   bytesReceived = 0;
-		}
-	   CloseHandle(vOverlapped.hEvent);
-#else
-            int bytesReceived = 0;
-            if ((bytesReceived = read(hRead, buffer+ totalBytesReaded, bytesToRead))<0)
-            {
-                if(errno == EINTR)
-                     continue;
-                else if (errno != EAGAIN)
-                {
-                    ReportError(errno);
-                    return totalBytesReaded;
-                }
-            }
-            else
-#endif
-            totalBytesReaded += bytesReceived;
-            if (totalBytesReaded < length)
+        DWORD bytesReceived = 0;
+        OVERLAPPED	vOverlapped;
+        memset(&vOverlapped, 0, sizeof(OVERLAPPED));
+        vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
+        ReadFile(hRead, buffer + totalBytesReaded, bytesToRead, &bytesReceived, &vOverlapped);
+        if (::GetLastError() != ERROR_IO_PENDING)
+        {
+            CloseHandle(vOverlapped.hEvent);
+            return totalBytesReaded;
+        }
+        std::this_thread::yield();
+        DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, 1000);
+        if (dwRet == WAIT_OBJECT_0)
+        {
+            if (GetOverlappedResult(hRead, &vOverlapped, &bytesReceived, TRUE) == FALSE)
             {
-                    bytesToRead -= bytesReceived;
-                    t2 = chrono::high_resolution_clock::now();
+                bytesReceived = 0;
             }
-            else
-               break;
         }
+        else
+        {
+            CancelIo(hRead);
+            bytesReceived = 0;
+        }
+        CloseHandle(vOverlapped.hEvent);
+#else
+        int bytesReceived;
+        if ((bytesReceived = read(hRead, buffer+ totalBytesReaded, bytesToRead))<0)
+        {
+           if(errno == EINTR || errno == EAGAIN)
+               continue;
+           ReportError(errno);
+           return totalBytesReaded;
+        }
+#endif
+        totalBytesReaded += bytesReceived;
+        if (totalBytesReaded < length)
+           bytesToRead -= bytesReceived;
+        else
+           break;
+
+    }while (std::chrono::duration_cast<std::chrono::milliseconds>(chrono::high_resolution_clock::now() - t1).count() < timeout_ms);
+
     return totalBytesReaded;
 }
 
 /**
-	@brief Reads data from board
-	@param buffer array where to store received data
-	@param length number of bytes to read
-        @param timeout read timeout in milliseconds
-	@return number of bytes received
+    @brief Reads data from board
+    @param buffer array where to store received data
+    @param length number of bytes to read
+    @param timeout read timeout in milliseconds
+    @return number of bytes received
 */
-int ConnectionXillybus::ReceiveData(char *buffer, uint32_t length, double timeout_ms)
+int ConnectionXillybus::ReceiveData(char *buffer, const int length, const int timeout_ms)
 {
-    unsigned long totalBytesReaded = 0;
-    unsigned long bytesToRead = length;
-
 #ifndef __unix__
     if (hReadStream == INVALID_HANDLE_VALUE)
     {
-            hReadStream = CreateFileA("\\\\.\\xillybus_read_32", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
-            //hWriteStream = CreateFileA("\\\\.\\xillybus_write_32", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+        hReadStream = CreateFileA("\\\\.\\xillybus_read_32", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
+        if (hReadStream == INVALID_HANDLE_VALUE)
+        {
+            ReportError("Failed to open Xillybus");
+            return -1;
+        }
     }
 #else
-    if (hReadStream < 0)
+    if (hReadStream == -1)
     {
-       if (( hReadStream = open(readStreamPort.c_str(), O_RDONLY | O_NOCTTY | O_NONBLOCK))<0)
+       if (( hReadStream = open("/dev/xillybus_read_32", O_RDONLY | O_NOCTTY | O_NONBLOCK))==-1)
        {
             ReportError(errno);
             return -1;
        }
     }
 #endif
+
+    int totalBytesReaded = 0;
+    int bytesToRead = length;
     auto t1 = chrono::high_resolution_clock::now();
-    auto t2 = chrono::high_resolution_clock::now();
 
-    while (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms)
+    do
     {
  #ifndef __unix__
-		DWORD bytesReceived = 0;
-		OVERLAPPED	vOverlapped;
-		memset(&vOverlapped, 0, sizeof(OVERLAPPED));
-		vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
-		ReadFile(hReadStream, buffer + totalBytesReaded, bytesToRead, &bytesReceived, &vOverlapped);
-		if (::GetLastError() != ERROR_IO_PENDING)
-		{
-			CloseHandle(vOverlapped.hEvent);
-			return totalBytesReaded;
-		}
-		DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, timeout_ms);
-		if (dwRet == WAIT_OBJECT_0)
-		{
-			if (GetOverlappedResult(hReadStream, &vOverlapped, &bytesReceived, TRUE) == FALSE)
-			{
-				bytesReceived = 0;
-			}
-		}
-		else
-		{
-			CancelIo(hReadStream);
-			bytesReceived = 0;
-		}
-		CloseHandle(vOverlapped.hEvent);
-#else
-		int bytesReceived = 0;
-        if ((bytesReceived = read(hReadStream, buffer+ totalBytesReaded, bytesToRead))<0)
+        DWORD bytesReceived = 0;
+        OVERLAPPED	vOverlapped;
+        memset(&vOverlapped, 0, sizeof(OVERLAPPED));
+        vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
+        ReadFile(hReadStream, buffer + totalBytesReaded, bytesToRead, &bytesReceived, &vOverlapped);
+        if (::GetLastError() != ERROR_IO_PENDING)
         {
-            bytesReceived = 0;
-            if(errno == EINTR)
-                 continue;
-            else if (errno != EAGAIN)
+            CloseHandle(vOverlapped.hEvent);
+            return totalBytesReaded;
+        }
+        DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, timeout_ms);
+        if (dwRet == WAIT_OBJECT_0)
+        {
+            if (GetOverlappedResult(hReadStream, &vOverlapped, &bytesReceived, TRUE) == FALSE)
             {
-                ReportError(errno);
-                return totalBytesReaded;
+                bytesReceived = 0;
             }
         }
+        else
+        {
+            CancelIo(hReadStream);
+            bytesReceived = 0;
+        }
+        CloseHandle(vOverlapped.hEvent);
+#else
+        int bytesReceived;
+        if ((bytesReceived = read(hReadStream, buffer+ totalBytesReaded, bytesToRead))<0)
+        {
+            if(errno == EINTR || errno == EAGAIN)
+                continue;
+            ReportError(errno);
+            return totalBytesReaded;
+        }
 #endif
         totalBytesReaded += bytesReceived;
         if (totalBytesReaded < length)
-        {
             bytesToRead -= bytesReceived;
-            t2 = chrono::high_resolution_clock::now();
-        }
         else
             break;
-    }
+
+    }while (std::chrono::duration_cast<std::chrono::milliseconds>(chrono::high_resolution_clock::now() - t1).count() < timeout_ms);
 
     return totalBytesReaded;
 }
 
 /**
-	@brief Aborts reading operations
+    @brief Aborts reading operations
 */
 void ConnectionXillybus::AbortReading()
 {
@@ -445,7 +411,7 @@ void ConnectionXillybus::AbortReading()
     if (hReadStream != INVALID_HANDLE_VALUE)
     {
         CloseHandle(hReadStream);
-		hReadStream = INVALID_HANDLE_VALUE;
+	hReadStream = INVALID_HANDLE_VALUE;
     }
 #else
     if (hReadStream >= 0)
@@ -457,99 +423,89 @@ void ConnectionXillybus::AbortReading()
 }
 
 /**
-	@brief  sends data to board
-	@param *buffer buffer to send
-	@param length number of bytes to send
-        @param timeout data write timeout in milliseconds
-	@return number of bytes sent
+    @brief  sends data to board
+    @param *buffer buffer to send
+    @param length number of bytes to send
+    @param timeout data write timeout in milliseconds
+    @return number of bytes sent
 */
-int ConnectionXillybus::SendData(const char *buffer, uint32_t length, double timeout_ms)
+int ConnectionXillybus::SendData(const char *buffer, const int length, const int timeout_ms)
 {
 #ifndef __unix__
-	if (hWriteStream == INVALID_HANDLE_VALUE)
-	{
-		hWriteStream = CreateFileA("\\\\.\\xillybus_write_32", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
-	}
-#else
-        if (hWriteStream < 0)
+    if (hWriteStream == INVALID_HANDLE_VALUE)
+    {
+        hWriteStream = CreateFileA("\\\\.\\xillybus_write_32", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
+        if (hWriteStream == INVALID_HANDLE_VALUE)
         {
-           if ((hWriteStream = open(writeStreamPort.c_str(), O_WRONLY | O_NOCTTY | O_NONBLOCK))<0)
-           {
-                ReportError(errno);
-		return -1;
-           }
+            ReportError("Failed to open Xillybus");
+            return -1;
         }
-
+    }
+#else
+    if (hWriteStream == -1)
+    {
+       if ((hWriteStream = open("/dev/xillybus_write_32", O_WRONLY | O_NOCTTY | O_NONBLOCK))==-1)
+       {
+            ReportError(errno);
+            return -1;
+       }
+    }
 #endif
-    unsigned long totalBytesWritten = 0;
-    unsigned long bytesToWrite = length;
+    int totalBytesWritten = 0;
+    int bytesToWrite = length;
     auto t1 = chrono::high_resolution_clock::now();
-    auto t2 = chrono::high_resolution_clock::now();
 
-    while (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms)
+    do
     {
 #ifndef __unix__
-		DWORD bytesSent = 0;
-		OVERLAPPED	vOverlapped;
-		memset(&vOverlapped, 0, sizeof(OVERLAPPED));
-		vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
-		WriteFile(hWriteStream, buffer + totalBytesWritten, bytesToWrite, &bytesSent, &vOverlapped);
-		if (::GetLastError() != ERROR_IO_PENDING)
-		{
-			CloseHandle(vOverlapped.hEvent);
-			return totalBytesWritten;
-		}
-		DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, timeout_ms);
-		if (dwRet == WAIT_OBJECT_0)
-		{
-			if (GetOverlappedResult(hWriteStream, &vOverlapped, &bytesSent, TRUE) == FALSE)
-			{
-				bytesSent = 0;
-			}
-		}
-		else
-		{
-			CancelIo(hWriteStream);
-			bytesSent = 0;
-		}
-		CloseHandle(vOverlapped.hEvent);
-#else
-		int bytesSent = 0;
-        if ((bytesSent  = write(hWriteStream, buffer+ totalBytesWritten, bytesToWrite))<0)
+        DWORD bytesSent = 0;
+        OVERLAPPED	vOverlapped;
+        memset(&vOverlapped, 0, sizeof(OVERLAPPED));
+        vOverlapped.hEvent = CreateEvent(NULL, false, false, NULL);
+        WriteFile(hWriteStream, buffer + totalBytesWritten, bytesToWrite, &bytesSent, &vOverlapped);
+        if (::GetLastError() != ERROR_IO_PENDING)
         {
-            bytesSent =0;
-            if(errno == EINTR)
-                 continue;
-            else if (errno != EAGAIN)
+            CloseHandle(vOverlapped.hEvent);
+            return totalBytesWritten;
+        }
+        DWORD dwRet = WaitForSingleObject(vOverlapped.hEvent, timeout_ms);
+        if (dwRet == WAIT_OBJECT_0)
+        {
+            if (GetOverlappedResult(hWriteStream, &vOverlapped, &bytesSent, TRUE) == FALSE)
             {
-                ReportError(errno);
-                return totalBytesWritten;
+                bytesSent = 0;
             }
         }
+        else
+        {
+            CancelIo(hWriteStream);
+            bytesSent = 0;
+        }
+        CloseHandle(vOverlapped.hEvent);
+#else
+        int bytesSent;
+        if ((bytesSent  = write(hWriteStream, buffer+ totalBytesWritten, bytesToWrite))<0)
+        {
+            if(errno == EINTR || errno == EAGAIN)
+                continue;
+            ReportError(errno);
+            return totalBytesWritten;
+        }
 #endif
         totalBytesWritten += bytesSent;
         if (totalBytesWritten < length)
-        {
             bytesToWrite -= bytesSent;
-            t2 = chrono::high_resolution_clock::now();
-        }
         else
             break;
-    }
+
+    }while (std::chrono::duration_cast<std::chrono::milliseconds>(chrono::high_resolution_clock::now() - t1).count() < timeout_ms);
     //Flush data to FPGA
 #ifdef __unix__
-    while (1)
+    while (write(hWriteStream, NULL, 0)<0)
     {
-        int rc = write(hWriteStream, NULL, 0);
-        if (rc < 0)
-        {
-            if (errno == EINTR)
-                continue;
-            else
-            {
-                ReportError(errno);
-            }
-        }
+        if (errno == EINTR)
+            continue;
+        ReportError(errno);
         break;
     }
 #endif
@@ -565,26 +521,26 @@ void ConnectionXillybus::AbortSending()
     if (hWriteStream != INVALID_HANDLE_VALUE)
     {
         CloseHandle(hWriteStream);
-		hWriteStream = INVALID_HANDLE_VALUE;
+        hWriteStream = INVALID_HANDLE_VALUE;
     }
 #else
     if (hWriteStream >= 0)
     {
-        close (hWriteStream);
+        close(hWriteStream);
         hWriteStream = -1;
     }
 #endif
 }
 
 /** @brief Configures Stream board FPGA clocks to Limelight interface
- at param tx Rx/Tx selection
- at param InterfaceClk_Hz Limelight interface frequency
- at param phaseShift_deg IQ phase shift in degrees
- at return 0-success, other-failure
+    @param tx Rx/Tx selection
+    @param InterfaceClk_Hz Limelight interface frequency
+    @param phaseShift_deg IQ phase shift in degrees
+    @return 0-success, other-failure
 */
 int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double interfaceClk_Hz, const double phaseShift_deg)
 {
-    eLMS_DEV boardType = GetDeviceInfo().deviceName == GetDeviceName(LMS_DEV_QSPARK) ? LMS_DEV_QSPARK : LMS_DEV_UNKNOWN;
+    eLMS_DEV boardType = GetDeviceInfo().deviceName == GetDeviceName(LMS_DEV_LIMESDR_QPCIE) ? LMS_DEV_LIMESDR_QPCIE : LMS_DEV_UNKNOWN;
     const uint16_t busyAddr = 0x0021;
     if(IsOpen() == false)
         return ReportError(ENODEV, "ConnectionSTREAM: configure FPGA PLL, device not connected");
@@ -611,8 +567,8 @@ int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double in
         const float oversampleClock_ns = 1e9 / oversampleClock_Hz;
         const float phaseStep_deg = 360 * oversampleClock_ns*(1e-9) / (1 / inputClock_Hz);
         uint16_t phase_reg_select = (phaseShift_deg / phaseStep_deg)+0.5;
-        const float actualPhaseShift_deg = 360 * inputClock_Hz / (1 / (phase_reg_select * oversampleClock_ns*1e-9));
 #ifndef NDEBUG
+        const float actualPhaseShift_deg = 360 * inputClock_Hz / (1 / (phase_reg_select * oversampleClock_ns*1e-9));
         printf("reg value : %i\n", phase_reg_select);
         printf("input clock: %f\n", inputClock_Hz);
         printf("phase : %.2f/%.2f\n", phaseShift_deg, actualPhaseShift_deg);
@@ -656,7 +612,7 @@ int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double in
     values.push_back(reg23val | PLLRST_START); //PLLRST_START
     WriteRegisters(addrs.data(), values.data(), values.size());
 
-    if(boardType == LMS_DEV_QSPARK) do //wait for reset to activate
+    if(boardType == LMS_DEV_LIMESDR_QPCIE) do //wait for reset to activate
     {
         ReadRegister(busyAddr, statusReg);
         done = statusReg & 0x1;
@@ -720,7 +676,7 @@ int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double in
         values.push_back(reg23val | PLLCFG_START); //PLLCFG_START
         if(WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
             ReportError(EIO, "ConnectionSTREAM: configure FPGA PLL, failed to write registers");
-        if(boardType == LMS_DEV_QSPARK) do //wait for config to activate
+        if(boardType == LMS_DEV_LIMESDR_QPCIE) do //wait for config to activate
         {
             ReadRegister(busyAddr, statusReg);
             done = statusReg & 0x1;
@@ -737,7 +693,7 @@ int ConnectionXillybus::ConfigureFPGA_PLL(unsigned int pllIndex, const double in
         values.push_back(reg23val | PHCFG_START); //PHCFG_START
         if(WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
             ReportError(EIO, "ConnectionSTREAM: configure FPGA PLL, failed to write registers");
-        if(boardType == LMS_DEV_QSPARK) do
+        if(boardType == LMS_DEV_LIMESDR_QPCIE) do
         {
             ReadRegister(busyAddr, statusReg);
             done = statusReg & 0x1;
diff --git a/src/ConnectionXillybus/ConnectionXillybus.h b/src/ConnectionXillybus/ConnectionXillybus.h
index 4a34d6e..d394824 100644
--- a/src/ConnectionXillybus/ConnectionXillybus.h
+++ b/src/ConnectionXillybus/ConnectionXillybus.h
@@ -30,31 +30,33 @@ public:
     ConnectionXillybus(const unsigned index);
     ~ConnectionXillybus(void);
 
-	int Open(const unsigned index);
-	void Close();
-	bool IsOpen();
-	int GetOpenedIndex();
-
-	int Write(const unsigned char *buffer, int length, int timeout_ms = 100) override;
-	int Read(unsigned char *buffer, int length, int timeout_ms = 100) override;
-
-	//hooks to update FPGA plls when baseband interface data rate is changed
-	int UpdateExternalDataRate(const size_t channel, const double txRate, const double rxRate) override;
+    int Open(const unsigned index);
+    void Close();
+    bool IsOpen();
+    int GetOpenedIndex();
+
+    int Write(const unsigned char *buffer, int length, int timeout_ms = 100) override;
+    int Read(unsigned char *buffer, int length, int timeout_ms = 100) override;
+
+    //hooks to update FPGA plls when baseband interface data rate is changed
+    int UpdateExternalDataRate(const size_t channel, const double txRate, const double rxRate) override;
+    int UploadWFM(const void* const* samples, uint8_t chCount, size_t sample_count, StreamConfig::StreamDataFormat format)override;
+    int ReadRawStreamData(char* buffer, unsigned length, int timeout_ms = 100)override;
 protected:
     virtual void ReceivePacketsLoop(const ThreadData args) override;
     virtual void TransmitPacketsLoop(const ThreadData args) override;
 
-    virtual int ReceiveData(char* buffer, uint32_t length, double timeout);
+    virtual int ReceiveData(char* buffer, const int length, const int timeout = 100);
     virtual void AbortReading();
 
-    virtual int SendData(const char* buffer, uint32_t length, double timeout);
+    virtual int SendData(const char* buffer, const int length, const int timeout = 100);
     virtual void AbortSending();
 
     int ConfigureFPGA_PLL(unsigned int pllIndex, const double interfaceClk_Hz, const double phaseShift_deg);
 private:
     eConnectionType GetType(void)
     {
-        return USB_PORT;
+        return PCIE_PORT;
     }
 
     std::string m_hardwareName;
diff --git a/src/ConnectionXillybus/ConnectionXillybusing.cpp b/src/ConnectionXillybus/ConnectionXillybusing.cpp
index 12aec52..0279b29 100644
--- a/src/ConnectionXillybus/ConnectionXillybusing.cpp
+++ b/src/ConnectionXillybus/ConnectionXillybusing.cpp
@@ -23,47 +23,206 @@ using namespace lime;
 */
 int ConnectionXillybus::UpdateExternalDataRate(const size_t channel, const double txRate_Hz, const double rxRate_Hz)
 {
-    std::cout << "ConnectionXillybus::ConfigureFPGA_PLL(tx=" << txRate_Hz/1e6 << "MHz, rx=" << rxRate_Hz/1e6 << "MHz)" << std::endl;
+    std::cout << "ConfigureFPGA_PLL(tx=" << txRate_Hz/1e6 << "MHz, rx=" << rxRate_Hz/1e6 << "MHz)" << std::endl;
     const float txInterfaceClk = 2 * txRate_Hz;
     const float rxInterfaceClk = 2 * rxRate_Hz;
-    mExpectedSampleRate = rxRate_Hz;
     int status = 0;
-    if(txInterfaceClk >= 5e6)
+    uint32_t reg20;
+    const double rxPhC1[] = { 91.08, 89.46 };
+    const double rxPhC2[] = { -1 / 6e6, 1.24e-6 };
+    const double txPhC1[] = { 89.75, 89.61 };
+    const double txPhC2[] = { -3.0e-7, 2.71e-7 };
+
+    const std::vector<uint32_t> spiAddr = {0x0021, 0x0022, 0x0023, 0x0024,
+                                           0x0027, 0x002A, 0x0400, 0x040C,
+                                           0x040B, 0x0400, 0x040B, 0x0400};
+    const int bakRegCnt = spiAddr.size() - 4;
+    auto info = GetDeviceInfo();
+    const int addrLMS7002M = info.addrsLMS7002M.at(0);
+    bool phaseSearch = false;
+    if (this->chipVersion == 0x3841 && stoi(info.gatewareRevision) >= 12) //0x3840 LMS7002Mr2, 0x3841 LMS7002Mr3
+        if(rxInterfaceClk >= 5e6 || txInterfaceClk >= 5e6)
+            phaseSearch = true;
+    mExpectedSampleRate = rxRate_Hz;
+
+    std::vector<uint32_t> dataWr;
+    std::vector<uint32_t> dataRd;
+
+    if (phaseSearch)
     {
+        dataWr.resize(spiAddr.size());
+        dataRd.resize(spiAddr.size());
+        //backup registers
+        dataWr[0] = (uint32_t(0x0020) << 16);
+        TransactSPI(addrLMS7002M, dataWr.data(), &reg20, 1);
+
+        dataWr[0] = (1 << 31) | (uint32_t(0x0020) << 16) | 0xFFFD; //msbit 1=SPI write
+        TransactSPI(addrLMS7002M, dataWr.data(), nullptr, 1);
+
+        for (int i = 0; i < bakRegCnt; ++i)
+            dataWr[i] = (spiAddr[i] << 16);
+        TransactSPI(addrLMS7002M, dataWr.data(), dataRd.data(), bakRegCnt);
+        UpdateThreads(true);
+    }
+
+    if(rxInterfaceClk >= 5e6)
+    {
+        if (phaseSearch)
+        {
+            const std::vector<uint32_t> spiData = { 0x0E9F, 0x07FF, 0x5550, 0xE4E4,
+                                                    0xE4E4, 0x0086, 0x028D, 0x00FF,
+                                                    0x5555, 0x02CD, 0xAAAA, 0x02ED};
+            //Load test config
+            const int setRegCnt = spiData.size();
+            for (int i = 0; i < setRegCnt; ++i)
+                dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | spiData[i]; //msbit 1=SPI write
+            TransactSPI(addrLMS7002M, dataWr.data(), nullptr, setRegCnt);
+        }
         lime::fpga::FPGA_PLL_clock clocks[2];
         clocks[0].bypass = false;
         clocks[0].index = 0;
-        clocks[0].outFrequency = txInterfaceClk;
+        clocks[0].outFrequency = rxInterfaceClk;
         clocks[0].phaseShift_deg = 0;
+        clocks[0].findPhase = false;
         clocks[1].bypass = false;
         clocks[1].index = 1;
-        clocks[1].outFrequency = txInterfaceClk;
-        clocks[1].phaseShift_deg = 90;
-        status = lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 2);
+        clocks[1].outFrequency = rxInterfaceClk;
+        if (this->chipVersion == 0x3841)
+            clocks[1].phaseShift_deg = rxPhC1[1] + rxPhC2[1] * rxInterfaceClk;
+        else
+            clocks[1].phaseShift_deg = rxPhC1[0] + rxPhC2[0] * rxInterfaceClk;
+
+        if (phaseSearch)
+        {
+            clocks[1].findPhase = true;
+        }
+        else
+        {
+            clocks[1].findPhase = false;
+        }
+        status = lime::fpga::SetPllFrequency(this, 1, rxInterfaceClk, clocks, 2);
     }
     else
-        status = lime::fpga::SetDirectClocking(this, 0, txInterfaceClk, 90);
-    if(status != 0)
-        return status;
+        status = lime::fpga::SetDirectClocking(this, 1, rxInterfaceClk, 90);
 
-    if(rxInterfaceClk >= 5e6)
+    if(txInterfaceClk >= 5e6)
     {
+        if (phaseSearch)
+        {
+            const std::vector<uint32_t> spiData = {0x0E9F, 0x07FF, 0x5550, 0xE4E4,
+                                                   0xE4E4, 0x0484};
+            WriteRegister(0x000A, 0x0000);
+            //Load test config
+            const int setRegCnt = spiData.size();
+            for (int i = 0; i < setRegCnt; ++i)
+                dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | spiData[i]; //msbit 1=SPI write
+            TransactSPI(addrLMS7002M, dataWr.data(), nullptr, setRegCnt);
+        }
+
         lime::fpga::FPGA_PLL_clock clocks[2];
         clocks[0].bypass = false;
         clocks[0].index = 0;
-        clocks[0].outFrequency = rxInterfaceClk;
+        clocks[0].outFrequency = txInterfaceClk;
         clocks[0].phaseShift_deg = 0;
+        clocks[0].findPhase = false;
         clocks[1].bypass = false;
         clocks[1].index = 1;
-        clocks[1].outFrequency = rxInterfaceClk;
-        clocks[1].phaseShift_deg = 90;
-        status = lime::fpga::SetPllFrequency(this, 1, rxInterfaceClk, clocks, 2);
+        clocks[1].outFrequency = txInterfaceClk;
+        if (this->chipVersion == 0x3841)
+            clocks[1].phaseShift_deg = txPhC1[1] + txPhC2[1] * txInterfaceClk;
+        else
+            clocks[1].phaseShift_deg = txPhC1[0] + txPhC2[0] * txInterfaceClk;
+
+        if (phaseSearch)
+        {
+            clocks[1].findPhase = true;
+            WriteRegister(0x000A, 0x0200);
+        }
+        else
+        {
+            clocks[1].findPhase = false;
+        }
+        status = lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 2);
     }
     else
-        status = lime::fpga::SetDirectClocking(this, 1, rxInterfaceClk, 90);
+        status = lime::fpga::SetDirectClocking(this, 0, txInterfaceClk, 90);
+
+    if (phaseSearch)
+    {
+        //Restore registers
+        for (int i = 0; i < bakRegCnt; ++i)
+            dataWr[i] = (1 << 31) | (uint32_t(spiAddr[i]) << 16) | dataRd[i]; //msbit 1=SPI write
+        TransactSPI(addrLMS7002M, dataWr.data(), nullptr, bakRegCnt);
+        dataWr[0] = (1 << 31) | (uint32_t(0x0020) << 16) | reg20; //msbit 1=SPI write
+        TransactSPI(addrLMS7002M, dataWr.data(), nullptr, 1);
+        WriteRegister(0x000A, 0);
+        UpdateThreads();
+    }
+
     return status;
 }
 
+
+int ConnectionXillybus::UploadWFM(const void* const* samples, uint8_t chCount, size_t sample_count, StreamConfig::StreamDataFormat format)
+{
+    WriteRegister(0x000C, 0x3); //channels 0,1
+    WriteRegister(0x000E, 0x2); //12bit samples
+    WriteRegister(0x000D, 0x0004); //WFM_LOAD
+
+    lime::FPGA_DataPacket pkt;
+    size_t samplesUsed = 0;
+
+    const complex16_t* const* src = (const complex16_t* const*)samples;
+    int cnt = sample_count;
+
+    const lime::complex16_t** batch = new const lime::complex16_t*[chCount];
+    while(cnt > 0)
+    {
+        pkt.counter = 0;
+        pkt.reserved[0] = 0;
+        int samplesToSend = cnt > 1360/chCount ? 1360/chCount : cnt;
+        cnt -= samplesToSend;
+
+        for(uint8_t i=0; i<chCount; ++i)
+            batch[i] = &src[i][samplesUsed];
+        samplesUsed += samplesToSend;
+
+        size_t bufPos = 0;
+        lime::fpga::Samples2FPGAPacketPayload(batch, samplesToSend, chCount, format, pkt.data, &bufPos);
+        int payloadSize = (bufPos / 4) * 4;
+        if(bufPos % 4 != 0)
+            printf("Packet samples count not multiple of 4\n");
+        pkt.reserved[2] = (payloadSize >> 8) & 0xFF; //WFM loading
+        pkt.reserved[1] = payloadSize & 0xFF; //WFM loading
+        pkt.reserved[0] = 0x1 << 5; //WFM loading
+
+        long bToSend = 16+payloadSize;
+        if (SendData((const char*)&pkt,bToSend,1000)!=bToSend)
+            break;
+    }
+    delete[] batch;
+    AbortSending();
+    this_thread::sleep_for(chrono::milliseconds(100));
+    if(cnt == 0)
+        return 0;
+    else
+        return ReportError(-1, "Failed to upload waveform");
+}
+
+int ConnectionXillybus::ReadRawStreamData(char* buffer, unsigned length, int timeout_ms)
+{
+    fpga::StopStreaming(this);
+    WriteRegister(0x0008, 0x0100 | 0x2);
+    WriteRegister(0x0007, 1);
+
+    fpga::StartStreaming(this);
+    int totalBytesReceived = ReceiveData(buffer, length,timeout_ms);
+
+    fpga::StopStreaming(this);
+    AbortReading();
+    return totalBytesReceived;
+}
+
 /** @brief Function dedicated for receiving data samples from board
     @param rxFIFO FIFO to store received data
     @param terminate periodically pooled flag to terminate thread
@@ -224,9 +383,9 @@ void ConnectionXillybus::ReceivePacketsLoop(const ThreadData args)
             t1 = t2;
             //total number of bytes sent per second
             double dataRate = 1000.0*totalBytesReceived / timePeriod;
+#ifndef NDEBUG
             //each channel sample rate
             float samplingRate = 1000.0*samplesReceived[0] / timePeriod;
-#ifndef NDEBUG
             printf("Rx: %.3f MB/s, Fs: %.3f MHz, overrun: %i, loss: %i \n", dataRate / 1000000.0, samplingRate / 1000000.0, droppedSamples, packetLoss);
 #endif
             samplesReceived[0] = 0;
@@ -341,8 +500,6 @@ void ConnectionXillybus::TransmitPacketsLoop(const ThreadData args)
         {
             //total number of bytes sent per second
             float dataRate = 1000.0*totalBytesSent / timePeriod;
-            //total number of samples from all channels per second
-            float sampleRate = 1000.0*samplesSent / timePeriod;
             if(dataRate_Bps)
                 dataRate_Bps->store(dataRate);
             m_bufferFailures = 0;
@@ -350,6 +507,8 @@ void ConnectionXillybus::TransmitPacketsLoop(const ThreadData args)
             totalBytesSent = 0;
             t1 = t2;
 #ifndef NDEBUG
+            //total number of samples from all channels per second
+            float sampleRate = 1000.0*samplesSent / timePeriod;
             printf("Tx: %.3f MB/s, Fs: %.3f MHz, failures: %i, ts:%li\n", dataRate / 1000000.0, sampleRate / 1000000.0, m_bufferFailures, timestamp);
 #endif
         }
diff --git a/src/Connection_uLimeSDR/Connection_uLimeSDR.cpp b/src/Connection_uLimeSDR/Connection_uLimeSDR.cpp
index d41d3dd..1a9a9c1 100644
--- a/src/Connection_uLimeSDR/Connection_uLimeSDR.cpp
+++ b/src/Connection_uLimeSDR/Connection_uLimeSDR.cpp
@@ -10,8 +10,8 @@
 #include <iostream>
 
 #include <thread>
-#include <chrono>
-#include <FPGA_common.h>
+#include <chrono>
+#include <FPGA_common.h>
 #include <LMS7002M.h>
 #include <ciso646>
 
@@ -19,11 +19,11 @@ using namespace std;
 using namespace lime;
 
 Connection_uLimeSDR::Connection_uLimeSDR(void *arg)
-{
-    RxLoopFunction = bind(&Connection_uLimeSDR::ReceivePacketsLoop, this, std::placeholders::_1);
-    TxLoopFunction = bind(&Connection_uLimeSDR::TransmitPacketsLoop, this, std::placeholders::_1);
-
-    isConnected = false;
+{
+    RxLoopFunction = bind(&Connection_uLimeSDR::ReceivePacketsLoop, this, std::placeholders::_1);
+    TxLoopFunction = bind(&Connection_uLimeSDR::TransmitPacketsLoop, this, std::placeholders::_1);
+
+    isConnected = false;
 
     mStreamWrEndPtAddr = 0x03;
     mStreamRdEndPtAddr = 0x83;
@@ -43,18 +43,20 @@ Connection_uLimeSDR::Connection_uLimeSDR(void *arg)
 /**	@brief Initializes port type and object necessary to communicate to usb device.
 */
 Connection_uLimeSDR::Connection_uLimeSDR(void *arg, const unsigned index, const int vid, const int pid)
-{
-    mTimestampOffset = 0;
-    rxLastTimestamp.store(0);
-    mExpectedSampleRate = 0;
-    generateData.store(false);
-    rxRunning.store(false);
-    txRunning.store(false);
-    isConnected = false;
-    terminateRx.store(false);
-    terminateTx.store(false);
-    rxDataRate_Bps.store(0);
-    txDataRate_Bps.store(0);
+{
+    RxLoopFunction = bind(&Connection_uLimeSDR::ReceivePacketsLoop, this, std::placeholders::_1);
+    TxLoopFunction = bind(&Connection_uLimeSDR::TransmitPacketsLoop, this, std::placeholders::_1);
+    mTimestampOffset = 0;
+    rxLastTimestamp.store(0);
+    mExpectedSampleRate = 0;
+    generateData.store(false);
+    rxRunning.store(false);
+    txRunning.store(false);
+    isConnected = false;
+    terminateRx.store(false);
+    terminateTx.store(false);
+    rxDataRate_Bps.store(0);
+    txDataRate_Bps.store(0);
 
     mStreamWrEndPtAddr = 0x03;
     mStreamRdEndPtAddr = 0x83;
@@ -71,21 +73,22 @@ Connection_uLimeSDR::Connection_uLimeSDR(void *arg, const unsigned index, const
 #endif
     if(this->Open(index, vid, pid) != 0)
         std::cerr << GetLastErrorMessage() << std::endl;
+    this->SetReferenceClockRate(52e6);
 }
 
 /**	@brief Closes connection to chip and deallocates used memory.
 */
 Connection_uLimeSDR::~Connection_uLimeSDR()
 {
-    for(auto i : mTxStreams)
-        ControlStream((size_t)i, false);
-    for(auto i : mRxStreams)
-        ControlStream((size_t)i, false);
-    for(auto i : mTxStreams)
-        CloseStream((size_t)i);
-    for(auto i : mRxStreams)
-        CloseStream((size_t)i);
-    UpdateThreads();
+    for(auto i : mTxStreams)
+        ControlStream((size_t)i, false);
+    for(auto i : mRxStreams)
+        ControlStream((size_t)i, false);
+    for(auto i : mTxStreams)
+        CloseStream((size_t)i);
+    for(auto i : mRxStreams)
+        CloseStream((size_t)i);
+    UpdateThreads();
     Close();
 }
 #ifdef __unix__
@@ -348,48 +351,49 @@ int Connection_uLimeSDR::Read(unsigned char *buffer, const int length, int timeo
 static void callback_libusbtransfer(libusb_transfer *trans)
 {
     Connection_uLimeSDR::USBTransferContext *context = reinterpret_cast<Connection_uLimeSDR::USBTransferContext*>(trans->user_data);
+    std::unique_lock<std::mutex> lck(context->transferLock);
     switch(trans->status)
     {
-    case LIBUSB_TRANSFER_CANCELLED:
-        //printf("Transfer %i canceled\n", context->id);
-        context->bytesXfered = trans->actual_length;
-        context->done.store(true);
-        //context->used = false;
-        //context->reset();
-        break;
-    case LIBUSB_TRANSFER_COMPLETED:
-        //if(trans->actual_length == context->bytesExpected)
-    {
-        context->bytesXfered = trans->actual_length;
-        context->done.store(true);
-    }
-    break;
-    case LIBUSB_TRANSFER_ERROR:
-        printf("TRANSFER ERRRO\n");
-        context->bytesXfered = trans->actual_length;
-        context->done.store(true);
-        //context->used = false;
+        case LIBUSB_TRANSFER_CANCELLED:
+            //printf("Transfer %i canceled\n", context->id);
+            context->bytesXfered = trans->actual_length;
+            context->done.store(true);
+            //context->used = false;
+            //context->reset();
+            break;
+        case LIBUSB_TRANSFER_COMPLETED:
+            //if(trans->actual_length == context->bytesExpected)
+            {
+                context->bytesXfered = trans->actual_length;
+                context->done.store(true);
+            }
         break;
-    case LIBUSB_TRANSFER_TIMED_OUT:
-        //printf("transfer timed out %i\n", context->id);
-        context->bytesXfered = trans->actual_length;
-        context->done.store(true);
-        //context->used = false;
+        case LIBUSB_TRANSFER_ERROR:
+            printf("TRANSFER ERRRO\n");
+            context->bytesXfered = trans->actual_length;
+            context->done.store(true);
+            //context->used = false;
+            break;
+        case LIBUSB_TRANSFER_TIMED_OUT:
+            //printf("transfer timed out %i\n", context->id);
+            context->bytesXfered = trans->actual_length;
+            context->done.store(true);
+            //context->used = false;
 
-        break;
-    case LIBUSB_TRANSFER_OVERFLOW:
-        printf("transfer overflow\n");
+            break;
+        case LIBUSB_TRANSFER_OVERFLOW:
+            printf("transfer overflow\n");
 
-        break;
-    case LIBUSB_TRANSFER_STALL:
-        printf("transfer stalled\n");
-        break;
-    case LIBUSB_TRANSFER_NO_DEVICE:
-        printf("transfer no device\n");
+            break;
+        case LIBUSB_TRANSFER_STALL:
+            printf("transfer stalled\n");
+            break;
+        case LIBUSB_TRANSFER_NO_DEVICE:
+            printf("transfer no device\n");
 
-        break;
+            break;
     }
-    context->transferLock.unlock();
+    lck.unlock();
     context->cv.notify_one();
 }
 #endif
@@ -451,8 +455,6 @@ int Connection_uLimeSDR::BeginDataReading(char *buffer, uint32_t length)
         contexts[i].used = false;
         return -1;
     }
-    else
-        contexts[i].transferLock.lock();
 #endif
     return i;
 }
@@ -468,8 +470,8 @@ int Connection_uLimeSDR::WaitForReading(int contextHandle, unsigned int timeout_
     if(contextHandle >= 0 && contexts[contextHandle].used == true)
     {
 #ifndef __unix__
-		contexts[contextHandle].inOvLap.InternalHigh = 0;
-        DWORD dwRet = WaitForSingleObject(contexts[contextHandle].inOvLap.hEvent, timeout_ms);
+		contexts[contextHandle].inOvLap.InternalHigh = 0;
+        DWORD dwRet = WaitForSingleObject(contexts[contextHandle].inOvLap.hEvent, timeout_ms);
 		if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_TIMEOUT)
 			return 1;
 #else
@@ -480,7 +482,7 @@ int Connection_uLimeSDR::WaitForReading(int contextHandle, unsigned int timeout_
         while(contexts[contextHandle].done.load() == false && std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms)
         {
             //blocking not to waste CPU
-            contexts[contextHandle].cv.wait(lck);
+            contexts[contextHandle].cv.wait_for(lck, chrono::milliseconds(timeout_ms));
             t2 = chrono::high_resolution_clock::now();
         }
         return contexts[contextHandle].done.load() == true;
@@ -605,8 +607,6 @@ int Connection_uLimeSDR::BeginDataSending(const char *buffer, uint32_t length)
         contextsToSend[i].used = false;
         return -1;
     }
-    else
-        contextsToSend[i].transferLock.lock();
 #endif
     return i;
 }
@@ -623,7 +623,7 @@ int Connection_uLimeSDR::WaitForSending(int contextHandle, unsigned int timeout_
     {
 #ifndef __unix__
 		contextsToSend[contextHandle].inOvLap.InternalHigh = 0;
-        DWORD dwRet = WaitForSingleObject(contextsToSend[contextHandle].inOvLap.hEvent, timeout_ms);
+        DWORD dwRet = WaitForSingleObject(contextsToSend[contextHandle].inOvLap.hEvent, timeout_ms);
 		if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_TIMEOUT)
 			return 1;
 #else
@@ -633,7 +633,7 @@ int Connection_uLimeSDR::WaitForSending(int contextHandle, unsigned int timeout_
         while(contextsToSend[contextHandle].done.load() == false && std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() < timeout_ms)
         {
             //blocking not to waste CPU
-            contextsToSend[contextHandle].cv.wait(lck);
+            contextsToSend[contextHandle].cv.wait_for(lck, chrono::milliseconds(timeout_ms));
             t2 = chrono::high_resolution_clock::now();
         }
         return contextsToSend[contextHandle].done == true;
diff --git a/src/Connection_uLimeSDR/Connection_uLimeSDREntry.cpp b/src/Connection_uLimeSDR/Connection_uLimeSDREntry.cpp
index b1d4ff6..0d6132a 100644
--- a/src/Connection_uLimeSDR/Connection_uLimeSDREntry.cpp
+++ b/src/Connection_uLimeSDR/Connection_uLimeSDREntry.cpp
@@ -17,7 +17,6 @@ void Connection_uLimeSDREntry::handle_libusb_events()
     {
         int r = libusb_handle_events_timeout_completed(ctx, &tv, NULL);
         if(r != 0) printf("error libusb_handle_events %s\n", libusb_strerror(libusb_error(r)));
-        std::this_thread::sleep_for(std::chrono::milliseconds(1));
     }
 }
 #endif // __UNIX__
@@ -80,67 +79,76 @@ std::vector<ConnectionHandle> Connection_uLimeSDREntry::enumerate(const Connecti
 #else
     libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices
     int usbDeviceCount = libusb_get_device_list(ctx, &devs);
-    if(usbDeviceCount > 0)
+
+    if (usbDeviceCount < 0) {
+        printf("failed to get libusb device list: %s\n", libusb_strerror(libusb_error(usbDeviceCount)));
+        return handles;
+    }
+
+    libusb_device_descriptor desc;
+    for(int i=0; i<usbDeviceCount; ++i)
     {
-        libusb_device_descriptor desc;
-        for(int i=0; i<usbDeviceCount; ++i)
-        {
-            int r = libusb_get_device_descriptor(devs[i], &desc);
-            if(r<0)
-                printf("failed to get device description\n");
-            int pid = desc.idProduct;
-            int vid = desc.idVendor;
+        int r = libusb_get_device_descriptor(devs[i], &desc);
+        if(r<0)
+            printf("failed to get device description\n");
+        int pid = desc.idProduct;
+        int vid = desc.idVendor;
 
-            if( vid == 0x0403)
+        if( vid == 0x0403)
+        {
+            if(pid == 0x601F)
             {
-                if(pid == 0x601F)
+                libusb_device_handle *tempDev_handle;
+                tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
+                if(libusb_kernel_driver_active(tempDev_handle, 0) == 1)   //find out if kernel driver is attached
                 {
-                    libusb_device_handle *tempDev_handle;
-                    tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
-                    if(libusb_kernel_driver_active(tempDev_handle, 0) == 1)   //find out if kernel driver is attached
-                    {
-                        if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it
-                            printf("Kernel Driver Detached!\n");
-                    }
-                    if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device
-                    {
-                        printf("Cannot Claim Interface\n");
-                    }
-
-                    std::string fullName;
-                    //check operating speed
-                    int speed = libusb_get_device_speed(devs[i]);
-                    if(speed == LIBUSB_SPEED_HIGH)
-                        fullName = "USB 2.0";
-                    else if(speed == LIBUSB_SPEED_SUPER)
-                        fullName = "USB 3.0";
-                    else
-                        fullName = "USB";
-                    fullName += " (";
-                    //read device name
-                    char data[255];
-                    memset(data, 0, 255);
-                    int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255);
-                    if(st < 0)
-                        printf("Error getting usb descriptor\n");
-                    if(strlen(data) > 0)
-                        fullName += data;
-                    fullName += ")";
-                    libusb_close(tempDev_handle);
-
-                    ConnectionHandle handle;
+                    if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it
+                        printf("Kernel Driver Detached!\n");
+                }
+                if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device
+                {
+                    printf("Cannot Claim Interface\n");
+                }
+
+                ConnectionHandle handle;
+                //check operating speed
+                int speed = libusb_get_device_speed(devs[i]);
+                if(speed == LIBUSB_SPEED_HIGH)
+                    handle.media = "USB 2.0";
+                else if(speed == LIBUSB_SPEED_SUPER)
+                    handle.media = "USB 3.0";
+                else
                     handle.media = "USB";
-                    handle.name = fullName;
-                    handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
+                //read device name
+                char data[255];
+                memset(data, 0, 255);
+                int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255);
+                if(st < 0)
+                    printf("Error getting usb descriptor\n");
+                if(strlen(data) > 0)
+                    handle.name = std::string(data, size_t(st));
+                handle.addr = std::to_string(int(pid))+":"+std::to_string(int(vid));
+
+                if (desc.iSerialNumber > 0)
+                {
+                    r = libusb_get_string_descriptor_ascii(tempDev_handle,desc.iSerialNumber,(unsigned char*)data, sizeof(data));
+                    if(r<0)
+                        printf("failed to get serial number\n");
+                    else
+                        handle.serial = std::string(data, size_t(r));
+                }
+                libusb_close(tempDev_handle);
+
+                //add handle conditionally, filter by serial number
+                if (hint.serial.empty() or hint.serial == handle.serial)
+                {
                     handles.push_back(handle);
                 }
             }
         }
     }
-    else
-    {
-        libusb_free_device_list(devs, 1);
-    }
+
+    libusb_free_device_list(devs, 1);
 #endif
     return handles;
 }
diff --git a/src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp b/src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp
index 00fe8ae..ffd1460 100644
--- a/src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp
+++ b/src/Connection_uLimeSDR/Connection_uLimeSDRing.cpp
@@ -1,59 +1,59 @@
-/**
-    @file Connection_uLimeSDRing.cpp
-    @author Lime Microsystems
-    @brief Implementation of uLimeSDR board connection (streaming API)
-*/
-
-#include "Connection_uLimeSDR.h"
-#include "fifo.h"
-#include <LMS7002M.h>
-#include <iostream>
-#include <thread>
-#include <chrono>
-#include <algorithm>
-#include <complex>
+/**
+    @file Connection_uLimeSDRing.cpp
+    @author Lime Microsystems
+    @brief Implementation of uLimeSDR board connection (streaming API)
+*/
+
+#include "Connection_uLimeSDR.h"
+#include "fifo.h"
+#include <LMS7002M.h>
+#include <iostream>
+#include <thread>
+#include <chrono>
+#include <algorithm>
+#include <complex>
 #include <ciso646>
-#include <vector>
+#include <vector>
 #include <FPGA_common.h>
-#include "ErrorReporting.h"
-
+#include "ErrorReporting.h"
+
 using namespace lime;
-using namespace std;
+using namespace std;
 
-/** @brief Configures FPGA PLLs to LimeLight interface frequency
-*/
-int Connection_uLimeSDR::UpdateExternalDataRate(const size_t channel, const double txRate_Hz, const double rxRate_Hz)
-{
-    std::cout << "Connection_uLimeSDR::UpdateExternalDataRate(tx=" << txRate_Hz / 1e6 << "MHz, rx=" << rxRate_Hz / 1e6 << "MHz)" << std::endl;
-    const float txInterfaceClk = 2 * txRate_Hz;
+/** @brief Configures FPGA PLLs to LimeLight interface frequency
+*/
+int Connection_uLimeSDR::UpdateExternalDataRate(const size_t channel, const double txRate_Hz, const double rxRate_Hz)
+{
+    std::cout << "Connection_uLimeSDR::UpdateExternalDataRate(tx=" << txRate_Hz / 1e6 << "MHz, rx=" << rxRate_Hz / 1e6 << "MHz)" << std::endl;
+    const float txInterfaceClk = 2 * txRate_Hz;
     const float rxInterfaceClk = 2 * rxRate_Hz;
-    mExpectedSampleRate = rxRate_Hz;
-    if ((txInterfaceClk >= 5e6) && (rxInterfaceClk >= 5e6))
-    {
-        lime::fpga::FPGA_PLL_clock clocks[4];
-        clocks[0].bypass = false;
-        clocks[0].index = 0;
-        clocks[0].outFrequency = txInterfaceClk;
-        clocks[0].phaseShift_deg = 0;
-        clocks[1].bypass = false;
-        clocks[1].index = 1;
-        clocks[1].outFrequency = txInterfaceClk;
-        clocks[1].phaseShift_deg = 90;
-        clocks[2].bypass = false;
-        clocks[2].index = 2;
-        clocks[2].outFrequency = rxInterfaceClk;
-        clocks[2].phaseShift_deg = 0;
-        clocks[3].bypass = false;
-        clocks[3].index = 3;
-        clocks[3].outFrequency = rxInterfaceClk;
-        clocks[3].phaseShift_deg = 90;
-        return lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 4);
-    }
-    else
-    {
-        return ReportError(-1, "uLimeSDR FPGA sampling rate must be >=2.5 MHz");
-    }
-}
+    mExpectedSampleRate = rxRate_Hz;
+    if ((txInterfaceClk >= 5e6) && (rxInterfaceClk >= 5e6))
+    {
+        lime::fpga::FPGA_PLL_clock clocks[4];
+        clocks[0].bypass = false;
+        clocks[0].index = 0;
+        clocks[0].outFrequency = txInterfaceClk;
+        clocks[0].phaseShift_deg = 0;
+        clocks[1].bypass = false;
+        clocks[1].index = 1;
+        clocks[1].outFrequency = txInterfaceClk;
+        clocks[1].phaseShift_deg = 90;
+        clocks[2].bypass = false;
+        clocks[2].index = 2;
+        clocks[2].outFrequency = rxInterfaceClk;
+        clocks[2].phaseShift_deg = 0;
+        clocks[3].bypass = false;
+        clocks[3].index = 3;
+        clocks[3].outFrequency = rxInterfaceClk;
+        clocks[3].phaseShift_deg = 90;
+        return lime::fpga::SetPllFrequency(this, 0, txInterfaceClk, clocks, 4);
+    }
+    else
+    {
+        return ReportError(-1, "uLimeSDR FPGA sampling rate must be >=2.5 MHz");
+    }
+}
 
 /** @brief Function dedicated for receiving data samples from board
     @param rxFIFO FIFO to store received data
@@ -190,6 +190,7 @@ void Connection_uLimeSDR::ReceivePacketsLoop(const Connection_uLimeSDR::ThreadDa
                     printf("L");
                     resetTxFlags.notify_one();
                     resetFlagsDelay = packetsToBatch*buffersCount;
+                    if (args.reportLateTx) args.reportLateTx(pkt[pktIndex].counter);
                 }
             }
             uint8_t* pktStart = (uint8_t*)pkt[pktIndex].data;
@@ -244,9 +245,9 @@ void Connection_uLimeSDR::ReceivePacketsLoop(const Connection_uLimeSDR::ThreadDa
             t1 = t2;
             //total number of bytes sent per second
             double dataRate = 1000.0*totalBytesReceived / timePeriod;
+#ifndef NDEBUG
             //each channel sample rate
             float samplingRate = 1000.0*samplesReceived[0] / timePeriod;
-#ifndef NDEBUG
             printf("Rx: %.3f MB/s, Fs: %.3f MHz, overrun: %i, loss: %i \n", dataRate / 1000000.0, samplingRate / 1000000.0, droppedSamples, packetLoss);
 #endif
             samplesReceived[0] = 0;
@@ -346,7 +347,7 @@ void Connection_uLimeSDR::TransmitPacketsLoop(const Connection_uLimeSDR::ThreadD
         }
         int i=0;
 
-        while(i<packetsToBatch)
+        while(i<packetsToBatch && terminate->load() != true)
         {
             IStreamChannel::Metadata meta;
             FPGA_DataPacket* pkt = reinterpret_cast<FPGA_DataPacket*>(&buffers[bi*bufferSize]);
@@ -388,8 +389,6 @@ void Connection_uLimeSDR::TransmitPacketsLoop(const Connection_uLimeSDR::ThreadD
         {
             //total number of bytes sent per second
             float dataRate = 1000.0*totalBytesSent / timePeriod;
-            //total number of samples from all channels per second
-            float sampleRate = 1000.0*samplesSent / timePeriod;
             if(dataRate_Bps)
                 dataRate_Bps->store(dataRate);
             m_bufferFailures = 0;
@@ -397,6 +396,8 @@ void Connection_uLimeSDR::TransmitPacketsLoop(const Connection_uLimeSDR::ThreadD
             totalBytesSent = 0;
             t1 = t2;
 #ifndef NDEBUG
+            //total number of samples from all channels per second
+            float sampleRate = 1000.0*samplesSent / timePeriod;
             printf("Tx: %.3f MB/s, Fs: %.3f MHz, failures: %i, ts:%li\n", dataRate / 1000000.0, sampleRate / 1000000.0, m_bufferFailures, timestamp);
 #endif
         }
diff --git a/src/FPGA_common/FPGA_common.cpp b/src/FPGA_common/FPGA_common.cpp
index 6cf00ec..9513f7c 100644
--- a/src/FPGA_common/FPGA_common.cpp
+++ b/src/FPGA_common/FPGA_common.cpp
@@ -7,6 +7,7 @@
 #include <map>
 #include <math.h>
 #include <assert.h>
+#include <thread>
 using namespace std;
 
 #ifndef NDEBUG
@@ -27,6 +28,13 @@ const int STREAM_LOAD = 1 << 2;
 const int SMPL_NR_CLR = 1; // rising edge clears
 const int TXPCT_LOSS_CLR = 1 << 1; // 0 - normal operation, 1-clear
 
+const uint16_t PLLCFG_START = 0x1;
+const uint16_t PHCFG_START = 0x2;
+const uint16_t PLLRST_START = 0x4;
+const uint16_t PHCFG_UPDN = 1 << 13;
+
+const uint16_t busyAddr = 0x0021;
+
 int StartStreaming(IConnection* serPort)
 {
     uint16_t interface_ctrl_000A;
@@ -69,6 +77,51 @@ int ResetTimestamp(IConnection* serPort)
     return status;
 }
 
+static int SetPllClock(IConnection* serPort, int clockIndex, int nSteps, eLMS_DEV boardType, uint16_t &reg23val)
+{
+    const auto timeout = chrono::seconds(3);
+    auto t1 = chrono::high_resolution_clock::now();
+    auto t2 = t1;
+    vector<uint32_t> addrs;
+    vector<uint32_t> values;
+    addrs.push_back(0x0023); values.push_back(reg23val & ~PLLCFG_START);
+    addrs.push_back(0x0024); values.push_back(abs(nSteps)); //CNT_PHASE
+    int cnt_ind = (clockIndex + 2) & 0x1F; //C0 index 2, C1 index 3...
+    reg23val &= ~(0xF<<8);
+    reg23val = reg23val | (cnt_ind << 8);
+    if(nSteps >= 0)
+        reg23val |= PHCFG_UPDN;
+    else
+        reg23val &= ~PHCFG_UPDN;
+    addrs.push_back(0x0023); values.push_back(reg23val); //PHCFG_UpDn, CNT_IND
+    addrs.push_back(0x0023); values.push_back(reg23val | PHCFG_START);
+
+    if(serPort->WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
+        ReportError(EIO, "SetPllFrequency: PHCFG, failed to write registers");
+    addrs.clear(); values.clear();
+
+    bool done = false;
+    uint8_t errorCode = 0;
+    t1 = chrono::high_resolution_clock::now();
+    if(boardType == LMS_DEV_LIMESDR_QPCIE) do
+    {
+        uint16_t statusReg;
+        serPort->ReadRegister(busyAddr, statusReg);
+        done = statusReg & 0x1;
+        errorCode = (statusReg >> 7) & 0xFF;
+        t2 = chrono::high_resolution_clock::now();
+        std::this_thread::sleep_for(chrono::milliseconds(10));
+    } while(!done && errorCode == 0 && (t2-t1) < timeout);
+    if(t2 - t1 > timeout)
+        return ReportError(ENODEV, "SetPllFrequency: PHCFG timeout, busy bit is still 1");
+    if(errorCode != 0)
+        return ReportError(EBUSY, "SetPllFrequency: error configuring PHCFG");
+    addrs.push_back(0x0023); values.push_back(reg23val & ~PHCFG_START);
+    if(serPort->WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
+        ReportError(EIO, "SetPllFrequency: configure FPGA PLL, failed to write registers");
+    return 0;
+}
+
 /** @brief Configures board FPGA clocks
 @param serPort communications port
 @param pllIndex index of FPGA pll
@@ -76,18 +129,17 @@ int ResetTimestamp(IConnection* serPort)
 @param clocksCount number of clocks to configure
 @return 0-success, other-failure
 */
-int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFreq, FPGA_PLL_clock* clocks, const uint8_t clockCount)
+int SetPllFrequency(IConnection* serPort, const uint8_t pllIndex, const double inputFreq, FPGA_PLL_clock* clocks, const uint8_t clockCount)
 {
     auto t1 = chrono::high_resolution_clock::now();
     auto t2 = chrono::high_resolution_clock::now();
     const auto timeout = chrono::seconds(3);
-    const uint16_t busyAddr = 0x0021;
 
     if(not serPort)
         return ReportError(ENODEV, "ConfigureFPGA_PLL: connection port is NULL");
     if(not serPort->IsOpen())
         return ReportError(ENODEV, "ConfigureFPGA_PLL: configure FPGA PLL, device not connected");
-    eLMS_DEV boardType = serPort->GetDeviceInfo().deviceName == GetDeviceName(LMS_DEV_QSPARK) ? LMS_DEV_QSPARK : LMS_DEV_UNKNOWN;
+    eLMS_DEV boardType = serPort->GetDeviceInfo().deviceName == GetDeviceName(LMS_DEV_LIMESDR_QPCIE) ? LMS_DEV_LIMESDR_QPCIE : LMS_DEV_UNKNOWN;
 
     if(pllIndex > 15)
         ReportError(ERANGE, "SetPllFrequency: PLL index(%i) out of range [0-15]", pllIndex);
@@ -109,10 +161,6 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
     if(serPort->ReadRegister(0x0003, reg23val) != 0)
         return ReportError(ENODEV, "SetPllFrequency: failed to read register");
 
-    const uint16_t PLLCFG_START = 0x1;
-    const uint16_t PHCFG_START = 0x2;
-    const uint16_t PLLRST_START = 0x4;
-    const uint16_t PHCFG_UPDN = 1 << 13;
     reg23val &= ~(0x1F << 3); //clear PLL index
     reg23val &= ~PLLCFG_START; //clear PLLCFG_START
     reg23val &= ~PHCFG_START; //clear PHCFG
@@ -131,11 +179,12 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
     addrs.clear(); values.clear();
 
     t1 = chrono::high_resolution_clock::now();
-    if(boardType == LMS_DEV_QSPARK) do //wait for reset to activate
+    if(boardType == LMS_DEV_LIMESDR_QPCIE) do //wait for reset to activate
     {
         serPort->ReadRegister(busyAddr, statusReg);
         done = statusReg & 0x1;
         errorCode = (statusReg >> 7) & 0xFF;
+        std::this_thread::sleep_for(chrono::milliseconds(10));
         t2 = chrono::high_resolution_clock::now();
     } while(not done && errorCode == 0 && (t2-t1) < timeout);
     if(t2 - t1 > timeout)
@@ -146,7 +195,7 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
     addrs.push_back(0x0023); values.push_back(reg23val & ~PLLRST_START);
 
     //configure FPGA PLLs
-    const double vcoLimits_Hz[2] = { 600e6, 1300e6 };
+    const double vcoLimits_Hz[2] = { 600e6, 1050e6 };
 
     map< unsigned long, int> availableVCOs; //all available frequencies for VCO
     for(int i=0; i<clockCount; ++i)
@@ -178,7 +227,7 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
             bestScore = it.second;
         }
     }
-    int N, M;
+    int N(0), M(0);
     double bestDeviation = 1e9;
     double Fvco;
     for(auto it : availableVCOs)
@@ -200,7 +249,7 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
                 }
             }
             double deviation = fabs(it.first - inputFreq*Mtemp / Ntemp);
-            if(deviation < bestDeviation)
+            if(deviation <= bestDeviation)
             {
                 bestDeviation = deviation;
                 Fvco = it.first;
@@ -263,60 +312,93 @@ int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFr
     addrs.clear(); values.clear();
 
     t1 = chrono::high_resolution_clock::now();
-    if(boardType == LMS_DEV_QSPARK) do //wait for config to activate
+    if(boardType == LMS_DEV_LIMESDR_QPCIE) do //wait for config to activate
     {
         serPort->ReadRegister(busyAddr, statusReg);
         done = statusReg & 0x1;
         errorCode = (statusReg >> 7) & 0xFF;
         t2 = chrono::high_resolution_clock::now();
+        std::this_thread::sleep_for(chrono::milliseconds(10));
     } while(not done && errorCode == 0 && (t2-t1) < timeout);
     if(t2 - t1 > timeout)
         return ReportError(ENODEV, "SetPllFrequency: PLLCFG timeout, busy bit is still 1");
     if(errorCode != 0)
         return ReportError(EBUSY, "SetPllFrequency: error configuring PLLCFG");
 
-    addrs.push_back(0x0023); values.push_back(reg23val & ~PLLCFG_START);
     for(int i=0; i<clockCount; ++i)
     {
         int C = int(Fvco / clocks[i].outFrequency + 0.5);
         float fOut_MHz = inputFreq/1e6;
         float Fstep_us = 1 / (8 * fOut_MHz*C);
         float Fstep_deg = (360 * Fstep_us) / (1 / fOut_MHz);
-        short nSteps = clocks[i].phaseShift_deg / Fstep_deg;
-        addrs.push_back(0x0024); values.push_back(nSteps); //CNT_PHASE
-        int cnt_ind = (clocks[i].index + 2) & 0x1F; //C0 index 2, C1 index 3...
-	reg23val &= ~(0xF<<8);
-        reg23val = reg23val | (cnt_ind << 8);
-        if(clocks[i].phaseShift_deg >= 0)
-            reg23val |= PHCFG_UPDN;
+        if (clocks[i].findPhase == false)
+        {
+           const int nSteps = 0.49 + clocks[i].phaseShift_deg  / Fstep_deg;
+           SetPllClock(serPort,clocks[i].index,nSteps, boardType, reg23val);
+#ifdef LMS_VERBOSE_OUTPUT
+           printf("Configured phase: %1.1f (steps %d)\n",nSteps*Fstep_deg,nSteps);
+#endif
+        }
         else
-            reg23val &= ~PHCFG_UPDN;
-        addrs.push_back(0x0023); values.push_back(reg23val); //PHCFG_UpDn, CNT_IND
-        addrs.push_back(0x0023); values.push_back(reg23val | PHCFG_START);
+        {
+            double min = -1;
+            const double maxPhase = 360;
+            double max = maxPhase;
+            const int testSize = 16*1024;
+            int nSteps = 6.0/Fstep_deg;
+            if (nSteps == 0) nSteps = 1;
+            unsigned char* buf = new unsigned char[testSize];
+            for (double phase = 0; phase <= maxPhase; phase += nSteps*Fstep_deg)
+            {
+
+                SetPllClock(serPort,clocks[i].index,nSteps, boardType, reg23val);
+                bool result = true;
+
+                if (serPort->ReadRawStreamData((char*)buf,testSize,20)==testSize)
+                {
+                    for (size_t j = 16; j < testSize;j+=3)
+                    {
+                        if (j%4096 == 0)
+                            j += 16;
+                        if ((buf[j]!=0xAA) || (buf[j+1]!=0x5A) || (buf[j+2]!=0x55))
+                        {
+                            result = false;
+                            break;
+                        }
+                    }
+                }
+                else result = false;
+
+                if (result == true && min < 0)
+                {
+                    min = phase;
+                }
+                else if (result == false && min >= 0)
+                {
+                    max = phase;
+                    break;
+                }
+            }
+
+            delete [] buf;
+
+            if (min > -1.0)
+            {
+                clocks[i].findPhase = false;
+                clocks[i].phaseShift_deg = (min+max)/2;
 #ifdef LMS_VERBOSE_OUTPUT
-        printf("C%i=%i, Fout=%3.3f MHz, CNT_IND=%i, nSteps=%i, phaseShift=%.1f\n", i, C, clocks[i].rd_actualFrequency / 1e6, cnt_ind, nSteps, nSteps*Fstep_deg);
+                printf("phase: min %1.1f; max %1.1f)\n",min,max);
 #endif
-        if(serPort->WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
-            ReportError(EIO, "SetPllFrequency: PHCFG, failed to write registers");
-        addrs.clear();
-        values.clear();
+                return SetPllFrequency(serPort, pllIndex, inputFreq, clocks,clockCount);
+            }
+            else
+            {
+                clocks[i].findPhase = false;
+                return SetPllFrequency(serPort, pllIndex, inputFreq, clocks,clockCount);
+            }
+        }
 
-        t1 = chrono::high_resolution_clock::now();
-        if(boardType == LMS_DEV_QSPARK) do
-        {
-            serPort->ReadRegister(busyAddr, statusReg);
-            done = statusReg & 0x1;
-            errorCode = (statusReg >> 7) & 0xFF;
-            t2 = chrono::high_resolution_clock::now();
-        } while(!done && errorCode == 0 && (t2-t1) < timeout);
-        if(t2 - t1 > timeout)
-            return ReportError(ENODEV, "SetPllFrequency: PHCFG timeout, busy bit is still 1");
-        if(errorCode != 0)
-            return ReportError(EBUSY, "SetPllFrequency: error configuring PHCFG");
-        addrs.push_back(0x0023); values.push_back(reg23val & ~PHCFG_START);
     }
-    if(serPort->WriteRegisters(addrs.data(), values.data(), values.size()) != 0)
-        ReportError(EIO, "SetPllFrequency: configure FPGA PLL, failed to write registers");
     return 0;
 }
 
diff --git a/src/FPGA_common/FPGA_common.h b/src/FPGA_common/FPGA_common.h
index 10e9791..7eb9a77 100644
--- a/src/FPGA_common/FPGA_common.h
+++ b/src/FPGA_common/FPGA_common.h
@@ -21,14 +21,19 @@ int ResetTimestamp(IConnection* serPort);
 
 struct FPGA_PLL_clock
 {
+    FPGA_PLL_clock()
+    {
+       findPhase = false;
+    }
     double outFrequency;
     double phaseShift_deg;
     uint8_t index;
     bool bypass;
+    bool findPhase;
     double rd_actualFrequency;
 };
 
-int SetPllFrequency(IConnection* serPort, uint8_t pllIndex, const double inputFreq, FPGA_PLL_clock* outputs, const uint8_t clockCount);
+int SetPllFrequency(IConnection* serPort, const uint8_t pllIndex, const double inputFreq, FPGA_PLL_clock* outputs, const uint8_t clockCount);
 int SetDirectClocking(IConnection* serPort, uint8_t clockIndex, const double inputFreq, const double phaseShift_deg);
 
 int FPGAPacketPayload2Samples(const uint8_t* buffer, const size_t bufLen, const size_t chCount, const int format, complex16_t** samples, size_t* samplesCount);
diff --git a/src/GFIR/gfir_lms.c b/src/GFIR/gfir_lms.c
index d47352f..084f00f 100644
--- a/src/GFIR/gfir_lms.c
+++ b/src/GFIR/gfir_lms.c
@@ -155,4 +155,4 @@ void GenerateFilter(int n, double w1, double w2, double a1, double a2, double *c
         for (i = 0; i < n; i++)
             coefs[i] = hi.a[i];
        
- }
\ No newline at end of file
+ }
diff --git a/src/LMS_Programing/LMS_Programing_wxgui.cpp b/src/LMS_Programing/LMS_Programing_wxgui.cpp
index 74eb846..745e03b 100644
--- a/src/LMS_Programing/LMS_Programing_wxgui.cpp
+++ b/src/LMS_Programing/LMS_Programing_wxgui.cpp
@@ -71,18 +71,10 @@ LMS_Programing_wxgui::LMS_Programing_wxgui(wxWindow* parent, wxWindowID id, cons
     cmbDevice = new wxChoice(this, ID_CHOICE2, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE2"));
     cmbDevice->Append(_T("HPM1000/HMP7"));
     cmbDevice->Append(_T("FX3"));
-    cmbDevice->SetSelection(cmbDevice->Append(_T("Altera FPGA")));
+    cmbDevice->Append(_T("Altera FPGA"));
+    cmbDevice->SetSelection(cmbDevice->Append(_T("Automatic")));
     FlexGridSizer7->Add(cmbDevice, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
     cmbProgMode = new wxChoice(this, ID_CHOICE1, wxDefaultPosition, wxSize(176, -1), 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1"));
-    cmbProgMode->SetSelection(cmbProgMode->Append(_T("Flash")));
-    cmbProgMode->Append(_T("1"));
-    cmbProgMode->Append(_T("2"));
-    cmbProgMode->Append(_T("3"));
-    cmbProgMode->Append(_T("4"));
-    cmbProgMode->Append(_T("5"));
-    cmbProgMode->Append(_T("6"));
-    cmbProgMode->Append(_T("7"));
-    cmbProgMode->Append(_T("8"));
     FlexGridSizer7->Add(cmbProgMode, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
     FlexGridSizer3->Add(FlexGridSizer7, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 5);
     FlexGridSizer1->Add(FlexGridSizer3, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
@@ -131,7 +123,9 @@ void LMS_Programing_wxgui::OnbtnOpenClick(wxCommandEvent& event)
 void LMS_Programing_wxgui::OnbtnStartProgrammingClick(wxCommandEvent& event)
 {
     //if needed load program data from file
-    if( (cmbDevice->GetSelection() == 2 && cmbProgMode->GetSelection() == 2) == false)
+    if((
+        (cmbDevice->GetSelection() == 3) ||
+        (cmbDevice->GetSelection() == 2 && cmbProgMode->GetSelection() == 2)) == false)
     {
         if (lblFilename->GetLabel().length() <= 1)
         {
@@ -171,34 +165,44 @@ void LMS_Programing_wxgui::OnbtnStartProgrammingClick(wxCommandEvent& event)
 void LMS_Programing_wxgui::OncmbDeviceSelect(wxCommandEvent& event)
 {
     int deviceSelection = cmbDevice->GetSelection();
+    int progMode = cmbProgMode->GetSelection();
     cmbProgMode->Clear();
-    if(deviceSelection == 2)
+    if(deviceSelection == 3)
+    {
+        cmbProgMode->SetSelection(cmbProgMode->Append("Automatic update"));
+    }
+    else if(deviceSelection == 2)
     {
         cmbProgMode->Append("Bitstream to FPGA");
         cmbProgMode->Append("Bitstream to Flash");
         cmbProgMode->Append("Bitstream from Flash");
-        cmbProgMode->SetSelection(0);
+        cmbProgMode->SetSelection(progMode < 3 ? progMode : 2);
     }
     else if(deviceSelection == 1)
     {
-		cmbProgMode->Append(_("Firmware to RAM"));
+        cmbProgMode->Append(_("Firmware to RAM"));
         cmbProgMode->Append(_("Firmware to Flash"));
-        cmbProgMode->SetSelection(0);
+        cmbProgMode->SetSelection(progMode < 2 ? progMode : 1);
     }
     else if(deviceSelection == 0)
     {
         cmbProgMode->Append(_("Flash"));
         for(int i=1; i<=8; ++i)
             cmbProgMode->Append(wxString::Format("%i", i));
-        cmbProgMode->SetSelection(0);
+        cmbProgMode->SetSelection(progMode);
     }
+
+    btnOpenEnb = (deviceSelection != 3);
+    btnOpen->Enable(btnOpenEnb);
+    StaticText1->Enable(btnOpenEnb);
+    lblFilename->Enable(btnOpenEnb);
 }
 
 void LMS_Programing_wxgui::OnProgramingFinished(wxCommandEvent& event)
 {
     mWorkerThread.join();
     wxMessageBox(event.GetString(), _("INFO"), wxICON_INFORMATION | wxOK);
-    btnOpen->Enable();
+    btnOpen->Enable(btnOpenEnb);
     Disconnect(btnStartStop->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&LMS_Programing_wxgui::OnAbortProgramming);
     Connect(btnStartStop->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&LMS_Programing_wxgui::OnbtnStartProgrammingClick);
     btnStartStop->SetLabel(_("Program"));
@@ -248,6 +252,10 @@ void LMS_Programing_wxgui::DoProgramming()
     {
        status = LMS_ProgramHPM7(lmsControl, mProgramData.data(), mProgramData.size(), progMode,OnProgrammingCallback);
     }
+    else if (device == 3)
+    {
+        status = LMS_ProgramUpdate(lmsControl, true/*download*/, OnProgrammingCallback);
+    }
     wxCommandEvent evt;
     evt.SetEventObject(this);
     evt.SetId(ID_PROGRAMING_FINISHED_EVENT);
diff --git a/src/LMS_Programing/LMS_Programing_wxgui.h b/src/LMS_Programing/LMS_Programing_wxgui.h
index 114f68c..9aef067 100644
--- a/src/LMS_Programing/LMS_Programing_wxgui.h
+++ b/src/LMS_Programing/LMS_Programing_wxgui.h
@@ -36,6 +36,7 @@ protected:
     wxChoice* cmbProgMode;
     wxButton* btnStartStop;
     wxButton* btnOpen;
+    bool btnOpenEnb;
 
     void DoProgramming();
     static bool OnProgrammingCallback(int bsent, int btotal, const char* progressMsg);
diff --git a/src/LimeUtil.cpp b/src/LimeUtil.cpp
index 4fb519e..d3589af 100644
--- a/src/LimeUtil.cpp
+++ b/src/LimeUtil.cpp
@@ -5,6 +5,7 @@
 */
 
 #include <VersionInfo.h>
+#include <SystemResources.h>
 #include <ConnectionRegistry.h>
 #include <IConnection.h>
 #include <iostream>
@@ -33,6 +34,7 @@ static int printHelp(void)
     std::cout << std::endl;
     std::cout << "  Advanced options:" << std::endl;
     std::cout << "    --args[=\"module=foo,serial=bar\"] \t Arguments for the options below" << std::endl;
+    std::cout << "    --update          \t\t\t Automatic firmware sync + flash" << std::endl;
     std::cout << "    --fpga=\"filename\" \t\t\t Program FPGA gateware to flash" << std::endl;
     std::cout << "    --fw=\"filename\"   \t\t\t Program FX3  firmware to flash" << std::endl;
     std::cout << "    --timing          \t\t\t Time interfaces and operations" << std::endl;
@@ -45,13 +47,29 @@ static int printHelp(void)
  **********************************************************************/
 static int printInfo(void)
 {
-    std::cout << "Library version: v" << lime::GetLibraryVersion() << std::endl;
-    std::cout << "Build timestamp: " << lime::GetBuildTimestamp() << std::endl;
-    std::cout << "Interface version: v" << lime::GetAPIVersion() << std::endl;
-    std::cout << "Binary interface: " << lime::GetABIVersion() << std::endl;
-    std::cout << "Connections: ";
-    for (const auto &name : ConnectionRegistry::moduleNames()) std::cout << name << ", ";
+    std::cout << "######################################################" << std::endl;
+    std::cout << "## LimeSuite information summary" << std::endl;
+    std::cout << "######################################################" << std::endl;
     std::cout << std::endl;
+
+    std::cout << "Version information:" << std::endl;
+    std::cout << "  Library version:\tv" << lime::GetLibraryVersion() << std::endl;
+    std::cout << "  Build timestamp:\t" << lime::GetBuildTimestamp() << std::endl;
+    std::cout << "  Interface version:\tv" << lime::GetAPIVersion() << std::endl;
+    std::cout << "  Binary interface:\t" << lime::GetABIVersion() << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "System resources:" << std::endl;
+    std::cout << "  Installation root:\t" << lime::getLimeSuiteRoot() << std::endl;
+    std::cout << "  User home directory:\t" << lime::getHomeDirectory() << std::endl;
+    std::cout << "  App data directory:\t" << lime::getAppDataDirectory() << std::endl;
+    std::cout << "  Config directory:\t" << lime::getConfigDirectory() << std::endl;
+    std::cout << "  Image search paths:" << std::endl;
+    for (const auto &name : lime::listImageSearchPaths()) std::cout << "     - " << name << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "Supported connections:" << std::endl;
+    for (const auto &name : ConnectionRegistry::moduleNames()) std::cout << "   * " << name << std::endl;
     std::cout << std::endl;
     return EXIT_SUCCESS;
 }
@@ -94,6 +112,7 @@ static int makeDevice(void)
     if (not conn->IsOpen())
     {
         std::cout << "Connection not open!" << std::endl;
+        ConnectionRegistry::freeConnection(conn);
         return EXIT_FAILURE;
     }
 
@@ -116,6 +135,42 @@ static int makeDevice(void)
 }
 
 /***********************************************************************
+ * Program update (sync images and flash support)
+ **********************************************************************/
+static int programUpdate(const std::string &argStr)
+{
+    auto handles = ConnectionRegistry::findConnections(argStr);
+    if(handles.size() == 0)
+    {
+        std::cout << "No devices found" << std::endl;
+        return EXIT_FAILURE;
+    }
+    std::cout << "Connected to [" << handles[0].ToString() << "]" << std::endl;
+    auto conn = ConnectionRegistry::makeConnection(handles[0]);
+
+    auto progCallback = [](int bsent, int btotal, const char* progressMsg)
+    {
+        printf("[%3i%%] %5i/%5i Bytes %s\r", int(100.0*bsent/btotal+0.5), bsent, btotal, progressMsg);
+        return 0;
+    };
+
+    auto status = conn->ProgramUpdate(true/*yes download*/, progCallback);
+
+    std::cout << std::endl;
+    if(status == 0)
+    {
+        std::cout << "Programming update complete!" << std::endl;
+    }
+    else
+    {
+        std::cout << "Programming update failed! : " << GetLastErrorMessage() << std::endl;
+    }
+
+    ConnectionRegistry::freeConnection(conn);
+    return (status==0)?EXIT_SUCCESS:EXIT_FAILURE;
+}
+
+/***********************************************************************
  * Program gateware
  **********************************************************************/
 static int programGateware(const std::string &argStr)
@@ -142,7 +197,7 @@ static int programGateware(const std::string &argStr)
         std::cout << "No devices found" << std::endl;
         return EXIT_FAILURE;
     }
-    std::cout << "Connected to [" << handles[0].serialize() << "]" << std::endl;
+    std::cout << "Connected to [" << handles[0].ToString() << "]" << std::endl;
     auto conn = ConnectionRegistry::makeConnection(handles[0]);
 
     auto progCallback = [](int bsent, int btotal, const char* progressMsg)
@@ -168,7 +223,7 @@ static int programGateware(const std::string &argStr)
     else
         std::cout << "Programming failed! : " << GetLastErrorMessage() << std::endl;
     ConnectionRegistry::freeConnection(conn);
-    return EXIT_SUCCESS;
+    return (status==0)?EXIT_SUCCESS:EXIT_FAILURE;
 }
 
 /***********************************************************************
@@ -198,7 +253,7 @@ static int programFirmware(const std::string &argStr)
         std::cout << "No devices found" << std::endl;
         return EXIT_FAILURE;
     }
-    std::cout << "Connected to [" << handles[0].serialize() << "]" << std::endl;
+    std::cout << "Connected to [" << handles[0].ToString() << "]" << std::endl;
     auto conn = ConnectionRegistry::makeConnection(handles[0]);
 
     auto progCallback = [](int bsent, int btotal, const char* progressMsg)
@@ -224,7 +279,7 @@ static int programFirmware(const std::string &argStr)
     else
         std::cout << "Programming failed! : " << GetLastErrorMessage() << std::endl;
     ConnectionRegistry::freeConnection(conn);
-    return EXIT_SUCCESS;
+    return (status==0)?EXIT_SUCCESS:EXIT_FAILURE;
 }
 
 /***********************************************************************
@@ -238,6 +293,7 @@ int main(int argc, char *argv[])
         {"find", optional_argument, 0, 'f'},
         {"make", optional_argument, 0, 'm'},
         {"args", optional_argument, 0, 'a'},
+        {"update",     no_argument, 0, 'u'},
         {"fpga", required_argument, 0, 'g'},
         {"fw",   required_argument, 0, 'w'},
         {"timing",     no_argument, 0, 't'},
@@ -259,6 +315,7 @@ int main(int argc, char *argv[])
         case 'a':
             if (optarg != NULL) argStr = optarg;
             break;
+        case 'u': return programUpdate(argStr);
         case 'g': return programGateware(argStr);
         case 'w': return programFirmware(argStr);
         case 't': return deviceTestTiming(argStr);
diff --git a/src/SystemResources.h b/src/SystemResources.h
new file mode 100644
index 0000000..a460f3d
--- /dev/null
+++ b/src/SystemResources.h
@@ -0,0 +1,68 @@
+/**
+ at file SystemResources.h
+ at author Lime Microsystems
+ at brief APIs for locating system resources.
+*/
+
+#ifndef LIMESUITE_SYSTEM_RESOURCES_H
+#define LIMESUITE_SYSTEM_RESOURCES_H
+
+#include <LimeSuiteConfig.h>
+#include <string>
+#include <vector>
+
+namespace lime
+{
+
+/*!
+ * Get the root installation directory for the library.
+ * Use the configured installation prefix for the library,
+ * or override with the LIME_SUITE_ROOT environment variable.
+ */
+LIME_API std::string getLimeSuiteRoot(void);
+
+/*!
+ * Get the full path to the user's home directory
+ */
+LIME_API std::string getHomeDirectory(void);
+
+/*!
+ * Get the full path to the application data directory.
+ * On a unix system this is typically $HOME/.local/share.
+ * On a windows system this is typically %USERPROFILE%\AppData\Roaming.
+ * Also supports the APPDATA environment variable to override the default value.
+ */
+LIME_API std::string getAppDataDirectory(void);
+
+/*!
+ * Get the full path to the library's configuration data directory.
+ */
+LIME_API std::string getConfigDirectory(void);
+
+/*!
+ * Get a list of directories to search for image resources.
+ * Directories are returned in the order of search priority.
+ * Priority goes to the LIME_SUITE_IMAGE_PATH environment variable,
+ * and then images in the user's application data directory,
+ * and finally images in the installation root directory.
+ */
+LIME_API std::vector<std::string> listImageSearchPaths(void);
+
+/*!
+ * Get the full file path to an image resource given only the file name.
+ * @param name a unique name for the resource file including file extension
+ * @return the full filesystem path to the resource if it exists or empty
+ */
+LIME_API std::string locateImageResource(const std::string &name);
+
+/*!
+ * Download an image resource given only the file name.
+ * The resource will be downloaded in the user's application data directory.
+ * @param name a unique name for the resource file including file extension
+ * @return 0 for success or error code upon error
+ */
+LIME_API int downloadImageResource(const std::string &name);
+
+}
+
+#endif //LIMESUITE_SYSTEM_RESOURCES_H
diff --git a/src/SystemResources.in.cpp b/src/SystemResources.in.cpp
new file mode 100644
index 0000000..edeb285
--- /dev/null
+++ b/src/SystemResources.in.cpp
@@ -0,0 +1,205 @@
+/**
+ at file SystemResources.h
+ at author Lime Microsystems
+ at brief APIs for locating system resources.
+*/
+
+#include "SystemResources.h"
+#include "ErrorReporting.h"
+
+#include <cstdlib> //getenv, system
+#include <vector>
+#include <sstream>
+#include <iostream>
+
+#ifdef _MSC_VER
+#include <windows.h>
+#include <shlobj.h>
+#include <io.h>
+
+//access mode constants
+#define F_OK 0
+#define R_OK 2
+#define W_OK 4
+#endif
+
+#ifdef __unix__
+#include <pwd.h>
+#include <unistd.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h> //stat
+
+std::string lime::getLimeSuiteRoot(void)
+{
+    //first check the environment variable
+    const char *limeSuiteRoot = std::getenv("LIME_SUITE_ROOT");
+    if (limeSuiteRoot != nullptr) return limeSuiteRoot;
+
+    // Get the path to the current dynamic linked library.
+    // The path to this library can be used to determine
+    // the installation root without prior knowledge.
+    #if defined(_MSC_VER) && defined(LIME_DLL)
+    char path[MAX_PATH];
+    HMODULE hm = NULL;
+    if (GetModuleHandleExA(
+        GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
+        GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
+        (LPCSTR) &lime::getLimeSuiteRoot, &hm))
+    {
+        const DWORD size = GetModuleFileNameA(hm, path, sizeof(path));
+        if (size != 0)
+        {
+            const std::string libPath(path, size);
+            const size_t slash0Pos = libPath.find_last_of("/\\");
+            const size_t slash1Pos = libPath.substr(0, slash0Pos).find_last_of("/\\");
+            if (slash0Pos != std::string::npos && slash1Pos != std::string::npos)
+                return libPath.substr(0, slash1Pos);
+        }
+    }
+    #endif //_MSC_VER && LIME_DLL
+
+    return "@LIME_SUITE_ROOT@";
+}
+
+std::string lime::getHomeDirectory(void)
+{
+    //first check the HOME environment variable
+    const char *userHome = std::getenv("HOME");
+    if (userHome != nullptr) return userHome;
+
+    //use unix user id lookup to get the home directory
+    #ifdef __unix__
+    const char *pwDir = getpwuid(getuid())->pw_dir;
+    if (pwDir != nullptr) return pwDir;
+    #endif
+
+    return "";
+}
+
+/*!
+ * The generic location for data storage with user permission level.
+ */
+static std::string getBareAppDataDirectory(void)
+{
+    //always check APPDATA (usually windows, but can be set for linux)
+    const char *appDataDir = std::getenv("APPDATA");
+    if (appDataDir != nullptr) return appDataDir;
+
+    //use windows API to query for roaming app data directory
+    #ifdef _MSC_VER
+    char csidlAppDataDir[MAX_PATH];
+    if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, csidlAppDataDir)))
+    {
+        return csidlAppDataDir;
+    }
+    #endif
+
+    //xdg freedesktop standard location environment variable
+    #ifdef __unix__
+    const char *xdgDataHome = std::getenv("XDG_DATA_HOME");
+    if (xdgDataHome != nullptr) return xdgDataHome;
+    #endif
+
+    //xdg freedesktop standard location for data in home directory
+    return lime::getHomeDirectory() + "/.local/share";
+}
+
+std::string lime::getAppDataDirectory(void)
+{
+    return getBareAppDataDirectory() + "/LimeSuite";
+}
+
+std::string lime::getConfigDirectory(void)
+{
+    //xdg standard is XDG_CONFIG_HOME or $HOME/.config
+    //but historically we have used $HOME/.limesuite
+    return lime::getHomeDirectory() + "/.limesuite";
+}
+
+std::vector<std::string> lime::listImageSearchPaths(void)
+{
+    std::vector<std::string> imageSearchPaths;
+
+    //separator for search paths in the environment variable
+    #ifdef _MSC_VER
+    static const char sep = ';';
+    #else
+    static const char sep = ':';
+    #endif
+
+    //check the environment's search path
+    const char *imagePathEnv = std::getenv("LIME_IMAGE_PATH");
+    if (imagePathEnv != nullptr)
+    {
+        std::stringstream imagePaths(imagePathEnv);
+        std::string imagePath;
+        while (std::getline(imagePaths, imagePath, sep))
+        {
+            if (imagePath.empty()) continue;
+            imageSearchPaths.push_back(imagePath);
+        }
+    }
+
+    //search directories in the user's home directory
+    imageSearchPaths.push_back(lime::getAppDataDirectory() + "/images");
+
+    //search global installation directories
+    imageSearchPaths.push_back(lime::getLimeSuiteRoot() + "/share/LimeSuite/images");
+
+    return imageSearchPaths;
+}
+
+std::string lime::locateImageResource(const std::string &name)
+{
+    for (const auto &searchPath : lime::listImageSearchPaths())
+    {
+        const std::string fullPath(searchPath + "/@VERSION_MAJOR at .@VERSION_MINOR@/" + name);
+        if (access(fullPath.c_str(), R_OK) == 0) return fullPath;
+    }
+    return "";
+}
+
+int lime::downloadImageResource(const std::string &name)
+{
+    const std::string destDir(lime::getAppDataDirectory() + "/images/@VERSION_MAJOR at .@VERSION_MINOR@");
+    const std::string destFile(destDir + "/" + name);
+    const std::string sourceUrl("http://downloads.myriadrf.org/project/limesuite/@VERSION_MAJOR@.@VERSION_MINOR@/" + name);
+
+    //check if the directory already exists
+    struct stat s;
+    if (stat(destDir.c_str(), &s) == 0)
+    {
+        if ((s.st_mode & S_IFDIR) == 0)
+        {
+            return lime::ReportError("Not a directory: %s", destDir.c_str());
+        }
+    }
+
+    //create images directory
+    else
+    {
+        #ifdef __unix__
+        const std::string mkdirCmd("mkdir -p \""+destDir+"\"");
+        #else
+        const std::string mkdirCmd("md.exe \""+destDir+"\"");
+        #endif
+        int result = std::system(mkdirCmd.c_str());
+        if (result != 0) return lime::ReportError(result, "Failed: %s", mkdirCmd.c_str());
+    }
+
+    //check for write access
+    if (access(destDir.c_str(), W_OK) != 0) lime::ReportError("Cannot write: %s", destDir.c_str());
+
+    //download the file
+    #ifdef __unix__
+    const std::string dnloadCmd("wget --output-document=\""+destFile+"\" \""+sourceUrl+"\"");
+    #else
+    const std::string dnloadCmd("powershell.exe -Command \"(new-object System.Net.WebClient).DownloadFile('"+sourceUrl+"', '"+destFile+"')\"");
+    #endif
+    int result = std::system(dnloadCmd.c_str());
+    if (result != 0) return lime::ReportError(result, "Failed: %s", dnloadCmd.c_str());
+
+    return 0;
+}
diff --git a/src/VersionInfo.h b/src/VersionInfo.h
index b65effc..d778d3e 100644
--- a/src/VersionInfo.h
+++ b/src/VersionInfo.h
@@ -24,7 +24,7 @@
  * #endif
  * \endcode
  */
-#define LIME_SUITE_API_VERSION 0x20161200
+#define LIME_SUITE_API_VERSION 0x20170200
 
 namespace lime
 {
diff --git a/src/boards_wxgui/pnlLimeSDR.cpp b/src/boards_wxgui/pnlLimeSDR.cpp
index c1c3fbb..42e5a1a 100644
--- a/src/boards_wxgui/pnlLimeSDR.cpp
+++ b/src/boards_wxgui/pnlLimeSDR.cpp
@@ -35,7 +35,7 @@ pnlLimeSDR::pnlLimeSDR(wxWindow* parent,wxWindowID id, const wxPoint& pos,const
     chkRFLB_A_EN->SetToolTip(_("[RFLB_A_EN] External RF loopback TxBAND2->RxLNAH channel A"));
     Connect(chkRFLB_A_EN->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
     controlsSizer->Add(chkRFLB_A_EN, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
-    chkRFLB_B_EN = new wxCheckBox(this, wxNewId(), _("RF loopback ch.A"));
+    chkRFLB_B_EN = new wxCheckBox(this, wxNewId(), _("RF loopback ch.B"));
     chkRFLB_B_EN->SetToolTip(_("[RFLB_B_EN] External RF loopback TxBAND2->RxLNAH channel B"));
     Connect(chkRFLB_B_EN->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
     controlsSizer->Add(chkRFLB_B_EN, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
@@ -80,8 +80,6 @@ void pnlLimeSDR::Initialize(lms_device_t* pControl)
         auto info = LMS_GetDeviceInfo(lmsControl);
         if(info != nullptr)
         {
-            int hw = std::stoi(info->hardwareVersion);
-
             lblWarning->SetLabel(_(""));
             lblWarning->Hide();
             auto controls = controlsSizer->GetChildren();
@@ -89,7 +87,7 @@ void pnlLimeSDR::Initialize(lms_device_t* pControl)
                 i->GetWindow()->Enable();
         }
     }
-    
+
     mainSizer->Fit(this);
     mainSizer->SetSizeHints(this);
     Layout();
diff --git a/src/boards_wxgui/pnlUltimateEVB.cpp b/src/boards_wxgui/pnlUltimateEVB.cpp
new file mode 100644
index 0000000..659f484
--- /dev/null
+++ b/src/boards_wxgui/pnlUltimateEVB.cpp
@@ -0,0 +1,154 @@
+#include "pnlUltimateEVB.h"
+
+#include <wx/sizer.h>
+#include <wx/stattext.h>
+#include <wx/button.h>
+#include <wx/string.h>
+#include <wx/checkbox.h>
+#include <wx/msgdlg.h>
+#include "lms7suiteEvents.h"
+
+#include <ciso646>
+#include <vector>
+
+
+using namespace std;
+
+BEGIN_EVENT_TABLE(pnlUltimateEVB, wxPanel)
+END_EVENT_TABLE()
+
+pnlUltimateEVB::pnlUltimateEVB(wxWindow* parent,wxWindowID id, const wxPoint& pos,const wxSize& size, int style, wxString name)
+{
+    lmsControl = nullptr;
+
+    Create(parent, id, pos, size, style, name);
+#ifdef WIN32
+    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
+#endif
+    wxFlexGridSizer* mainSizer = new wxFlexGridSizer(0, 2, 5, 5);
+
+    SetSizer(mainSizer);
+
+    auto powerBox = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Voltage/Current/Power") ), wxVERTICAL );
+    auto sizerPowerRd = new wxFlexGridSizer( 0, 4, 2, 2 );
+    sizerPowerRd->SetFlexibleDirection( wxBOTH );
+    sizerPowerRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+    sizerPowerRd->Add(new wxStaticText(this, wxID_ANY, _(" Name")), 1, wxALL, 5);
+    sizerPowerRd->Add(new wxStaticText(this, wxID_ANY, _(" Voltage")), 1, wxALL, 5);
+    sizerPowerRd->Add(new wxStaticText(this, wxID_ANY, _(" Current")), 1, wxALL, 5);
+    sizerPowerRd->Add(new wxStaticText(this, wxID_ANY, _(" Power")), 1, wxALL, 5);
+
+    const std::vector<std::string> names = {"VCC1P25_LMS_DIG", "VCC1P25_LMS", "VCC1P4_LMS", "VCC1P8_LMS", "VDIO_LMS", "USER"};
+
+    for (unsigned i = 0; i<names.size(); i++)
+    {
+        const int offset = 35+i;
+        pwrParams.push_back(ADCparam(offset,names[i]));
+        pwrParams.push_back(ADCparam(offset+names.size(),names[i]));
+        pwrParams.push_back(ADCparam(offset+2*names.size(),names[i]));
+    }
+
+    for (unsigned i = 0; i<pwrParams.size(); i++)
+    {
+        if (i%3 == 0)
+        {
+            pwrParams[i].title = new wxStaticText(this, wxID_ANY, pwrParams[i].name);
+            sizerPowerRd->Add(pwrParams[i].title, 1, wxALL, 5);
+        }
+        pwrParams[i].value = new wxStaticText(this, wxID_ANY, _("- - - - -"));
+        sizerPowerRd->Add(pwrParams[i].value, 1, wxALL, 5);
+    }
+    powerBox->Add( sizerPowerRd, 1, wxEXPAND, 5 );
+    auto sizertotalPwr = new wxFlexGridSizer( 1, 2, 10, 10 );
+    totalPwr = new wxStaticText(this, wxID_ANY, _("- - - W"));
+    sizertotalPwr->Add(new wxStaticText(this, wxID_ANY, _("Total LMS power:")), 1, wxALL, 5);
+    sizertotalPwr->Add( totalPwr, 1, wxALL, 5 );
+    powerBox->Add( sizertotalPwr, 1, wxEXPAND, 5 );
+
+    auto voltageBox = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Voltages") ), wxVERTICAL );
+    auto sizerVoltageRd = new wxFlexGridSizer( 0, 4, 2, 2 );
+    sizerVoltageRd->SetFlexibleDirection( wxBOTH );
+    sizerVoltageRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+    sizerVoltageRd->Add(new wxStaticText(this, wxID_ANY, _("Name")), 1, wxALL, 5);
+    sizerVoltageRd->Add(new wxStaticText(this, wxID_ANY, _(" Voltage")), 1, wxALL, 5);
+    sizerVoltageRd->Add(new wxStaticText(this, wxID_ANY, _("Name")), 1, wxALL, 5);
+    sizerVoltageRd->Add(new wxStaticText(this, wxID_ANY, _("Voltage")), 1, wxALL, 5);
+
+    const std::vector<std::string> voltages = {
+        "AMUX_VDD_AFE", "AMUX_VDD12_RXBUF", "AMUX_VDD12_VCO_SXR", "AMUX_DVDD_SXR",
+        "AMUX_VDD_DIV_SXR", "AMUX_VDD_CP_SXR", "AMUX_VDD18_SXR", "AMUX_VDD_MXLOBUF_RFE",
+        "AMUX_VDD12_TIA_RFE", "AMUX_VDD14_LNA_RFE", "AMUX_VDD14_TIA_RFE", "AMUX_DIGPRVDD1_1",
+        "AMUX_VDD12_LNA_RFE", "AMUX_VDD14_RBB", "AMUX_DVDD_SXT", "AMUX_VDD_TBB",
+        "AMUX_VDD_TPAD_TRF", "AMUX_VDD12_DIG", "AMUX_VDD_CP_SXT", "AMUX_VDD12_VCO_SXT",
+        "AMUX_DIGPRVDD1_2", "AMUX_DVDD_CGEN", "AMUX_VDD_DIV_CGEN", "AMUX_VDD_SPI_BUF",
+        "AMUX_VDD12_TXBUF", "AMUX_VDD_DIV_SXT", "AMUX_VDD_TLOBUF_TRF", "AMUX_VDD14_VCO_CGEN",
+        "AMUX_VDD_CP_CGEN", "AMUX_LMS_TSTAO", "AMUX_LMS_TSTDO1", "AMUX_LMS_TSTDO0"
+    };
+
+    for (unsigned i = 0; i<voltages.size(); i++)
+        vltgParams.push_back(ADCparam(2+i,voltages[i]));
+
+
+    for (unsigned i = 0; i<vltgParams.size(); i++)
+    {
+        vltgParams[i].title = new wxStaticText(this, wxID_ANY, vltgParams[i].name);
+        sizerVoltageRd->Add(vltgParams[i].title, 1, wxALL, 5);
+        vltgParams[i].value = new wxStaticText(this, wxID_ANY, _("- - - mV"));
+        sizerVoltageRd->Add(vltgParams[i].value, 1, wxALL, 5);
+    }
+    voltageBox->Add( sizerVoltageRd, 1, wxEXPAND, 5 );
+
+    mainSizer->Add( voltageBox, 1, wxEXPAND, 5 );
+    mainSizer->Add( powerBox, 1, wxEXPAND, 5 );
+    mainSizer->Fit(this);
+    //mainSizer->SetSizeHints(this);
+    Layout();
+    Fit();
+    Bind(READ_ALL_VALUES, &pnlUltimateEVB::OnReadAll, this, this->GetId());
+}
+
+void pnlUltimateEVB::Initialize(lms_device_t* pControl)
+{
+    lmsControl = pControl;
+}
+
+pnlUltimateEVB::~pnlUltimateEVB()
+{
+}
+
+void pnlUltimateEVB::OnReadAll(wxCommandEvent &event)
+{
+    double sumPwr = 0;
+    float_type value;
+    lms_name_t units;
+    for (size_t i = 0; i < pwrParams.size(); ++i)
+    {
+        int status = LMS_ReadCustomBoardParam(lmsControl,pwrParams[i].channel,&value,units);
+        if (status != 0)
+        {
+            wxMessageBox(LMS_GetLastErrorMessage(), _("Warning"));
+            return;
+        }
+        if (pwrParams[i].channel >= 47 && pwrParams[i].channel < 52)
+            sumPwr += value;
+        pwrParams[i].value->SetLabel(wxString::Format(_("%1.0f %s"), value, units));
+    }
+    totalPwr->SetLabel(wxString::Format(_("%1.0f mW"), sumPwr));
+
+    for (size_t i = 0; i < vltgParams.size(); ++i)
+    {
+        int status = LMS_ReadCustomBoardParam(lmsControl,vltgParams[i].channel,&value,units);
+        if (status != 0)
+        {
+            wxMessageBox(LMS_GetLastErrorMessage(), _("Warning"));
+            return;
+        }
+        vltgParams[i].value->SetLabel(wxString::Format(_("%1.0f %s"), value, units));
+    }
+    this->GetParent()->Layout();
+    this->GetParent()->Fit();
+}
+
+void pnlUltimateEVB::OnWriteAll(wxCommandEvent &event)
+{
+}
diff --git a/src/boards_wxgui/pnlUltimateEVB.h b/src/boards_wxgui/pnlUltimateEVB.h
new file mode 100644
index 0000000..387ce7c
--- /dev/null
+++ b/src/boards_wxgui/pnlUltimateEVB.h
@@ -0,0 +1,50 @@
+#ifndef PNL_ULTIMATEEVB_H
+#define PNL_ULTIMATEEVB_H
+
+#include "lime/LimeSuite.h"
+#include <map>
+#include <vector>
+#include <wx/panel.h>
+#include <wx/stattext.h>
+
+class wxStaticText;
+class wxFlexGridSizer;
+class wxCheckBox;
+
+class pnlUltimateEVB : public wxPanel
+{
+    class ADCparam
+    {
+    public:
+        ADCparam(int ch, std::string nm = ""): title(nullptr), value(nullptr)
+        {
+            channel = ch;
+            name = nm;
+        };
+        ~ADCparam()
+        {
+            if (title) title->Destroy();
+            if (value) value->Destroy();
+        }
+        int channel;
+        std::string name;
+        wxStaticText* title;
+        wxStaticText* value;
+    };
+public:
+    pnlUltimateEVB(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int style = 0, wxString name = wxEmptyString);
+    void Initialize(lms_device_t *pControl);
+    virtual ~pnlUltimateEVB();
+
+    void OnReadAll(wxCommandEvent &event);
+    void OnWriteAll(wxCommandEvent &event);
+
+protected:
+    std::vector<ADCparam> pwrParams;
+    std::vector<ADCparam> vltgParams;
+    wxStaticText* totalPwr;
+    lms_device_t *lmsControl;
+    DECLARE_EVENT_TABLE()
+};
+
+#endif
diff --git a/src/examples/basicRX.cpp b/src/examples/basicRX.cpp
index b5f4c4f..6c67192 100644
--- a/src/examples/basicRX.cpp
+++ b/src/examples/basicRX.cpp
@@ -75,10 +75,10 @@ int main(int argc, char** argv)
     //Initialize stream
     lms_stream_t streamId; //stream structure
     streamId.channel = 0; //channel number
-    streamId.fifoSize = 1024 * 128; //fifo size in samples
+    streamId.fifoSize = 1024 * 1024; //fifo size in samples
     streamId.throughputVsLatency = 1.0; //optimize for max throughput
     streamId.isTx = false; //RX channel
-    streamId.dataFmt = lms_stream_t::LMS_FMT_I16; //16-bit integers
+    streamId.dataFmt = lms_stream_t::LMS_FMT_I12; //12-bit integers
     if (LMS_SetupStream(device, &streamId) != 0)
         error();
 
diff --git a/src/examples/dualRXTX.cpp b/src/examples/dualRXTX.cpp
index 2647d0f..76e542c 100644
--- a/src/examples/dualRXTX.cpp
+++ b/src/examples/dualRXTX.cpp
@@ -54,7 +54,7 @@ int main(int argc, char** argv)
     if ((n = LMS_GetNumChannels(device, LMS_CH_RX)) < 0)
         error();
     cout << "Number of RX channels: " << n << endl;
-    if ((n = LMS_GetNumChannels(device, LMS_CH_RX)) < 0)
+    if ((n = LMS_GetNumChannels(device, LMS_CH_TX)) < 0)
         error();
     cout << "Number of TX channels: " << n << endl;
 
@@ -116,17 +116,17 @@ int main(int argc, char** argv)
     for (int i = 0; i < chCount; ++i)
     {
         rx_streams[i].channel = i; //channel number
-        rx_streams[i].fifoSize = 1024 * 128; //fifo size in samples
+        rx_streams[i].fifoSize = 1024 * 1024; //fifo size in samples
         rx_streams[i].throughputVsLatency = 0.0; //optimize for minimum latency
         rx_streams[i].isTx = false; //RX channel
-        rx_streams[i].dataFmt = lms_stream_t::LMS_FMT_I16; //16-bit integers
+        rx_streams[i].dataFmt = lms_stream_t::LMS_FMT_I12; //12-bit integers
         if (LMS_SetupStream(device, &rx_streams[i]) != 0)
             error();
         tx_streams[i].channel = i; //channel number
-        tx_streams[i].fifoSize = 1024 * 128; //fifo size in samples
+        tx_streams[i].fifoSize = 1024 * 1024; //fifo size in samples
         tx_streams[i].throughputVsLatency = 0.0; //optimize for minimum latency
         tx_streams[i].isTx = true; //TX channel
-        tx_streams[i].dataFmt = lms_stream_t::LMS_FMT_I16; //16-bit integers
+        tx_streams[i].dataFmt = lms_stream_t::LMS_FMT_I12; //12-bit integers
         if (LMS_SetupStream(device, &tx_streams[i]) != 0)
             error();
     }
@@ -169,8 +169,8 @@ int main(int argc, char** argv)
             int samplesRead;
             //Receive samples
             samplesRead = LMS_RecvStream(&rx_streams[i], buffers[i], bufersize, &rx_metadata, 1000);
-            //Send samples with 1024*1024 sample delay from RX (waitForTimestamp is enabled)
-            tx_metadata.timestamp = rx_metadata.timestamp + 1024 * 512;
+            //Send samples with 1024*256 sample delay from RX (waitForTimestamp is enabled)
+            tx_metadata.timestamp = rx_metadata.timestamp + 1024 * 256;
             LMS_SendStream(&tx_streams[i], buffers[i], samplesRead, &tx_metadata, 1000);
         }
 
diff --git a/src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp b/src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp
index 1885c6b..6731264 100644
--- a/src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp
+++ b/src/fftviewer_wxgui/fftviewer_frFFTviewer.cpp
@@ -25,7 +25,7 @@ mStreamRunning(false),
 lmsControl(nullptr)
 {
     captureSamples.store(false);
-    averageCount.store(10);
+    averageCount.store(50);
     spinAvgCount->SetValue(averageCount);
     updateGUI.store(true);
 #ifndef __unix__
@@ -209,7 +209,38 @@ void fftviewer_frFFTviewer::OnUpdatePlots(wxThreadEvent& event)
     if (mStreamRunning.load() == false)
         return;
 
-    if (streamData.fftBins_dbFS[0].size() > 0)
+    const int fftSize = streamData.fftBins[0].size();
+
+    float chPwr[2] = { 0, 0 };
+    double cFreq[2] = { 0, 0 };
+    txtCenterOffset1->GetValue().ToDouble(&cFreq[0]);
+    txtCenterOffset2->GetValue().ToDouble(&cFreq[1]);
+    double bw[2] = {1, 1};
+    txtBW1->GetValue().ToDouble(&bw[0]);
+    txtBW2->GetValue().ToDouble(&bw[1]);
+
+    for (int c = 0; c<2; ++c)
+    {
+        float f0 = (cFreq[c] - bw[c]/2) * 1e6;
+        float fn = (cFreq[c] + bw[c]/2) * 1e6;
+        float sum = 0;
+        int bins = 0;
+        for (int i = 0; i<fftSize; ++i)
+            if (f0 <= fftFreqAxis[i] && fftFreqAxis[i] <= fn)
+            {
+                sum += streamData.fftBins[0][i];
+                ++bins;
+            }
+        chPwr[c] = sum;
+    }
+
+    float pwr1 = (chPwr[0] != 0 ? (10 * log10(chPwr[0])) - 69.2369 : -300);
+    lblPower1->SetLabel(wxString::Format("%.3f", pwr1));
+    float pwr2 = (chPwr[1] != 0 ? (10 * log10(chPwr[1])) - 69.2369 : -300);
+    lblPower2->SetLabel(wxString::Format("%.3f", pwr2));
+    lbldBc->SetLabel(wxString::Format("%.3f", pwr2-pwr1));
+
+    if (fftSize > 0)
     {
         if (chkFreezeTimeDomain->IsChecked() == false)
         {
@@ -225,8 +256,15 @@ void fftviewer_frFFTviewer::OnUpdatePlots(wxThreadEvent& event)
         }
         if (chkFreezeFFT->IsChecked() == false)
         {
-            mFFTpanel->series[0]->AssignValues(&fftFreqAxis[0], &streamData.fftBins_dbFS[0][0], streamData.fftBins_dbFS[0].size());
-            mFFTpanel->series[1]->AssignValues(&fftFreqAxis[0], &streamData.fftBins_dbFS[1][0], streamData.fftBins_dbFS[1].size());
+            for (int ch = 0; ch<2; ++ch)
+            {
+                for (int s = 0; s < fftSize; ++s)
+                {
+                    streamData.fftBins[ch][s] = (streamData.fftBins[ch][s] != 0 ? (10 * log10(streamData.fftBins[ch][s])) - 69.2369 : -300);
+                }
+            }
+            mFFTpanel->series[0]->AssignValues(&fftFreqAxis[0], &streamData.fftBins[0][0], fftSize);
+            mFFTpanel->series[1]->AssignValues(&fftFreqAxis[0], &streamData.fftBins[1][0], fftSize);
         }
     }
 
@@ -246,44 +284,9 @@ void fftviewer_frFFTviewer::OnUpdatePlots(wxThreadEvent& event)
     {
         mFFTpanel->Refresh();
         mFFTpanel->Draw();
+        enableFFT.store(true);
     }
-
-    float chPwr[2] = {0, 0};
-    double cFreq[2] = {0, 0};
-    txtCenterOffset1->GetValue().ToDouble(&cFreq[0]);
-    cFreq[0] *= 1000000;
-    txtCenterOffset2->GetValue().ToDouble(&cFreq[1]);
-    cFreq[1] *= 1000000;
-    double bw[2] = {1e6, 1e6};
-    txtBW1->GetValue().ToDouble(&bw[0]);
-    bw[0] *= 1000000;
-    txtBW2->GetValue().ToDouble(&bw[1]);
-    bw[1] *= 1000000;
-    /*
-    // TODO
-    for(int c=0; c<2; ++c)
-    {
-        float f0 = cFreq[c]-bw[c]/2;
-        float fn = cFreq[c]+bw[c]/2;
-        float sum = 0;
-        int bins = 0;
-        const int fftSize = streamData.fftBins_dbFS[0].size();
-        for(int i=0; i<fftSize; ++i)
-            if(f0 <= fftFreqAxis[i] && fftFreqAxis[i] <= fn)
-            {
-                double val = streamData.fftBins_dbFS[0][i];
-                sum += val;
-                ++bins;
-            }
-        chPwr[c] = sum;
-    }
-    */
-
-    float pwr1  = (chPwr[0] != 0 ? (20 * log10(chPwr[0])) - 69.2369 : -300);
-    lblPower1->SetLabel(wxString::Format("%.3f", pwr1));
-    float pwr2 = (chPwr[1] != 0 ? (20 * log10(chPwr[1])) - 69.2369 : -300);
-    lblPower2->SetLabel(wxString::Format("%.3f", pwr2));
-    lbldBc->SetLabel(wxString::Format("%.3f", 20*log10(chPwr[1]/chPwr[0])));
+    else enableFFT.store(false);
 
     updateGUI.store(true);
 }
@@ -292,13 +295,13 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
 {
     bool runTx = true;
     const int cMaxChCount = 2;
-    const int test_count = fftSize;// / 680*26;//4096*16;
+    const int fifoSize = fftSize*512;
     int avgCount = pthis->spinAvgCount->GetValue();
     int wndFunction = pthis->windowFunctionID.load();
+    bool fftEnabled = true;
 
     vector<float> wndCoef;
-    float amplitudeCorrection = 1;
-    GenerateWindowCoefficients(wndFunction, fftSize, wndCoef, amplitudeCorrection);
+    GenerateWindowCoefficients(wndFunction, fftSize, wndCoef, 1);
 
     lime::complex16_t** buffers;
 
@@ -308,11 +311,11 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
     localDataResults.samplesI[1].resize(fftSize, 0);
     localDataResults.samplesQ[0].resize(fftSize, 0);
     localDataResults.samplesQ[1].resize(fftSize, 0);
-    localDataResults.fftBins_dbFS[0].resize(fftSize, 0);
-    localDataResults.fftBins_dbFS[1].resize(fftSize, 0);
+    localDataResults.fftBins[0].resize(fftSize, 0);
+    localDataResults.fftBins[1].resize(fftSize, 0);
     buffers = new lime::complex16_t*[channelsCount];
     for (int i = 0; i < channelsCount; ++i)
-        buffers[i] = new complex16_t[test_count];
+        buffers[i] = new complex16_t[fftSize];
 
     vector<complex16_t> captureBuffer[cMaxChCount];
     uint32_t samplesToCapture[cMaxChCount];
@@ -327,7 +330,7 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
     for(int i=0; i<channelsCount; ++i)
     {
         pthis->rxStreams[i].channel = i;
-        pthis->rxStreams[i].fifoSize = test_count*40;
+        pthis->rxStreams[i].fifoSize = fifoSize;
         pthis->rxStreams[i].isTx = false;
         pthis->rxStreams[i].dataFmt = fmt;
         pthis->rxStreams[i].throughputVsLatency = 1;
@@ -335,7 +338,7 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
 
         pthis->txStreams[i].handle = 0;
         pthis->txStreams[i].channel = i;
-        pthis->txStreams[i].fifoSize = test_count*40;
+        pthis->txStreams[i].fifoSize = fifoSize;
         pthis->txStreams[i].isTx = true;
         pthis->txStreams[i].dataFmt = fmt;
         pthis->txStreams[i].throughputVsLatency = 1;
@@ -355,30 +358,27 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
     }
 
     pthis->mStreamRunning.store(true);
-    auto t1 = chrono::high_resolution_clock::now();
-    auto t2 = chrono::high_resolution_clock::now();
     lms_stream_meta_t meta;
     meta.waitForTimestamp = true;
     int fftCounter = 0;
 
     while (pthis->stopProcessing.load() == false)
     {
-        for(int a = fftCounter; a<avgCount && pthis->stopProcessing.load() == false; ++a)
+        do
         {
-            uint32_t samplesPopped[2] = {0, 0};
-            uint64_t ts[2];
+            uint32_t samplesPopped[cMaxChCount];
+            uint64_t ts[cMaxChCount];
             for(int i=0; i<channelsCount; ++i)
             {
-                samplesPopped[i] += LMS_RecvStream(&pthis->rxStreams[i], &buffers[i][samplesPopped[i]], test_count, &meta, 1000);
-                ts[i] = meta.timestamp + 1024 * 1024*2;
+                samplesPopped[i] = LMS_RecvStream(&pthis->rxStreams[i], &buffers[i][0], fftSize, &meta, 1000);
+                ts[i] = meta.timestamp + fifoSize/4;
             }
 
-            uint32_t samplesPushed[2] = {0, 0};
             for(int i=0; runTx && i<channelsCount; ++i)
             {
                 meta.timestamp = ts[i];
                 meta.waitForTimestamp = true;
-                samplesPushed[i] += LMS_SendStream(&pthis->txStreams[i], &buffers[i][samplesPushed[i]], samplesPopped[i], &meta, 1000);
+                LMS_SendStream(&pthis->txStreams[i], &buffers[i][0], samplesPopped[i], &meta, 1000);
             }
 
             if(pthis->captureSamples.load())
@@ -397,45 +397,55 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
             {
                 //take only first buffer for time domain display
                 //reset fftBins for accumulation
-                for (unsigned i = 0; a==0 && i < fftSize; ++i)
+                for (unsigned i = 0; fftCounter==0 && i < fftSize; ++i)
                 {
-                    localDataResults.fftBins_dbFS[ch][i] = 0;
+                    if (fftEnabled)
+                        localDataResults.fftBins[ch][i] = 0;
                     localDataResults.samplesI[ch][i] = buffers[ch][i].i;
                     localDataResults.samplesQ[ch][i] = buffers[ch][i].q;
                 }
-                for (unsigned i = 0; i < fftSize; ++i)
-                {
-                    m_fftCalcIn[i].r = buffers[ch][i].i * amplitudeCorrection * wndCoef[i];
-                    m_fftCalcIn[i].i = buffers[ch][i].q * amplitudeCorrection * wndCoef[i];
-                }
-
-                kiss_fft(m_fftCalcPlan, m_fftCalcIn, m_fftCalcOut);
-                ++fftCounter;
-                for(unsigned int i=0; i<fftSize; ++i)
+                if (fftEnabled)
                 {
-                    m_fftCalcOut[i].r /= fftSize;
-                    m_fftCalcOut[i].i /= fftSize;
+                    if (wndFunction == 0)
+                    {
+                        for (unsigned i = 0; i < fftSize; ++i)
+                        {
+                            m_fftCalcIn[i].r = buffers[ch][i].i;
+                            m_fftCalcIn[i].i = buffers[ch][i].q;
+                        }
+                    }
+                    else
+                    {
+                        for (unsigned i = 0; i < fftSize; ++i)
+                        {
+                            m_fftCalcIn[i].r = buffers[ch][i].i * wndCoef[i];
+                            m_fftCalcIn[i].i = buffers[ch][i].q * wndCoef[i];
+                        }
+                    }
+
+                    kiss_fft(m_fftCalcPlan, m_fftCalcIn, m_fftCalcOut);
+
+                    int output_index = 0;
+                    for (unsigned i = fftSize / 2 + 1; i < fftSize; ++i)
+                        localDataResults.fftBins[ch][output_index++] += m_fftCalcOut[i].r * m_fftCalcOut[i].r + m_fftCalcOut[i].i * m_fftCalcOut[i].i;
+                    for (unsigned i = 0; i < fftSize / 2 + 1; ++i)
+                        localDataResults.fftBins[ch][output_index++] += m_fftCalcOut[i].r * m_fftCalcOut[i].r + m_fftCalcOut[i].i * m_fftCalcOut[i].i;
                 }
-                int output_index = 0;
-                for (unsigned i = fftSize / 2 + 1; i < fftSize; ++i)
-                    localDataResults.fftBins_dbFS[ch][output_index++] += sqrt(m_fftCalcOut[i].r * m_fftCalcOut[i].r + m_fftCalcOut[i].i * m_fftCalcOut[i].i);
-                for (unsigned i = 0; i < fftSize / 2 + 1; ++i)
-                    localDataResults.fftBins_dbFS[ch][output_index++] += sqrt(m_fftCalcOut[i].r * m_fftCalcOut[i].r + m_fftCalcOut[i].i * m_fftCalcOut[i].i);
             }
-        }
+        } while (++fftCounter < avgCount && pthis->stopProcessing.load() == false);
 
-        t2 = chrono::high_resolution_clock::now();
-        auto timePeriod = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
-        if (timePeriod >= 33 && fftCounter >= avgCount && pthis->updateGUI.load() == true)
+        if (fftCounter >= avgCount && pthis->updateGUI.load() == true)
         {
-            t1 = t2;
-            //shift fft, convert to dBfs
-            for(int ch=0; ch<channelsCount; ++ch)
+            //shift fft
+            if (fftEnabled)
             {
-                for (unsigned s = 0; s < fftSize; ++s)
+                for(int ch=0; ch<channelsCount; ++ch)
                 {
-                    localDataResults.fftBins_dbFS[ch][s] /= fftCounter;
-                    localDataResults.fftBins_dbFS[ch][s] = (localDataResults.fftBins_dbFS[ch][s] != 0 ? (20 * log10(localDataResults.fftBins_dbFS[ch][s])) - 69.2369 : -300);
+                    for (unsigned s = 0; s < fftSize; ++s)
+                    {
+                        const float div = (float)fftCounter*fftSize*fftSize;
+                        localDataResults.fftBins[ch][s] /= div;
+                    }
                 }
             }
             if(pthis->stopProcessing.load() == false)
@@ -447,13 +457,14 @@ void fftviewer_frFFTviewer::StreamingLoop(fftviewer_frFFTviewer* pthis, const un
                 pthis->QueueEvent(evt);
             }
             fftCounter = 0;
-        }
-        avgCount = pthis->averageCount.load();
-        int wndFunctionSelection = pthis->windowFunctionID.load();
-        if(wndFunctionSelection != wndFunction)
-        {
-            wndFunction = wndFunctionSelection;
-            GenerateWindowCoefficients(wndFunction, fftSize, wndCoef, amplitudeCorrection);
+            fftEnabled = pthis->enableFFT.load();
+            avgCount = pthis->averageCount.load();
+            int wndFunctionSelection = pthis->windowFunctionID.load();
+            if(wndFunctionSelection != wndFunction)
+            {
+                wndFunction = wndFunctionSelection;
+                GenerateWindowCoefficients(wndFunction, fftSize, wndCoef, 1);
+            }
         }
     }
 
@@ -534,6 +545,10 @@ void fftviewer_frFFTviewer::OnChannelVisibilityChange(wxCommandEvent& event)
         visibilities[0] = true;
         visibilities[1] = true;
         break;
+    default:
+        visibilities[0] = false;
+        visibilities[1] = false;
+        break;
     }
     mTimeDomainPanel->series[0]->visible = visibilities[0];
     mTimeDomainPanel->series[1]->visible = visibilities[0];
diff --git a/src/fftviewer_wxgui/fftviewer_frFFTviewer.h b/src/fftviewer_wxgui/fftviewer_frFFTviewer.h
index 150cc09..4d86544 100644
--- a/src/fftviewer_wxgui/fftviewer_frFFTviewer.h
+++ b/src/fftviewer_wxgui/fftviewer_frFFTviewer.h
@@ -23,6 +23,7 @@ protected:
     std::atomic<bool> captureSamples;
     std::atomic<int> averageCount;
     std::atomic<bool> updateGUI;
+    std::atomic<bool> enableFFT;
     std::string captureFilename;
 	// Handlers for frFFTviewer events.
 	void OnWindowFunctionChanged( wxCommandEvent& event );
@@ -52,7 +53,7 @@ protected:
     {
         std::vector<float> samplesI[2];
         std::vector<float> samplesQ[2];
-        std::vector<float> fftBins_dbFS[2];
+        std::vector<float> fftBins[2];
         float nyquist_Hz;
         float rxDataRate_Bps;
         float txDataRate_Bps;
@@ -67,9 +68,9 @@ protected:
                 this->samplesQ[ch].clear();
                 this->samplesQ[ch].reserve(src.samplesQ[ch].size());
                 this->samplesQ[ch] = src.samplesQ[ch];
-                this->fftBins_dbFS[ch].clear();
-                this->fftBins_dbFS[ch].reserve(src.fftBins_dbFS[ch].size());
-                this->fftBins_dbFS[ch] = src.fftBins_dbFS[ch];
+                this->fftBins[ch].clear();
+                this->fftBins[ch].reserve(src.fftBins[ch].size());
+                this->fftBins[ch] = src.fftBins[ch];
                 this->nyquist_Hz = src.nyquist_Hz;
                 this->rxDataRate_Bps = src.rxDataRate_Bps;
                 this->txDataRate_Bps = src.txDataRate_Bps;
diff --git a/src/fftviewer_wxgui/fftviewer_wxgui.cpp b/src/fftviewer_wxgui/fftviewer_wxgui.cpp
index dfaab0c..8bd967b 100644
--- a/src/fftviewer_wxgui/fftviewer_wxgui.cpp
+++ b/src/fftviewer_wxgui/fftviewer_wxgui.cpp
@@ -232,13 +232,13 @@ frFFTviewer::frFFTviewer( wxWindow* parent, wxWindowID id, const wxString& title
 	cmbChannelVisibility->SetSelection( 0 );
 	fgSizer101->Add( cmbChannelVisibility, 0, 0, 5 );
 	
-	m_staticText23 = new wxStaticText( sbSizer3->GetStaticBox(), wxID_ANY, wxT("Average:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText23 = new wxStaticText( sbSizer3->GetStaticBox(), wxID_ANY, wxT("FFT averaging:"), wxDefaultPosition, wxDefaultSize, 0 );
 	m_staticText23->Wrap( -1 );
 	m_staticText23->SetToolTip( wxT("Number of FFTs to average") );
 	
 	fgSizer101->Add( m_staticText23, 0, wxALL, 5 );
 	
-	spinAvgCount = new wxSpinCtrl( sbSizer3->GetStaticBox(), wxID_ANY, wxT("1"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 128, 1 );
+	spinAvgCount = new wxSpinCtrl( sbSizer3->GetStaticBox(), wxID_ANY, wxT("1"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 512, 1 );
 	spinAvgCount->SetToolTip( wxT("Number of FFTs to average") );
 	spinAvgCount->SetMinSize( wxSize( 64,-1 ) );
 	
diff --git a/src/fftviewer_wxgui/fftviewer_wxgui.fbp b/src/fftviewer_wxgui/fftviewer_wxgui.fbp
index 9d24271..9e1da34 100644
--- a/src/fftviewer_wxgui/fftviewer_wxgui.fbp
+++ b/src/fftviewer_wxgui/fftviewer_wxgui.fbp
@@ -2660,7 +2660,7 @@
                                                         <property name="gripper">0</property>
                                                         <property name="hidden">0</property>
                                                         <property name="id">wxID_ANY</property>
-                                                        <property name="label">Average:</property>
+                                                        <property name="label">FFT averaging:</property>
                                                         <property name="max_size"></property>
                                                         <property name="maximize_button">0</property>
                                                         <property name="maximum_size"></property>
@@ -2744,7 +2744,7 @@
                                                         <property name="hidden">0</property>
                                                         <property name="id">wxID_ANY</property>
                                                         <property name="initial">1</property>
-                                                        <property name="max">128</property>
+                                                        <property name="max">512</property>
                                                         <property name="max_size"></property>
                                                         <property name="maximize_button">0</property>
                                                         <property name="maximum_size"></property>
diff --git a/src/lime/LimeSuite.h b/src/lime/LimeSuite.h
index 1c02196..ac7c551 100644
--- a/src/lime/LimeSuite.h
+++ b/src/lime/LimeSuite.h
@@ -322,6 +322,23 @@ API_EXPORT int CALL_CONV LMS_SetNormalizedGain(lms_device_t *device, bool dir_tx
                                                 size_t chan,float_type gain);
 
 /**
+ * Set the combined gain value
+ *
+ * This function computes and sets the optimal gain values of various amplifiers
+ * that are present in the device based on desired  gain value in dB.
+ *
+ * @note currently works only with RX
+ *
+ * @param   device      Device handle previously obtained by LMS_Open().
+ * @param   dir_tx      Select RX or TX
+ * @param   chan        Channel index
+ * @param   gain        Desired gain, range [0, 70] for RX
+ * @return  0 on success, (-1) on failure
+ */
+API_EXPORT int CALL_CONV LMS_SetGaindB(lms_device_t *device, bool dir_tx,
+                                                size_t chan,unsigned gain);
+
+/**
  * Obtain the current combined gain value
  *
  * @param       device      Device handle previously obtained by LMS_Open().
@@ -334,6 +351,20 @@ API_EXPORT int CALL_CONV LMS_SetNormalizedGain(lms_device_t *device, bool dir_tx
 API_EXPORT int CALL_CONV LMS_GetNormalizedGain(lms_device_t *device, bool dir_tx,
                                                 size_t chan,float_type *gain);
 
+/**
+ * Obtain the current combined gain value in dB
+ *
+ * @note currently works only with RX
+ *
+ * @param       device      Device handle previously obtained by LMS_Open().
+ * @param       dir_tx      Select RX or TX
+ * @param       chan        Channel index
+ * @param[out]  gain        Current gain, range [0, 700]
+ * @return  0 on success, (-1) on failure
+ */
+API_EXPORT int CALL_CONV LMS_GetGaindB(lms_device_t *device, bool dir_tx,
+                                                size_t chan, unsigned *gain);
+
 typedef enum
 {
 	LPF_BW_5_MHz,
@@ -1318,7 +1349,7 @@ API_EXPORT int CALL_CONV LMS_StopStream(lms_stream_t *conf);
  * @param samples       sample buffer.
  * @param sample_count  Number of samples to read
  * @param meta          Metadata. See the ::lms_stream_meta_t description.
- * @param timeout_ms    how long to wait for data before timing out(0=infinite).
+ * @param timeout_ms    how long to wait for data before timing out.
  *
  * @return number of samples received on success, (-1) on failure
  */
@@ -1342,7 +1373,7 @@ API_EXPORT int CALL_CONV LMS_GetStreamStatus(lms_stream_t *stream, lms_stream_st
  * @param samples       sample buffer.
  * @param sample_count  Number of samples to write
  * @param meta          Metadata. See the ::lms_stream_meta_t description.
- * @param timeout_ms    how long to wait for data before timing out(0=infinite).
+ * @param timeout_ms    how long to wait for data before timing out.
  *
  * @return number of samples send on success, (-1) on failure
  */
@@ -1521,6 +1552,15 @@ API_EXPORT int CALL_CONV LMS_ProgramHPM7File(lms_device_t *device,
                 const char *file, unsigned mode, lms_prog_callback_t callback);
 
 /**
+ *
+ * @param device    Device handle previously obtained by LMS_Open().
+ * @param download  True to download missing images from the web.
+ * @return          0 on success, (-1) on failure
+ */
+API_EXPORT int CALL_CONV LMS_ProgramUpdate(lms_device_t *device,
+                const bool download, lms_prog_callback_t callback);
+
+/**
  * Program LMS7 internal MCU.
  *
  * @param device    Device handle previously obtained by LMS_Open().
diff --git a/src/lms7002_wxgui/CoefficientFileParser.cpp b/src/lms7002_wxgui/CoefficientFileParser.cpp
index 42fb5fc..d75d359 100644
--- a/src/lms7002_wxgui/CoefficientFileParser.cpp
+++ b/src/lms7002_wxgui/CoefficientFileParser.cpp
@@ -16,7 +16,7 @@ using namespace std;
 // ***************************************************************
 bool Parser::IsBlank(char c)
 {
-	char blankchar[] = ", \t\n";
+	char blankchar[] = ", \t\n\r";
 	for(unsigned i=0; i<strlen(blankchar); i++)
 			if(c == blankchar[i] ) return(true);
 
@@ -28,7 +28,7 @@ bool Parser::IsBlank(char c)
 // ***************************************************************
 bool Parser::IsDigit(char c)
 {
-	char digit[] = "0123456789+-";
+	char digit[] = ".0123456789+-";
 	for(unsigned i=0; i<strlen(digit); i++)
 			if(c == digit[i] ) return(true);
 	return(false);
@@ -41,7 +41,7 @@ bool Parser::IsDigit(char c)
 //		-1 if EOF or
 //		-2 if syntax error
 // ***************************************************************
-int Parser::getint(FILE *fp, int *v)
+int Parser::getValue(FILE *fp, float *v)
 {
 	char c, c1, str[256];
 	int i, opencomments;
@@ -57,7 +57,7 @@ int Parser::getint(FILE *fp, int *v)
 		if( c1 == '/') {	/* C++ one line comment */
 			while( (c = fgetc(fp)) != '\n' && c != EOF) ;
 			if(c == EOF) return(EOF);
-			else return(getint(fp, v)); 
+			else return(getValue(fp, v));
 		} else if( c1 == '*') {		/* C like comment */
 			opencomments = 1;
 			c = fgetc(fp);
@@ -69,7 +69,7 @@ int Parser::getint(FILE *fp, int *v)
 				if(opencomments == 0) break;
 			}
 			if(c1 == EOF) return(EOF);
-			else return(getint(fp, v));
+			else return(getValue(fp, v));
 		} else {
 			ungetc(c1, fp);
 		}
@@ -82,7 +82,7 @@ int Parser::getint(FILE *fp, int *v)
 		}
 		ungetc(c, fp);
 		str[i]='\0';
-		*v = atoi(str);
+		*v = atof(str);
 		return(0);
 	} else return(-2);
 }
@@ -95,7 +95,7 @@ int Parser::getint(FILE *fp, int *v)
 //	-5	too many coefficients in the file
 //	>=0 	number of the coefficients read
 // ***************************************************************
-int Parser::getcoeffs(const char *filename, int *v, int max)
+int Parser::getcoeffs(const char *filename, float *v, int max)
 {
 	int i, n;
 	FILE *fp;
@@ -104,7 +104,7 @@ int Parser::getcoeffs(const char *filename, int *v, int max)
 	if( (fp = fopen(filename, "r")) == NULL) return(-4);
 
 	for(n=0; n < max; ) {
-		i = getint(fp, v);
+		i = getValue(fp, v);
 		if( i == EOF ) {
 			fclose(fp);
 			return(n);
@@ -128,7 +128,7 @@ int Parser::getcoeffs(const char *filename, int *v, int max)
 //	-5	too many coefficients in the file
 //	>=0 	number of the coefficients read
 // ***************************************************************
-int Parser::getcoeffs2(const char *filename, int *v1, int *v2, int max)
+int Parser::getcoeffs2(const char *filename, float *v1, float *v2, int max)
 {
 	int i, n;
 	FILE *fp;
@@ -137,7 +137,7 @@ int Parser::getcoeffs2(const char *filename, int *v1, int *v2, int max)
 	if( (fp = fopen(filename, "r")) == NULL) return(-4);
 
 	for(n=0; n < max+1; ) {
-		i = getint(fp, v1);
+		i = getValue(fp, v1);
 		if( i == EOF ) {
 			fclose(fp);
 			return(n);
@@ -148,7 +148,7 @@ int Parser::getcoeffs2(const char *filename, int *v1, int *v2, int max)
 			v1++;
 		}
 
-		i = getint(fp, v2);
+		i = getValue(fp, v2);
 		if( i == EOF ) {
 			fclose(fp);
 			return(-2);
@@ -167,7 +167,7 @@ int Parser::getcoeffs2(const char *filename, int *v1, int *v2, int max)
 // ***************************************************************
 // Saves given coefficients to fir file
 // ***************************************************************
-void Parser::saveToFile(const char * filename, const int *coefficients, int cCount)
+void Parser::saveToFile(const char * filename, const float *coefficients, int cCount)
 {
     fstream fout;
     fout.open(filename, ios::out);
@@ -195,7 +195,7 @@ void Parser::saveToFile(const char * filename, const int *coefficients, int cCou
 
     for(int i=0; i<cCount; ++i)
     {
-        fout << "\t" << coefficients[i];
+        fout << "\t" << std::fixed << coefficients[i];
         if(i<cCount-1)
             fout << ',' << endl;
     }
diff --git a/src/lms7002_wxgui/CoefficientFileParser.h b/src/lms7002_wxgui/CoefficientFileParser.h
index eedbaeb..e6a3eac 100644
--- a/src/lms7002_wxgui/CoefficientFileParser.h
+++ b/src/lms7002_wxgui/CoefficientFileParser.h
@@ -11,10 +11,10 @@ namespace Parser
 {
 	bool IsBlank(char);
 	bool IsDigit(char);
-	int getint(FILE *, int *);
-	int getcoeffs(const char *, int *, int);
-	int getcoeffs2(const char *, int *, int *, int);
-	void saveToFile(const char *, const int *, int);
+	int getValue(FILE *, float *);
+	int getcoeffs(const char *, float *, int);
+	int getcoeffs2(const char *, float *, float *, int);
+	void saveToFile(const char *, const float *, int);
 }
 
 #endif // COEFFICIENT_FILE_PARSER_H
diff --git a/src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp b/src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp
index b3cd0d9..20737da 100644
--- a/src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp
+++ b/src/lms7002_wxgui/lms7002_dlgGFIR_Coefficients.cpp
@@ -16,7 +16,7 @@ void lms7002_dlgGFIR_Coefficients::OnLoadFromFile( wxCommandEvent& event )
     if (dlg.ShowModal() == wxID_CANCEL)
         return;
 
-    int cbuf[200];
+    float cbuf[200];
     int iVal = Parser::getcoeffs((const char*)dlg.GetPath().ToStdString().c_str(), cbuf, 200);
 
     switch (iVal)
@@ -43,7 +43,7 @@ void lms7002_dlgGFIR_Coefficients::OnLoadFromFile( wxCommandEvent& event )
     gridCoef->GetTable()->AppendRows(spinCoefCount->GetValue());
     for (int i = 0; i<iVal; ++i)
     {
-        gridCoef->SetCellValue(i, 0, wxString::Format("%i", cbuf[i]));
+        gridCoef->SetCellValue(i, 0, wxString::Format("%f", cbuf[i]));
     }
 }
 
@@ -52,13 +52,13 @@ void lms7002_dlgGFIR_Coefficients::OnSaveToFile( wxCommandEvent& event )
     wxFileDialog dlg(this, _("Save coefficients file"), "", "", "FIR Coeffs (*.fir)|*.fir", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
     if (dlg.ShowModal() == wxID_CANCEL)
         return;
-    int coefficients[200];
+    float coefficients[200];
     memset(coefficients, 0, sizeof(unsigned short) * 200);
-    long ltemp;
+    double ltemp;
     for (int i = 0; i<spinCoefCount->GetValue(); ++i)
     {
         ltemp = 0;
-        gridCoef->GetCellValue(i, 0).ToLong(&ltemp);
+        gridCoef->GetCellValue(i, 0).ToDouble(&ltemp);
         coefficients[i] = ltemp;
     }
     Parser::saveToFile((const char*)dlg.GetPath().ToStdString().c_str(), coefficients, spinCoefCount->GetValue());
@@ -84,7 +84,7 @@ void lms7002_dlgGFIR_Coefficients::OnspinCoefCountChange(wxSpinEvent& event)
 }
 
 void lms7002_dlgGFIR_Coefficients::SetCoefficients(const std::vector<double> &coefficients)
-{   
+{
     spinCoefCount->SetValue(coefficients.size());
     if (gridCoef->GetTable()->GetRowsCount() > 0)
         gridCoef->GetTable()->DeleteRows(0, gridCoef->GetTable()->GetRowsCount());
diff --git a/src/lms7002_wxgui/lms7002_mainPanel.cpp b/src/lms7002_wxgui/lms7002_mainPanel.cpp
index a865d51..f9fedd4 100644
--- a/src/lms7002_wxgui/lms7002_mainPanel.cpp
+++ b/src/lms7002_wxgui/lms7002_mainPanel.cpp
@@ -23,6 +23,7 @@
 #include "lms7suiteEvents.h"
 #include "lms7002_pnlMCU_BD_view.h"
 #include "lms7002_pnlBuffers_view.h"
+#include "lms7002_pnlR3.h"
 #include "lime/LimeSuite.h"
 using namespace std;
 using namespace lime;
@@ -34,6 +35,9 @@ lms7002_mainPanel::lms7002_mainPanel(wxWindow* parent, wxWindowID id, const wxPo
     mTabMCU = new lms7002_pnlMCU_BD_view(tabsNotebook);
     tabsNotebook->AddPage(mTabMCU, _("MCU"));
 
+    mTabR3 = new lms7002_pnlR3_view(tabsNotebook, wxNewId());
+    tabsNotebook->AddPage(mTabR3, _("R3 Controls"));
+
     chkSyncAB->Hide();
 }
 
@@ -103,6 +107,8 @@ void lms7002_mainPanel::UpdateVisiblePanel()
         mTabBuffers->UpdateGUI();
         break;
     }
+    if(visibleTabId == mTabR3->GetId())
+        mTabR3->UpdateGUI();
     t2 = wxGetUTCTimeMillis();
 #ifndef NDEBUG
     cout << "Visible GUI update time: " << (t2 - t1).ToString() << endl;
@@ -132,6 +138,7 @@ void lms7002_mainPanel::Initialize(lms_device_t* pControl)
     mTabCalibrations->Initialize(lmsControl);
     mTabMCU->Initialize(lmsControl);
     mTabBuffers->Initialize(lmsControl);
+    mTabR3->Initialize(lmsControl);
     UpdateGUI();
 }
 
diff --git a/src/lms7002_wxgui/lms7002_mainPanel.h b/src/lms7002_wxgui/lms7002_mainPanel.h
index e937510..a1a7e5d 100644
--- a/src/lms7002_wxgui/lms7002_mainPanel.h
+++ b/src/lms7002_wxgui/lms7002_mainPanel.h
@@ -13,6 +13,7 @@ namespace lime{
 class MCU_BD;
 }
 class lms7002_pnlMCU_BD_view;
+class lms7002_pnlR3_view;
 
 /** Implementing mainPanel */
 class lms7002_mainPanel : public mainPanel
@@ -43,6 +44,7 @@ class lms7002_mainPanel : public mainPanel
         void Initialize(lms_device_t* pControl);
 protected:
         lms7002_pnlMCU_BD_view *mTabMCU;
+        lms7002_pnlR3_view *mTabR3;
         lms_device_t* lmsControl;
 };
 
diff --git a/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp b/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp
index d155daf..ac6ed49 100644
--- a/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.cpp
@@ -17,6 +17,14 @@ pnlCLKGEN_view( parent )
 lms7002_pnlCLKGEN_view::lms7002_pnlCLKGEN_view( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
     : pnlCLKGEN_view(parent, id, pos, size, style), lmsControl(nullptr)
 {
+    sizerR3->Add(new wxStaticText(this, wxID_ANY, _("CMPLO_CTRL:")), 1, wxEXPAND, 0);
+    cmbCMPLO_CTRL = new wxComboBox(this, wxID_ANY);
+    cmbCMPLO_CTRL->Append(_("Low treshold is set to 0.18V"));
+    cmbCMPLO_CTRL->Append(_("Low treshold is set to 0.1V"));
+    cmbCMPLO_CTRL->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlCLKGEN_view::ParameterChangeHandler), NULL, this);
+    sizerR3->Add(cmbCMPLO_CTRL, 0, 0, 5);
+    wndId2Enum[cmbCMPLO_CTRL] = LMS7_CMPLO_CTRL_CGEN;
+
     wndId2Enum[cmbCLKH_OV_CLKL_CGEN] = LMS7param(CLKH_OV_CLKL_CGEN);
     wndId2Enum[chkCOARSE_START_CGEN] = LMS7param(COARSE_START_CGEN);
     wndId2Enum[cmbCP2_CGEN] = LMS7param(CP2_CGEN);
@@ -211,7 +219,7 @@ void lms7002_pnlCLKGEN_view::OnbtnReadComparators(wxCommandEvent& event)
 
     uint16_t param;
     LMS_ReadParam(lmsControl,LMS7param(VCO_CMPHO_CGEN),&param);
-    
+
     lblVCO_CMPHO_CGEN->SetLabel(wxString::Format(_("%i"), param));
     if (param == 1)
         lblVCO_CMPHO_CGEN->SetBackgroundColour(*wxGREEN);
@@ -219,7 +227,7 @@ void lms7002_pnlCLKGEN_view::OnbtnReadComparators(wxCommandEvent& event)
         lblVCO_CMPHO_CGEN->SetBackgroundColour(*wxRED);
 
     LMS_ReadParam(lmsControl,LMS7param(VCO_CMPLO_CGEN),&param);
-    
+
     lblVCO_CMPLO_CGEN->SetLabel(wxString::Format(_("%i"), param));
     if (param == 0)
         lblVCO_CMPLO_CGEN->SetBackgroundColour(*wxGREEN);
diff --git a/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h b/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h
index dc0aa08..9ae273a 100644
--- a/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h
+++ b/src/lms7002_wxgui/lms7002_pnlCLKGEN_view.h
@@ -24,6 +24,8 @@ class lms7002_pnlCLKGEN_view : public pnlCLKGEN_view
         void OnbtnReadComparators(wxCommandEvent& event);
         void OnbtnUpdateCoarse(wxCommandEvent& event);
         void OnShowVCOclicked(wxCommandEvent& event);
+
+        wxComboBox *cmbCMPLO_CTRL;
 	public:
         void onbtnCalculateClick(wxCommandEvent& event);
 		/** Constructor */
diff --git a/src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp b/src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp
index 3c6f8f9..661270e 100644
--- a/src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlLimeLightPAD_view.cpp
@@ -159,5 +159,24 @@ void lms7002_pnlLimeLightPAD_view::onbtnReadVerRevMask( wxCommandEvent& event )
 
 void lms7002_pnlLimeLightPAD_view::UpdateGUI()
 {
+    wxArrayString padStrenghts;
+    uint16_t value = 0;
+    LMS_ReadParam(lmsControl, LMS7_MASK, &value);
+    if(value == 0)
+    {
+        padStrenghts.push_back("4 mA");
+        padStrenghts.push_back("8 mA");
+    }
+    else
+    {
+        padStrenghts.push_back("8 mA");
+        padStrenghts.push_back("12 mA");
+    }
+    wxRadioBox* padStrenghtCtrl[] = {rgrSDA_DS, rgrSCL_DS, rgrSDIO_DS, rgrDIQ2_DS, rgrDIQ1_DS};
+    for(auto i : padStrenghtCtrl)
+    {
+        i->SetString(0, padStrenghts[0]);
+        i->SetString(1, padStrenghts[1]);
+    }
     LMS7002_WXGUI::UpdateControlsByMap(this, lmsControl, wndId2Enum);
 }
diff --git a/src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp b/src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp
index 7933850..aebd60d 100644
--- a/src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlMCU_BD_view.cpp
@@ -68,7 +68,7 @@ int lms7002_pnlMCU_BD_view::GetProgramCode(const char* inFileName, bool bin)
 {
     unsigned char ch=0x00;
     bool find_byte=false;
-    int i=0;
+    size_t i=0;
 
     if(!bin)
     {
@@ -104,7 +104,7 @@ int lms7002_pnlMCU_BD_view::GetProgramCode(const char* inFileName, bool bin)
             return -1;
         mLoadedProgramFilename = inFileName;
         memset(byte_array, 0, max_array_size);
-        for (int i = 0; i<max_array_size && !fin.eof(); ++i)
+        for (size_t i = 0; i<max_array_size && !fin.eof(); ++i)
         {
             inByte = 0;
             fin.read(&inByte, 1);
@@ -210,6 +210,8 @@ void lms7002_pnlMCU_BD_view::OnbtnStartProgrammingClick( wxCommandEvent& event )
                 target = LMS_TARGET_RAM;
             else if (mode0 == 1 && mode1 == 1)
                 target = LMS_TARGET_BOOT;
+            else
+                target = LMS_TARGET_FLASH;
 
             retval = LMS_ProgramLMSMCU(pthis->lmsControl, (const char*)pthis->byte_array, max_array_size, target, OnProgrammingCallback);
         }
diff --git a/src/lms7002_wxgui/lms7002_pnlR3.cpp b/src/lms7002_wxgui/lms7002_pnlR3.cpp
new file mode 100644
index 0000000..7115208
--- /dev/null
+++ b/src/lms7002_wxgui/lms7002_pnlR3.cpp
@@ -0,0 +1,862 @@
+#include "lms7002_pnlR3.h"
+
+#include <wx/wx.h>
+#include <wx/stattext.h>
+#include "LMS7002M_parameters.h"
+#include "lms7002_gui_utilities.h"
+
+#include <vector>
+
+lms7002_pnlR3_view::lms7002_pnlR3_view( wxWindow* parent ) :
+    wxPanel( parent)
+{
+
+}
+
+lms7002_pnlR3_view::lms7002_pnlR3_view(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) :
+    wxPanel( parent, id, pos, size, style )
+{
+    lmsControl = nullptr;
+    wxFlexGridSizer* mainSizer;
+	mainSizer = new wxFlexGridSizer( 0, 1, 5, 5 );
+    {
+        wxFlexGridSizer* rowGroup = new wxFlexGridSizer(0, 4, 5, 5);
+        { //LimeLight controls
+            wxStaticBoxSizer* limeLight = new wxStaticBoxSizer(wxVERTICAL, this, wxT("LimeLight"));
+            const wxString delays[] = {_("No delay"), _("1x delay"), _("2x delay"), _("3x delay")};
+            const wxArrayString delaysArray(sizeof(delays) / sizeof(wxString), delays);
+
+            wxFlexGridSizer* lmlDelaysSizer = new wxFlexGridSizer(0, 4, 0, 0);
+            lmlDelaysSizer->Add(new wxStaticText(limeLight->GetStaticBox(), wxID_ANY, wxT("FCLK1_DLY:")), 0, wxALIGN_CENTER_VERTICAL, 5);
+            cmbFCLK1_DLY = new wxComboBox(limeLight->GetStaticBox(), wxID_ANY, wxT("No Delay"));
+            cmbFCLK1_DLY->Append(delaysArray);
+            lmlDelaysSizer->Add(cmbFCLK1_DLY, 1, wxLEFT, 5);
+
+            lmlDelaysSizer->Add(new wxStaticText(limeLight->GetStaticBox(), wxID_ANY, wxT("FCLK2_DLY:")), 0, wxALIGN_CENTER_VERTICAL, 5);
+            cmbFCLK2_DLY = new wxComboBox(limeLight->GetStaticBox(), wxID_ANY, wxT("No Delay"));
+            cmbFCLK2_DLY->Append(delaysArray);
+            lmlDelaysSizer->Add(cmbFCLK2_DLY, 1, wxLEFT, 5);
+
+            lmlDelaysSizer->Add(new wxStaticText(limeLight->GetStaticBox(), wxID_ANY, wxT("MCLK1_DLY:")), 0, wxALIGN_CENTER_VERTICAL, 5);
+            cmbMCLK1_DLY = new wxComboBox(limeLight->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+            cmbMCLK1_DLY->Append(delaysArray);
+            lmlDelaysSizer->Add(cmbMCLK1_DLY, 1, wxLEFT, 5);
+
+            lmlDelaysSizer->Add(new wxStaticText(limeLight->GetStaticBox(), wxID_ANY, wxT("MCLK2_DLY:")), 0, wxALIGN_CENTER_VERTICAL, 5);
+            cmbMCLK2_DLY = new wxComboBox(limeLight->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+            cmbMCLK2_DLY->Append(delaysArray);
+            lmlDelaysSizer->Add(cmbMCLK2_DLY, 1, wxLEFT, 5);
+
+            limeLight->Add(lmlDelaysSizer, 1, 0, 5);
+
+            cmbFCLK1_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            cmbFCLK2_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            cmbMCLK1_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            cmbMCLK2_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+
+            wxFlexGridSizer* lmlCheckboxes = new wxFlexGridSizer(0, 2, 0, 0);
+            chkMCLK1_INV = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("MCLK1 Invert"));
+            chkMCLK2_INV = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("MCLK2 invert"));
+            chkLML1_TRXIQPULSE = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("LML1_TRXIQPULSE mode"));
+            chkLML2_TRXIQPULSE = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("LML2_TRXIQPULSE mode"));
+            chkLML1_SISODDR = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("LML1_SISODDR mode"));
+            chkLML2_SISODDR = new wxCheckBox(limeLight->GetStaticBox(), wxID_ANY, wxT("LML2_SISODDR mode"));
+            wxWindow* items[] = {chkMCLK1_INV, chkMCLK2_INV, chkLML1_TRXIQPULSE, chkLML2_TRXIQPULSE, chkLML1_SISODDR, chkLML2_SISODDR};
+            for(auto i : items)
+            {
+                i->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+                lmlCheckboxes->Add(i, 0, wxEXPAND, 5);
+            }
+            limeLight->Add(lmlCheckboxes, 0, 0, 5);
+            rowGroup->Add(limeLight, 1, 0, 5);
+        }
+        {
+            wxStaticBoxSizer* sbSizer140;
+            sbSizer140 = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, wxT("TRX_GAIN")), wxVERTICAL);
+
+            chkTRX_GAIN_SRC = new wxCheckBox(sbSizer140->GetStaticBox(), wxID_ANY, wxT("Alternative TRX gain source"), wxDefaultPosition, wxDefaultSize, 0);
+            sbSizer140->Add(chkTRX_GAIN_SRC, 0, wxLEFT, 5);
+
+            wxFlexGridSizer* fgSizer256;
+            fgSizer256 = new wxFlexGridSizer(0, 2, 0, 0);
+            fgSizer256->SetFlexibleDirection(wxBOTH);
+            fgSizer256->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+            wxStaticBoxSizer* sbSizer137;
+            sbSizer137 = new wxStaticBoxSizer(new wxStaticBox(sbSizer140->GetStaticBox(), wxID_ANY, wxT("TBB")), wxVERTICAL);
+
+            wxFlexGridSizer* fgSizer254;
+            fgSizer254 = new wxFlexGridSizer(0, 2, 0, 0);
+            fgSizer254->AddGrowableCol(1);
+            fgSizer254->SetFlexibleDirection(wxBOTH);
+            fgSizer254->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+            fgSizer254->Add(new wxStaticText(sbSizer137->GetStaticBox(), wxID_ANY, wxT("CG_IAMP:")), 0, 0, 5);
+
+            spinCG_IAMP_TBB = new NumericSlider(sbSizer137->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 63, 0);
+            fgSizer254->Add(spinCG_IAMP_TBB, 0, wxEXPAND, 5);
+
+            fgSizer254->Add(new wxStaticText(sbSizer137->GetStaticBox(), wxID_ANY, wxT("LOSS_LIN_TXPAD")), 0, 0, 5);
+
+            spinLOSS_LIN_TXPAD_TRF = new NumericSlider(sbSizer137->GetStaticBox(), wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0);
+            fgSizer254->Add(spinLOSS_LIN_TXPAD_TRF, 0, wxEXPAND, 5);
+
+            fgSizer254->Add(new wxStaticText(sbSizer137->GetStaticBox(), wxID_ANY, wxT("LOSS_MAIN_TXPAD")), 0, 0, 5);
+
+            spinLOSS_MAIN_TXPAD_TRF = new NumericSlider(sbSizer137->GetStaticBox(), wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0);
+            fgSizer254->Add(spinLOSS_MAIN_TXPAD_TRF, 0, wxEXPAND, 5);
+
+
+            sbSizer137->Add(fgSizer254, 1, wxEXPAND, 5);
+
+            chkR5_LPF_BYP_TBB = new wxCheckBox(sbSizer137->GetStaticBox(), wxID_ANY, wxT("Bypass LPFS5 low pass real-pole filter capacitor banks"), wxDefaultPosition, wxDefaultSize, 0);
+            chkR5_LPF_BYP_TBB->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sbSizer137->Add(chkR5_LPF_BYP_TBB, 0, 0, 5);
+
+
+            fgSizer256->Add(sbSizer137, 1, 0, 5);
+
+
+            wxStaticBoxSizer* sbSizer138;
+            sbSizer138 = new wxStaticBoxSizer(new wxStaticBox(sbSizer140->GetStaticBox(), wxID_ANY, wxT("RX")), wxVERTICAL);
+
+            wxFlexGridSizer* fgSizer255;
+            fgSizer255 = new wxFlexGridSizer(0, 2, 0, 0);
+            fgSizer255->SetFlexibleDirection(wxBOTH);
+            fgSizer255->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
+
+            fgSizer255->Add(new wxStaticText(sbSizer138->GetStaticBox(), wxID_ANY, wxT("C_CTL_PGA_RBB")), 0, wxALIGN_CENTER_VERTICAL, 5);
+
+            spinC_CTL_PGA_RBB = new NumericSlider(sbSizer138->GetStaticBox(), wxID_ANY, wxT("2"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 4, 2);
+            fgSizer255->Add(spinC_CTL_PGA_RBB, 0, 0, 5);
+
+            {
+                fgSizer255->Add(new wxStaticText(sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_PGA_RBB")), 0, wxALIGN_CENTER_VERTICAL, 5);
+                cmbG_PGA_RBB = new wxComboBox(sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+                wxArrayString temp;
+                for(int i = 0; i < 32; ++i)
+                    temp.push_back(wxString::Format(_("%i dB"), -12 + i));
+                cmbG_PGA_RBB->Append(temp);
+                fgSizer255->Add(cmbG_PGA_RBB, 0, wxEXPAND, 5);
+            }
+        {
+            fgSizer255->Add(new wxStaticText(sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_LNA")), 0, wxALIGN_CENTER_VERTICAL, 5);
+            cmbG_LNA_RFE = new wxComboBox(sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+            const wxString items[] =
+            {_("Gmax-30")
+            , _("Gmax-27")
+            , _("Gmax-24")
+            , _("Gmax-21")
+            , _("Gmax-18")
+            , _("Gmax-15")
+            , _("Gmax-12")
+            , _("Gmax-9")
+            , _("Gmax-6")
+            , _("Gmax-5")
+            , _("Gmax-4")
+            , _("Gmax-3")
+            , _("Gmax-2")
+            , _("Gmax-1")
+            , _("Gmax")};
+            cmbG_LNA_RFE->Append(wxArrayString(sizeof(items) / sizeof(wxString), items));
+            fgSizer255->Add(cmbG_LNA_RFE, 0, wxEXPAND, 5);
+        }
+
+        {
+            fgSizer255->Add(new wxStaticText(sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_TIA")), 0, wxALIGN_CENTER_VERTICAL, 5);
+            cmbG_TIA_RFE = new wxComboBox(sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+            const wxString items[] =
+            {_("Gmax-12")
+            , _("Gmax-3")
+            , _("Gmax")};
+            cmbG_TIA_RFE->Append(wxArrayString(sizeof(items) / sizeof(wxString), items));
+            fgSizer255->Add(cmbG_TIA_RFE, 0, wxEXPAND, 5);
+        }
+
+        sbSizer138->Add(fgSizer255, 1, wxEXPAND, 5);
+
+
+        fgSizer256->Add(sbSizer138, 1, wxEXPAND, 5);
+
+
+        sbSizer140->Add(fgSizer256, 1, wxEXPAND, 5);
+
+
+        rowGroup->Add(sbSizer140, 1, wxEXPAND, 5);
+        }
+        mainSizer->Add(rowGroup, 1, wxEXPAND, 5);
+    }
+
+    {
+        wxStaticBoxSizer* dcCalibGroup = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("DC calibration"));
+        wxWindow* panel = dcCalibGroup->GetStaticBox();
+        {
+            wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 1, 0, 5);
+            std::vector<const LMS7Parameter*> params = {
+                &LMS7_PD_DCDAC_RXB,
+                &LMS7_PD_DCDAC_RXA,
+                &LMS7_PD_DCDAC_TXB,
+                &LMS7_PD_DCDAC_TXA,
+                &LMS7_PD_DCCMP_RXB,
+                &LMS7_PD_DCCMP_RXA,
+                &LMS7_PD_DCCMP_TXB,
+                &LMS7_PD_DCCMP_TXA
+            };
+            int row = 0;
+            for(auto i : params)
+            {
+                sizer->AddGrowableRow(row++);
+                wxCheckBox* chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), i->name);
+                chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+                sizer->Add(chkbox, 1, wxEXPAND, 5);
+                wndId2Enum[chkbox] = *i;
+            }
+            dcCalibGroup->Add(sizer, 0, wxEXPAND, 5);
+        }
+        {
+            wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 3, 0, 0);
+            std::vector<const LMS7Parameter*> params = {
+                &LMS7_DCWR_RXBQ, &LMS7_DCRD_RXBQ, &LMS7_DC_RXBQ,
+                &LMS7_DCWR_RXBI, &LMS7_DCRD_RXBI, &LMS7_DC_RXBI,
+                &LMS7_DCWR_RXAQ, &LMS7_DCRD_RXAQ, &LMS7_DC_RXAQ,
+                &LMS7_DCWR_RXAI, &LMS7_DCRD_RXAI, &LMS7_DC_RXAI,
+                &LMS7_DCWR_TXBQ, &LMS7_DCRD_TXBQ, &LMS7_DC_TXBQ,
+                &LMS7_DCWR_TXBI, &LMS7_DCRD_TXBI, &LMS7_DC_TXBI,
+                &LMS7_DCWR_TXAQ, &LMS7_DCRD_TXAQ, &LMS7_DC_TXAQ,
+                &LMS7_DCWR_TXAI, &LMS7_DCRD_TXAI, &LMS7_DC_TXAI
+            };
+            for(size_t i = 0; i<params.size(); i += 3)
+            {
+                wxCheckBox* chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), params[i]->name);
+                chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+                sizer->Add(chkbox, 1, wxEXPAND, 5);
+                wndId2Enum[chkbox] = *params[i];
+                chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), params[i + 1]->name);
+                chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnReadDC), NULL, this);
+                sizer->Add(chkbox, 1, wxEXPAND, 5);
+                wndId2Enum[chkbox] = *params[i + 1];
+                NumericSlider* slider = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, -1023, 1023, 0);
+                cmbDCControls.push_back(slider);
+                slider->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::OnWriteDC), NULL, this);
+                sizer->Add(slider, 1, wxEXPAND, 5);
+                wndId2Enum[slider] = *params[i + 2];
+            }
+            dcCalibGroup->Add(sizer, 0, 0, 5);
+        }
+        {
+            const std::vector<wxString> names = {_("RXBQ"), _("RXBI"), _("RXAQ"), _("RXAI"), _("TXBQ"), _("TXBI"), _("TXAQ"), _("TXAI")};
+            wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 5, 0, 5);
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("Name:")), 1, wxEXPAND, 0);
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("START:")), 1, wxEXPAND, 0);
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("CMP invert:")), 1, wxEXPAND, 0);
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("CMP:")), 1, wxEXPAND, 0);
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("Status:")), 1, wxEXPAND, 0);
+            for(size_t i = 0; i<names.size(); ++i)
+            {
+                sizer->AddGrowableRow(i);
+                wxCheckBox* chkbox;
+                sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, names[i]), 1, wxEXPAND, 0);
+
+                chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString);
+                chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnDCCMPCFGChanged), NULL, this);
+                wndId2Enum[chkbox] = LMS7_DCCAL_START;
+                sizer->Add(chkbox, 0, wxALIGN_CENTER_HORIZONTAL, 0);
+                dccal_start[i] = chkbox;
+
+                chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString);
+                chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnDCCMPCFGChanged), NULL, this);
+                wndId2Enum[chkbox] = LMS7_DCCAL_CMPCFG;
+                sizer->Add(chkbox, 0, wxALIGN_CENTER_HORIZONTAL, 0);
+                dccal_cmpcfg[i] = chkbox;
+
+                dccal_cmpstatuses[i] = new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("0"));
+                sizer->Add(dccal_cmpstatuses[i], 1, wxEXPAND, 0);
+                dccal_statuses[i] = new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("Not running"));
+                sizer->Add(dccal_statuses[i], 1, wxEXPAND, 0);
+            }
+            for(int i = 0; i < 4; ++i)
+                sizer->Add(new wxFlexGridSizer(0, 0, 0, 0));
+            wxButton* btnUpdateCMP = new wxButton(panel, wxNewId(), _("Read"));
+            btnUpdateCMP->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnReadDCCMP), NULL, this);
+            sizer->Add(btnUpdateCMP);
+            dcCalibGroup->Add(sizer, 0, 0, 5);
+        }
+        {
+            wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 2, 0, 5);
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("DC_RXCDIV")), 1, wxEXPAND, 0);
+            NumericSlider* ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
+            ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(ctrl, 1, wxEXPAND, 5);
+            wndId2Enum[ctrl] = LMS7_DC_RXCDIV;
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("DC_TXCDIV")), 1, wxEXPAND, 0);
+            ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
+            ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(ctrl, 1, wxEXPAND, 5);
+            wndId2Enum[ctrl] = LMS7_DC_TXCDIV;
+
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("HYSCMP_RXB")), 1, wxEXPAND, 0);
+            ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+            ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(ctrl, 1, wxEXPAND, 5);
+            wndId2Enum[ctrl] = LMS7_HYSCMP_RXB;
+
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("HYSCMP_RXA")), 1, wxEXPAND, 0);
+            ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+            ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(ctrl, 1, wxEXPAND, 5);
+            wndId2Enum[ctrl] = LMS7_HYSCMP_RXA;
+
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("HYSCMP_TXB")), 1, wxEXPAND, 0);
+            ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+            ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(ctrl, 1, wxEXPAND, 5);
+            wndId2Enum[ctrl] = LMS7_HYSCMP_TXB;
+
+            sizer->Add(new wxStaticText(dcCalibGroup->GetStaticBox(), wxID_ANY, _("HYSCMP_TXA")), 1, wxEXPAND, 0);
+            ctrl = new NumericSlider(dcCalibGroup->GetStaticBox(), wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+            ctrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(ctrl, 1, wxEXPAND, 5);
+            wndId2Enum[ctrl] = LMS7_HYSCMP_TXA;
+            dcCalibGroup->Add(sizer, 0, wxLEFT, 5);
+
+            wxCheckBox* chkbox = new wxCheckBox(dcCalibGroup->GetStaticBox(), wxNewId(), "Automatic DC calibration mode");
+            chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            wndId2Enum[chkbox] = LMS7_DCMODE;
+            sizer->Add(chkbox, 0, wxALIGN_CENTER_HORIZONTAL, 0);
+        }
+        mainSizer->Add(dcCalibGroup, 1, wxEXPAND, 5);
+    }
+    {
+        wxFlexGridSizer* rowGroup = new wxFlexGridSizer(0, 4, 0, 5);
+        {
+            wxFlexGridSizer* rowGroupTSP = new wxFlexGridSizer(0, 1, 0, 0);
+            {
+                wxStaticBoxSizer* sbSizer139 = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("LDO"));
+                sbSizer139->Add(new wxStaticText(sbSizer139->GetStaticBox(), wxID_ANY, wxT("ISINK_SPI_BUFF")), 0, wxALIGN_CENTER_VERTICAL, 5);
+                cmbISINK_SPIBUFF = new wxComboBox(sbSizer139->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+                cmbISINK_SPIBUFF->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+
+                sbSizer139->Add(cmbISINK_SPIBUFF, 0, wxLEFT, 5);
+                const wxString items[] = {_("Off"), _("10 kOhm"), _("2.5 kOhm"), _("2 kOhm"), _("625 Ohm"), _("588 Ohm"), _("500 Ohm"), _("476 Ohm")};
+                cmbISINK_SPIBUFF->Append(wxArrayString(sizeof(items) / sizeof(wxString), items));
+                rowGroupTSP->Add(sbSizer139, 1, 0, 5);
+            }
+            {
+                wxStaticBoxSizer* txtspSizer = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("TxTSP"));
+                txtspSizer->Add(new wxStaticText(txtspSizer->GetStaticBox(), wxID_ANY, wxT("CMIX_GAIN:")), 0, wxALIGN_CENTER_VERTICAL);
+                cmbCMIX_GAIN_TXTSP = new wxComboBox(txtspSizer->GetStaticBox(), wxID_ANY);
+                cmbCMIX_GAIN_TXTSP->Append(_("0 dB"));
+                cmbCMIX_GAIN_TXTSP->Append(_("+6 dB"));
+                cmbCMIX_GAIN_TXTSP->Append(_("-6 dB"));
+                cmbCMIX_GAIN_TXTSP->Append(_("-6 dB"));
+                cmbCMIX_GAIN_TXTSP->Append(_("+3 dB"));
+                cmbCMIX_GAIN_TXTSP->Append(_("-3 dB"));
+                cmbCMIX_GAIN_TXTSP->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+                txtspSizer->Add(cmbCMIX_GAIN_TXTSP, 0, 0, 5);
+                rowGroupTSP->Add(txtspSizer, 0, 0, 5);
+            }
+
+            {
+                wxStaticBoxSizer* rxtspGroup = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("RxTSP"));
+                wxFlexGridSizer* rxtspSizer = new wxFlexGridSizer(0, 2, 0, 0);
+
+                wxCheckBox* chkbox = new wxCheckBox(rxtspGroup->GetStaticBox(), wxNewId(), _("DCLOOP_STOP"));
+                chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+                rxtspSizer->Add(chkbox);
+                wndId2Enum[chkbox] = LMS7_DCLOOP_STOP;
+
+                rxtspSizer->Add(new wxFlexGridSizer(0,1,0,0));
+
+                rxtspSizer->Add(new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("CMIX_GAIN:")), 0, wxALIGN_CENTER_VERTICAL);
+                cmbCMIX_GAIN_RXTSP = new wxComboBox(rxtspGroup->GetStaticBox(), wxID_ANY);
+                cmbCMIX_GAIN_RXTSP->Append(_("0 dB"));
+                cmbCMIX_GAIN_RXTSP->Append(_("+6 dB"));
+                cmbCMIX_GAIN_RXTSP->Append(_("-6 dB"));
+                cmbCMIX_GAIN_TXTSP->Append(_("-6 dB"));
+                cmbCMIX_GAIN_RXTSP->Append(_("+3 dB"));
+                cmbCMIX_GAIN_RXTSP->Append(_("-3 dB"));
+                cmbCMIX_GAIN_RXTSP->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+                rxtspSizer->Add(cmbCMIX_GAIN_RXTSP, 0, 0, 5);
+
+                rxtspSizer->Add(new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("HBD delay:")), 0, wxALIGN_CENTER_VERTICAL);
+                cmbHBD_DLY = new wxComboBox(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("No delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0);
+                cmbHBD_DLY->Append(wxT("No delay"));
+                cmbHBD_DLY->Append(wxT("Delay 1 clock cycle"));
+                cmbHBD_DLY->Append(wxT("Delay 2 clock cycles"));
+                cmbHBD_DLY->Append(wxT("Delay 3 clock cycles"));
+                cmbHBD_DLY->Append(wxT("Delay 4 clock cycles"));
+                cmbHBD_DLY->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+                rxtspSizer->Add(cmbHBD_DLY, 1, wxEXPAND, 5);
+                rxtspGroup->Add(rxtspSizer, 1, wxEXPAND, 5);
+
+                rxtspSizer->Add(new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("ADCI_o:")), 0, wxALIGN_CENTER_VERTICAL);
+                lblADCI_o = new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("???"));
+                rxtspSizer->Add(lblADCI_o, 0, wxALIGN_CENTER_VERTICAL);
+                rxtspSizer->Add(new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("ADCQ_o:")), 0, wxALIGN_CENTER_VERTICAL);
+                lblADCQ_o = new wxStaticText(rxtspGroup->GetStaticBox(), wxID_ANY, wxT("???"));
+                rxtspSizer->Add(lblADCQ_o, 0, wxALIGN_CENTER_VERTICAL);
+                btnReadADC = new wxButton(rxtspGroup->GetStaticBox(), wxNewId(), _("Read"));
+                rxtspSizer->Add(btnReadADC, 0, wxALIGN_CENTER_VERTICAL);
+                btnReadADC->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnReadADC), NULL, this);
+
+                chkbox = new wxCheckBox(rxtspGroup->GetStaticBox(), wxNewId(), _("CAPSEL_ADC"));
+                chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+                rxtspSizer->Add(chkbox);
+                wndId2Enum[chkbox] = LMS7_CAPSEL_ADC;
+
+                rowGroupTSP->Add(rxtspGroup, 1, wxEXPAND, 5);
+            }
+        rowGroup->Add(rowGroupTSP, 1, wxEXPAND, 5);
+        }
+
+        {
+            wxStaticBoxSizer* RSSIPDETGroup = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("RSSI, PDET, TEMP"));
+            wxWindow* panel = RSSIPDETGroup->GetStaticBox();
+
+            wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 2, 0, 5);
+
+            wxCheckBox* chkbox = new wxCheckBox(panel, wxNewId(), _("Power down modules"));
+            chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(chkbox);
+            wndId2Enum[chkbox] = LMS7_RSSI_PD;
+
+            chkbox = new wxCheckBox(panel, wxNewId(), _("Manual operation mode"));
+            chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(chkbox);
+            wndId2Enum[chkbox] = LMS7_RSSI_RSSIMODE;
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("DAC_CLKDIV")), 1, wxEXPAND, 0);
+            NumericSlider* spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
+            spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(spnCtrl);
+            wndId2Enum[spnCtrl] = LMS7_DAC_CLKDIV;
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("Reference bias current to test ADC")), 1, wxEXPAND, 0);
+            spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0);
+            spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(spnCtrl);
+            wndId2Enum[spnCtrl] = LMS7_RSSI_BIAS;
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("HYSCMP")), 1, wxEXPAND, 0);
+            spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+            spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(spnCtrl);
+            wndId2Enum[spnCtrl] = LMS7_RSSI_HYSCMP;
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("DAC_VAL")), 1, wxEXPAND, 0);
+            spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
+            spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+            sizer->Add(spnCtrl);
+            wndId2Enum[spnCtrl] = LMS7_RSSI_DAC_VAL;
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("PDET2_VAL")), 1, wxEXPAND, 0);
+            pdet_vals[1] = new wxStaticText(panel, wxID_ANY, _("????"));
+            sizer->Add(pdet_vals[1]);
+            wndId2Enum[pdet_vals[1]] = LMS7_RSSI_PDET2_VAL;
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("PDET1_VAL")), 1, wxEXPAND, 0);
+            pdet_vals[0] = new wxStaticText(panel, wxID_ANY, _("????"));
+            sizer->Add(pdet_vals[0]);
+            wndId2Enum[pdet_vals[0]] = LMS7_RSSI_PDET1_VAL;
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("RSSI2_VAL")), 1, wxEXPAND, 0);
+            rssi_vals[1] = new wxStaticText(panel, wxID_ANY, _("????"));
+            sizer->Add(rssi_vals[1]);
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("RSSI1_VAL")), 1, wxEXPAND, 0);
+            rssi_vals[0] = new wxStaticText(panel, wxID_ANY, _("????"));
+            sizer->Add(rssi_vals[0]);
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("TREF_VAL")), 1, wxEXPAND, 0);
+            tref_val = new wxStaticText(panel, wxID_ANY, _("????"));
+            sizer->Add(tref_val);
+
+            sizer->Add(new wxStaticText(panel, wxID_ANY, _("TVPTAT_VAL")), 1, wxEXPAND, 0);
+            tvptat_val = new wxStaticText(panel, wxID_ANY, _("????"));
+            sizer->Add(tvptat_val);
+
+            RSSIPDETGroup->Add(sizer);
+
+            wxFlexGridSizer* sizerCMP = new wxFlexGridSizer(0, 2, 0, 5);
+            const wxString cmpNames[] = {"Power Detector 1", "Power Detector 2", "RSSI 1", "RSSI 2", "Temperature VPTAT", "Temperature Reference"};
+            sizerCMP->Add( new wxStaticText(panel, wxID_ANY, _("Invert:")));
+            sizerCMP->Add(new wxStaticText(panel, wxID_ANY, _("CMP:")));
+
+            for(int i = 0; i < 6; ++i)
+            {
+                rssiCMPCFG[i] = new wxCheckBox(panel, wxNewId(), wxString::Format("%s", cmpNames[i]));
+                sizerCMP->Add(rssiCMPCFG[i]);
+                wndId2Enum[rssiCMPCFG[i]] = LMS7_RSSI_CMPCFG;
+                rssiCMPCFG[i]->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnRSSICMPCFGChanged), NULL, this);
+                rssiCMPSTATUS[i] = new wxStaticText(panel, wxNewId(), _("?"));
+                sizerCMP->Add(rssiCMPSTATUS[i]);
+            }
+            sizerCMP->Add(new wxFlexGridSizer(0, 0, 0, 0));
+            wxButton* btnUpdateRSSICMP = new wxButton(panel, wxNewId(), _("Read"));
+            btnUpdateRSSICMP->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::OnReadRSSICMP), NULL, this);
+            sizerCMP->Add(btnUpdateRSSICMP);
+            RSSIPDETGroup->Add(sizerCMP);
+
+            rowGroup->Add(RSSIPDETGroup);
+        }
+    {
+        wxStaticBoxSizer* RSSIGroup = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("RSSI DC Calibration"));
+        wxWindow* panel = RSSIGroup->GetStaticBox();
+
+        wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 2, 0, 5);
+
+        sizer->Add(new wxFlexGridSizer(0, 1, 0, 0), 0, 0, 0);
+
+        wxCheckBox* chkbox = new wxCheckBox(panel, wxNewId(), _("Power down modules"));
+        chkbox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+        sizer->Add(chkbox);
+        wndId2Enum[chkbox] = LMS7_RSSIDC_PD;
+
+        sizer->Add(new wxStaticText(panel, wxID_ANY, _("HYSCMP")), 1, wxEXPAND, 0);
+        NumericSlider* spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 7, 0);
+        spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandler), NULL, this);
+        sizer->Add(spnCtrl);
+        wndId2Enum[spnCtrl] = LMS7_RSSIDC_HYSCMP;
+
+        sizer->Add(new wxStaticText(panel, wxID_ANY, _("DCO2")), 1, wxEXPAND, 0);
+        spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 127, 0);
+        spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandlerCMPRead), NULL, this);
+        sizer->Add(spnCtrl);
+        wndId2Enum[spnCtrl] = LMS7_RSSIDC_DCO2;
+
+        sizer->Add(new wxStaticText(panel, wxID_ANY, _("DCO1")), 1, wxEXPAND, 0);
+        spnCtrl = new NumericSlider(panel, wxNewId(), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 127, 0);
+        spnCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandlerCMPRead), NULL, this);
+        sizer->Add(spnCtrl);
+        wndId2Enum[spnCtrl] = LMS7_RSSIDC_DCO1;
+
+        wxArrayString rselArray;
+        float value_mV = 800;
+        int i = 0;
+        for(; i < 4; ++i)
+        {
+            rselArray.push_back(wxString::Format("%.1f mV", value_mV));
+            value_mV -= 50;
+        }
+        for(; i < 12; ++i)
+        {
+            rselArray.push_back(wxString::Format("%.1f mV", value_mV));
+            value_mV -= 21.5;
+        }
+        for(; i <= 31; ++i)
+        {
+            rselArray.push_back(wxString::Format("%.1f mV", value_mV));
+            value_mV -= 10;
+        }
+        sizer->Add(new wxStaticText(panel, wxID_ANY, _("RSEL:")), 1, wxEXPAND, 0);
+        wxComboBox* cmbRSEL = new wxComboBox(panel, wxID_ANY);
+        cmbRSEL->Append(rselArray);
+        cmbRSEL->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlR3_view::ParameterChangeHandlerCMPRead), NULL, this);
+        sizer->Add(cmbRSEL);
+        wndId2Enum[cmbRSEL] = LMS7_RSSIDC_RSEL;
+
+        sizer->Add(new wxStaticText(panel, wxID_ANY, _("CMPSTATUS")), 1, wxEXPAND, 0);
+        rssidc_cmpstatus = new wxStaticText(panel, wxID_ANY, _("?"));
+        sizer->Add(rssidc_cmpstatus);
+
+        RSSIGroup->Add(sizer);
+        rowGroup->Add(RSSIGroup);
+    }
+    mainSizer->Add(rowGroup);
+    }
+
+
+
+	this->SetSizer( mainSizer );
+	this->Layout();
+	mainSizer->Fit( this );
+
+	// Connect Events
+	chkTRX_GAIN_SRC->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinCG_IAMP_TBB->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinCG_IAMP_TBB->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinLOSS_LIN_TXPAD_TRF->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinLOSS_LIN_TXPAD_TRF->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinLOSS_MAIN_TXPAD_TRF->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinLOSS_MAIN_TXPAD_TRF->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinC_CTL_PGA_RBB->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinC_CTL_PGA_RBB->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbG_PGA_RBB->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbG_LNA_RFE->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbG_TIA_RFE->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+
+	wndId2Enum[cmbFCLK1_DLY] = LMS7param(FCLK1_DLY);
+	wndId2Enum[cmbFCLK2_DLY] = LMS7param(FCLK2_DLY);
+	wndId2Enum[cmbMCLK1_DLY] = LMS7param(MCLK1_DLY);
+	wndId2Enum[cmbMCLK2_DLY] = LMS7param(MCLK2_DLY);
+	wndId2Enum[chkMCLK1_INV] = LMS7param(MCLK1_INV);
+	wndId2Enum[chkMCLK2_INV] = LMS7param(MCLK2_INV);
+	wndId2Enum[chkLML1_TRXIQPULSE] = LMS7param(LML1_TRXIQPULSE);
+	wndId2Enum[chkLML2_TRXIQPULSE] = LMS7param(LML2_TRXIQPULSE);
+	wndId2Enum[chkLML1_SISODDR] = LMS7param(LML1_SISODDR);
+	wndId2Enum[chkLML2_SISODDR] = LMS7param(LML2_SISODDR);
+	wndId2Enum[cmbHBD_DLY] = LMS7param(HBD_DLY);
+	wndId2Enum[cmbISINK_SPIBUFF] = LMS7param(ISINK_SPIBUFF);
+	wndId2Enum[chkTRX_GAIN_SRC] = LMS7param(TRX_GAIN_SRC);
+	wndId2Enum[spinCG_IAMP_TBB] = LMS7param(CG_IAMP_TBB_R3);
+	wndId2Enum[spinLOSS_LIN_TXPAD_TRF] = LMS7param(LOSS_LIN_TXPAD_R3);
+	wndId2Enum[spinLOSS_MAIN_TXPAD_TRF] = LMS7param(LOSS_MAIN_TXPAD_R3);
+	wndId2Enum[chkR5_LPF_BYP_TBB] = LMS7param(R5_LPF_BYP_TBB);
+	wndId2Enum[spinC_CTL_PGA_RBB] = LMS7param(C_CTL_PGA_RBB_R3);
+	wndId2Enum[cmbG_PGA_RBB] = LMS7param(G_PGA_RBB_R3);
+	wndId2Enum[cmbG_LNA_RFE] = LMS7param(G_LNA_RFE_R3);
+	wndId2Enum[cmbG_TIA_RFE] = LMS7param(G_TIA_RFE_R3);
+	wndId2Enum[cmbCMIX_GAIN_TXTSP] = LMS7param(CMIX_GAIN_TXTSP_R3);
+    wndId2Enum[cmbCMIX_GAIN_RXTSP] = LMS7param(CMIX_GAIN_RXTSP_R3);
+
+
+
+    LMS7002_WXGUI::UpdateTooltips(wndId2Enum, true);
+}
+
+lms7002_pnlR3_view::~lms7002_pnlR3_view()
+{
+    // Disconnect Events
+	cmbFCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbFCLK2_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbMCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbMCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	chkLML1_TRXIQPULSE->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	chkLML2_TRXIQPULSE->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	chkLML1_SISODDR->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	chkLML2_SISODDR->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbCMIX_GAIN_TXTSP->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	chkTRX_GAIN_SRC->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinCG_IAMP_TBB->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinCG_IAMP_TBB->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinLOSS_LIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinLOSS_LIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinLOSS_MAIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinLOSS_MAIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinC_CTL_PGA_RBB->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	spinC_CTL_PGA_RBB->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbG_PGA_RBB->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbG_LNA_RFE->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+	cmbG_TIA_RFE->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( lms7002_pnlR3_view::ParameterChangeHandler ), NULL, this );
+}
+
+void lms7002_pnlR3_view::Initialize(lms_device_t* pControl)
+{
+    lmsControl = pControl;
+}
+
+void lms7002_pnlR3_view::UpdateGUI()
+{
+    LMS7002_WXGUI::UpdateControlsByMap(this, lmsControl, wndId2Enum);
+
+    wxCommandEvent evt;
+    OnRSSICMPCFGChanged(evt);
+    OnReadRSSICMP(evt);
+    OnReadDCCMP(evt);
+    OnReadADC(evt);
+
+    for(size_t i = 0; i<cmbDCControls.size(); ++i)
+    {
+        uint16_t value = 0;
+        int16_t signedValue = 0;
+        LMS_ReadParam(lmsControl, wndId2Enum[cmbDCControls[i]], &value);
+        signedValue = value;
+        signedValue <<= 5;
+        signedValue >>= 5;
+        cmbDCControls[i]->SetValue(signedValue );
+    }
+
+    uint16_t value;
+    uint16_t rxtsp_cmix_gain = 0;
+    LMS_ReadParam(lmsControl, LMS7_CMIX_GAIN_RXTSP, &value);
+    rxtsp_cmix_gain |= value;
+    LMS_ReadParam(lmsControl, LMS7_CMIX_GAIN_RXTSP_R3, &value);
+    rxtsp_cmix_gain |= value << 2;
+    cmbCMIX_GAIN_RXTSP->SetSelection(rxtsp_cmix_gain);
+
+    uint16_t txtsp_cmix_gain = 0;
+    LMS_ReadParam(lmsControl, LMS7_CMIX_GAIN_TXTSP, &value);
+    txtsp_cmix_gain |= value;
+    LMS_ReadParam(lmsControl, LMS7_CMIX_GAIN_TXTSP_R3, &value);
+    txtsp_cmix_gain |= value << 2;
+    cmbCMIX_GAIN_TXTSP->SetSelection(txtsp_cmix_gain);
+}
+
+void lms7002_pnlR3_view::ParameterChangeHandler(wxCommandEvent& event)
+{
+    assert(lmsControl != nullptr);
+    LMS7Parameter parameter;
+    try
+    {
+        parameter = wndId2Enum.at(reinterpret_cast<wxWindow*>(event.GetEventObject()));
+        if(parameter.address == LMS7_CMIX_GAIN_RXTSP_R3.address || parameter.name == LMS7_CMIX_GAIN_RXTSP_R3.name)
+        {
+            uint16_t value = event.GetInt();
+            LMS_WriteParam(lmsControl, LMS7_CMIX_GAIN_RXTSP, value & 0x3);
+            LMS_WriteParam(lmsControl, LMS7_CMIX_GAIN_RXTSP_R3, value > 0x2);
+            return;
+        }
+        if(parameter.address == LMS7_CMIX_GAIN_TXTSP_R3.address || parameter.name == LMS7_CMIX_GAIN_TXTSP_R3.name)
+        {
+            uint16_t value = event.GetInt();
+            LMS_WriteParam(lmsControl, LMS7_CMIX_GAIN_TXTSP, value & 0x3);
+            LMS_WriteParam(lmsControl, LMS7_CMIX_GAIN_TXTSP_R3, value > 0x2);
+            return;
+        }
+    }
+    catch (std::exception & e)
+    {
+        std::cout << "Control element(ID = " << event.GetId() << ") don't have assigned LMS parameter." << std::endl;
+        return;
+    }
+    LMS_WriteParam(lmsControl,parameter,event.GetInt());
+}
+
+void lms7002_pnlR3_view::ParameterChangeHandler(wxSpinEvent& event)
+{
+    wxCommandEvent evt;
+    evt.SetInt(event.GetInt());
+    evt.SetId(event.GetId());
+    evt.SetEventObject(event.GetEventObject());
+    ParameterChangeHandler(evt);
+}
+
+void lms7002_pnlR3_view::OnReadADC( wxCommandEvent& event )
+{
+    //LMS_WriteParam(lmsControl, LMS7param(CAPSEL_ADC), 1);
+    LMS_WriteParam(lmsControl, LMS7param(CAPTURE), 0);
+    LMS_WriteParam(lmsControl, LMS7param(CAPTURE), 1);
+
+    uint16_t adci = 0;
+    LMS_ReadLMSReg(lmsControl, 0x040E, &adci);
+    uint16_t adcq = 0;
+    LMS_ReadLMSReg(lmsControl, 0x040F, &adcq);
+
+    lblADCI_o->SetLabel(wxString::Format("0x%04X", adci));
+    lblADCQ_o->SetLabel(wxString::Format("0x%04X", adcq));
+
+    //LMS_WriteParam(lmsControl, LMS7param(CAPSEL_ADC), 0);
+}
+
+void lms7002_pnlR3_view::OnDCCMPCFGChanged(wxCommandEvent& event)
+{
+    uint16_t value = 0;
+    for(int i = 0; i < 8; ++i)
+    {
+        value |= (dccal_cmpcfg[i]->GetValue() & 0x1) << i;
+    }
+    LMS_WriteParam(lmsControl, LMS7_DCCAL_CMPCFG, value);
+
+    value = 0;
+    for(int i = 0; i < 8; ++i)
+    {
+        value |= (dccal_start[i]->GetValue() & 0x1) << i;
+    }
+    LMS_WriteParam(lmsControl, LMS7_DCCAL_START, value);
+}
+
+void lms7002_pnlR3_view::OnRSSICMPCFGChanged(wxCommandEvent& event)
+{
+    uint16_t value = 0;
+    for(int i = 0; i < 5; ++i)
+    {
+        value |= (rssiCMPCFG[i]->GetValue() & 0x1) << i;
+    }
+    LMS_WriteParam(lmsControl, LMS7_RSSI_CMPCFG, value);
+}
+
+void lms7002_pnlR3_view::OnReadRSSICMP(wxCommandEvent& event)
+{
+    uint16_t value;
+    LMS_ReadParam(lmsControl, LMS7_RSSI_CMPSTATUS, &value);
+    for(int i = 0; i < 6; ++i)
+    {
+        rssiCMPSTATUS[i]->SetLabel(wxString::Format("%i", value & 0x1));
+        value >>= 1;
+    }
+    LMS_ReadParam(lmsControl,    LMS7_RSSI_RSSI1_VAL, &value);
+    rssi_vals[0]->SetLabel(wxString::Format("0x%04X", value));
+    LMS_ReadParam(lmsControl, LMS7_RSSI_RSSI2_VAL, &value);
+    rssi_vals[1]->SetLabel(wxString::Format("0x%04X", value));
+    LMS_ReadParam(lmsControl, LMS7_RSSI_TREF_VAL, &value);
+    tref_val->SetLabel(wxString::Format("0x%04X", value));
+    LMS_ReadParam(lmsControl, LMS7_RSSI_TVPTAT_VAL, &value);
+    tvptat_val->SetLabel(wxString::Format("0x%04X", value));
+
+    LMS_ReadParam(lmsControl, LMS7_RSSI_PDET1_VAL, &value);
+    pdet_vals[0]->SetLabel(wxString::Format("0x%04X", value));
+    LMS_ReadParam(lmsControl, LMS7_RSSI_PDET2_VAL, &value);
+    pdet_vals[1]->SetLabel(wxString::Format("0x%04X", value));
+
+    LMS_ReadParam(lmsControl, LMS7_RSSIDC_CMPSTATUS, &value);
+    rssidc_cmpstatus->SetLabel(wxString::Format("%i", value & 1));
+}
+
+void lms7002_pnlR3_view::OnReadDCCMP(wxCommandEvent& event)
+{
+    uint16_t value;
+    LMS_ReadParam(lmsControl, LMS7_DCCAL_CMPSTATUS, &value);
+    for(int i = 7; i >= 0; --i)
+    {
+        dccal_cmpstatuses[i]->SetLabel(wxString::Format("%i", value & 0x1));
+        value >>= 1;
+    }
+    LMS_ReadParam(lmsControl, LMS7_DCCAL_CALSTATUS, &value);
+    for(int i = 7; i >= 0; --i)
+    {
+        dccal_statuses[i]->SetLabel(wxString::Format("%s", (value & 0x1) ? "Running" : "Not running"));
+        value >>= 1;
+    }
+}
+
+void lms7002_pnlR3_view::OnWriteDC(wxCommandEvent& event)
+{
+    ParameterChangeHandler(event);
+    //toggle load flag
+    LMS7Parameter parameter;
+    try
+    {
+        parameter = wndId2Enum.at(reinterpret_cast<wxWindow*>(event.GetEventObject()));
+        uint16_t regVal;
+        LMS_ReadLMSReg(lmsControl, parameter.address, &regVal);
+        regVal &= ~0xC000;
+        LMS_WriteLMSReg(lmsControl, parameter.address, regVal);
+        LMS_WriteLMSReg(lmsControl, parameter.address, regVal | 0x8000);
+        LMS_WriteLMSReg(lmsControl, parameter.address, regVal);
+        return;
+    }
+    catch (std::exception & e)
+    {
+        std::cout << "Control element(ID = " << event.GetId() << ") don't have assigned LMS parameter." << std::endl;
+        return;
+    }
+}
+
+void lms7002_pnlR3_view::OnReadDC( wxCommandEvent& event )
+{
+    ParameterChangeHandler(event);
+    if(event.GetInt() != 0)
+    {
+         LMS7Parameter parameter;
+        try
+        {
+            parameter = wndId2Enum.at(reinterpret_cast<wxWindow*>(event.GetEventObject()));
+            uint16_t regVal;
+            LMS_ReadLMSReg(lmsControl, parameter.address, &regVal);
+        }
+        catch (std::exception & e)
+        {
+            std::cout << "Control element(ID = " << event.GetId() << ") don't have assigned LMS parameter." << std::endl;
+            return;
+        }
+        UpdateGUI();
+    }
+}
+
+void lms7002_pnlR3_view::ParameterChangeHandlerCMPRead( wxCommandEvent& event )
+{
+    ParameterChangeHandler(event);
+    uint16_t value = 0;
+    LMS_ReadParam(lmsControl, LMS7_RSSIDC_CMPSTATUS, &value);
+    rssidc_cmpstatus->SetLabel(wxString::Format("%i", value & 1));
+}
diff --git a/src/lms7002_wxgui/lms7002_pnlR3.h b/src/lms7002_wxgui/lms7002_pnlR3.h
new file mode 100644
index 0000000..1db7836
--- /dev/null
+++ b/src/lms7002_wxgui/lms7002_pnlR3.h
@@ -0,0 +1,83 @@
+#ifndef __lms7002_R3__
+#define __lms7002_R3__
+
+#include <wx/panel.h>
+#include <wx/checkbox.h>
+#include <wx/spinctrl.h>
+#include <wx/combobox.h>
+#include "numericSlider.h"
+
+#include <map>
+#include <vector>
+#include "lime/LimeSuite.h"
+namespace lime{
+
+}
+
+class lms7002_pnlR3_view : public wxPanel
+{
+    protected:
+		wxComboBox* cmbFCLK1_DLY;
+		wxComboBox* cmbFCLK2_DLY;
+		wxComboBox* cmbMCLK1_DLY;
+		wxComboBox* cmbMCLK2_DLY;
+		wxCheckBox* chkMCLK1_INV;
+		wxCheckBox* chkMCLK2_INV;
+		wxCheckBox* chkLML1_TRXIQPULSE;
+		wxCheckBox* chkLML2_TRXIQPULSE;
+		wxCheckBox* chkLML1_SISODDR;
+		wxCheckBox* chkLML2_SISODDR;
+		wxComboBox* cmbCMIX_GAIN_TXTSP;
+		wxComboBox* cmbCMIX_GAIN_RXTSP;
+		wxComboBox* cmbHBD_DLY;
+		wxComboBox* cmbISINK_SPIBUFF;
+		wxCheckBox* chkTRX_GAIN_SRC;
+		NumericSlider* spinCG_IAMP_TBB;
+		NumericSlider* spinLOSS_LIN_TXPAD_TRF;
+		NumericSlider* spinLOSS_MAIN_TXPAD_TRF;
+		wxCheckBox* chkR5_LPF_BYP_TBB;
+		NumericSlider* spinC_CTL_PGA_RBB;
+		wxComboBox* cmbG_PGA_RBB;
+		wxComboBox* cmbG_LNA_RFE;
+		wxComboBox* cmbG_TIA_RFE;
+		wxStaticText* lblADCI_o;
+		wxStaticText* lblADCQ_o;
+		wxButton* btnReadADC;
+		wxStaticText* dccal_statuses[8];
+		wxStaticText* dccal_cmpstatuses[8];
+		wxCheckBox* dccal_cmpcfg[8];
+		wxCheckBox* dccal_start[8];
+		wxStaticText* rssi_vals[2];
+		wxStaticText* pdet_vals[2];
+		wxStaticText* tref_val;
+		wxStaticText* tvptat_val;
+		wxStaticText* rssidc_cmpstatus;
+		std::vector<NumericSlider*> cmbDCControls;
+
+        wxStaticText* rssiCMPSTATUS[6];
+        wxCheckBox* rssiCMPCFG[6];
+
+		// Virtual event handlers, overide them in your derived class
+		void ParameterChangeHandler( wxSpinEvent& event );
+        void ParameterChangeHandler( wxCommandEvent& event );
+        void OnRSSICMPCFGChanged(wxCommandEvent& event);
+        void OnDCCMPCFGChanged(wxCommandEvent& event);
+        void OnReadRSSICMP(wxCommandEvent& event);
+        void OnReadDCCMP(wxCommandEvent& event);
+        void OnReadADC( wxCommandEvent& event );
+
+        void OnWriteDC( wxCommandEvent& event );
+        void OnReadDC( wxCommandEvent& event );
+        void ParameterChangeHandlerCMPRead( wxCommandEvent& event );
+    public:
+        lms7002_pnlR3_view( wxWindow* parent );
+        lms7002_pnlR3_view(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
+        ~lms7002_pnlR3_view();
+        void Initialize(lms_device_t* pControl);
+        void UpdateGUI();
+protected:
+    lms_device_t* lmsControl;
+    std::map<wxWindow*, LMS7Parameter> wndId2Enum;
+};
+
+#endif // __lms7002_pnlAFE_view__
diff --git a/src/lms7002_wxgui/lms7002_pnlRBB_view.cpp b/src/lms7002_wxgui/lms7002_pnlRBB_view.cpp
index 549d8d8..c5a7b4c 100644
--- a/src/lms7002_wxgui/lms7002_pnlRBB_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlRBB_view.cpp
@@ -55,7 +55,7 @@ lms7002_pnlRBB_view::lms7002_pnlRBB_view( wxWindow* parent, wxWindowID id, const
     cmbICT_PGA_IN_RBB->Set(temp);
     cmbICT_PGA_OUT_RBB->Set(temp);
     cmbRCC_CTL_PGA_RBB->Append(temp);
-    cmbR_CTL_LPF_RBB->Append(temp);
+    cmbR_CTL_LPF_RBB->Append(temp);    
 
     temp.clear();
     temp.push_back("LPFL_RBB");
diff --git a/src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp b/src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp
index f5ad314..75ebf2d 100644
--- a/src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlRxTSP_view.cpp
@@ -325,6 +325,7 @@ void lms7002_pnlRxTSP_view::OnbtnReadRSSI(wxCommandEvent& event)
     uint16_t value2 = 0;
     long valrez = 0;
     //Read RSSI
+    LMS_WriteParam(lmsControl,LMS7param(CAPSEL_ADC),0);
     LMS_WriteParam(lmsControl,LMS7param(CAPSEL),0);
     LMS_WriteParam(lmsControl,LMS7param(CAPTURE),0);
     LMS_WriteParam(lmsControl,LMS7param(CAPTURE),1);
diff --git a/src/lms7002_wxgui/lms7002_pnlSX_view.cpp b/src/lms7002_wxgui/lms7002_pnlSX_view.cpp
index 516375a..ec73404 100644
--- a/src/lms7002_wxgui/lms7002_pnlSX_view.cpp
+++ b/src/lms7002_wxgui/lms7002_pnlSX_view.cpp
@@ -14,6 +14,24 @@ using namespace lime;
 lms7002_pnlSX_view::lms7002_pnlSX_view( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
     : pnlSX_view(parent, id, pos, size, style), lmsControl(nullptr)
 {
+    sizerR3->Add(new wxStaticText(this, wxID_ANY, _("PLL LPF zero resistor:")), 1, wxEXPAND, 0);
+    cmbRZ_CTRL = new wxComboBox(this, wxID_ANY);
+    cmbRZ_CTRL->Append(_("Rzero = 20 kOhm"));
+    cmbRZ_CTRL->Append(_("Rzero = 8 kOhm"));
+    cmbRZ_CTRL->Append(_("Rzero = 4 kOhm"));
+    cmbRZ_CTRL->Append(_("LPF resistors are in bypass mode (<100 Ohm)"));
+    cmbRZ_CTRL->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlSX_view::ParameterChangeHandler), NULL, this);
+    wndId2Enum[cmbRZ_CTRL] = LMS7_RZ_CTRL;
+    sizerR3->Add(cmbRZ_CTRL);
+
+    sizerR3->Add(new wxStaticText(this, wxID_ANY, _("CMPLO_CTRL:")), 1, wxEXPAND, 0);
+    cmbCMPLO_CTRL = new wxComboBox(this, wxID_ANY);
+    cmbCMPLO_CTRL->Append(_("Low treshold is set to 0.18V"));
+    cmbCMPLO_CTRL->Append(_("Low treshold is set to 0.1V"));
+    cmbCMPLO_CTRL->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(lms7002_pnlSX_view::ParameterChangeHandler), NULL, this);
+    sizerR3->Add(cmbCMPLO_CTRL, 0, 0, 5);
+    wndId2Enum[cmbCMPLO_CTRL] = LMS7_CMPLO_CTRL_SX;
+
     //ids for updating from chip
     wndId2Enum[chkBYPLDO_VCO] = LMS7param(BYPLDO_VCO);
     wndId2Enum[cmbCP2_PLL] = LMS7param(CP2_PLL);
diff --git a/src/lms7002_wxgui/lms7002_pnlSX_view.h b/src/lms7002_wxgui/lms7002_pnlSX_view.h
index 3c8faf8..d7ec4d3 100644
--- a/src/lms7002_wxgui/lms7002_pnlSX_view.h
+++ b/src/lms7002_wxgui/lms7002_pnlSX_view.h
@@ -26,6 +26,9 @@ class lms7002_pnlSX_view : public pnlSX_view
 		void OnbtnCalculateClick( wxCommandEvent& event );
 		void OnbtnTuneClick( wxCommandEvent& event );
         void OnShowVCOclicked(wxCommandEvent& event);
+
+        wxComboBox* cmbRZ_CTRL;
+        wxComboBox* cmbCMPLO_CTRL;
 	public:
 		/** Constructor */
 		lms7002_pnlSX_view( wxWindow* parent );
diff --git a/src/lms7002_wxgui/lms7002_wxgui.cpp b/src/lms7002_wxgui/lms7002_wxgui.cpp
index 776d32b..00859c2 100644
--- a/src/lms7002_wxgui/lms7002_wxgui.cpp
+++ b/src/lms7002_wxgui/lms7002_wxgui.cpp
@@ -143,7 +143,7 @@ mainPanel::mainPanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, const
 	tabsNotebook->SetMinSize( wxSize( 1050,-1 ) );
 	
 	mTabCalibrations = new lms7002_pnlCalibrations_view( tabsNotebook, ID_TAB_CALIBRATIONS, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
-	tabsNotebook->AddPage( mTabCalibrations, wxT("Calibrations"), true );
+	tabsNotebook->AddPage( mTabCalibrations, wxT("Calibrations"), false );
 	mTabRFE = new lms7002_pnlRFE_view( tabsNotebook, ID_TAB_RFE, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
 	tabsNotebook->AddPage( mTabRFE, wxT("RFE"), false );
 	mTabRBB = new lms7002_pnlRBB_view( tabsNotebook, ID_TAB_RBB, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
@@ -3711,6 +3711,13 @@ pnlCLKGEN_view::pnlCLKGEN_view( wxWindow* parent, wxWindowID id, const wxPoint&
 	
 	fgSizer245->Add( sbSizer69, 1, wxALIGN_LEFT|wxALIGN_TOP|wxEXPAND, 5 );
 	
+	sizerR3 = new wxFlexGridSizer( 0, 2, 0, 0 );
+	sizerR3->SetFlexibleDirection( wxBOTH );
+	sizerR3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	
+	fgSizer245->Add( sizerR3, 1, wxEXPAND, 5 );
+	
 	
 	fgSizer244->Add( fgSizer245, 1, wxEXPAND, 5 );
 	
@@ -4306,6 +4313,13 @@ pnlSX_view::pnlSX_view( wxWindow* parent, wxWindowID id, const wxPoint& pos, con
 	
 	fgSizer103->Add( fgSizer193, 0, 0, 0 );
 	
+	sizerR3 = new wxFlexGridSizer( 0, 2, 0, 0 );
+	sizerR3->SetFlexibleDirection( wxBOTH );
+	sizerR3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	
+	fgSizer103->Add( sizerR3, 1, wxEXPAND, 5 );
+	
 	
 	fgSizer92->Add( fgSizer103, 1, wxALIGN_LEFT|wxALIGN_TOP, 5 );
 	
@@ -9337,3 +9351,325 @@ dlgVCOfrequencies::~dlgVCOfrequencies()
 	btnSaveFile->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( dlgVCOfrequencies::OnSaveFile ), NULL, this );
 	
 }
+
+pnlR3::pnlR3( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
+{
+	wxFlexGridSizer* fgSizer251;
+	fgSizer251 = new wxFlexGridSizer( 0, 2, 0, 0 );
+	fgSizer251->SetFlexibleDirection( wxBOTH );
+	fgSizer251->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	wxStaticBoxSizer* sbSizer132;
+	sbSizer132 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("LimeLight") ), wxVERTICAL );
+	
+	wxFlexGridSizer* fgSizer252;
+	fgSizer252 = new wxFlexGridSizer( 0, 2, 0, 0 );
+	fgSizer252->SetFlexibleDirection( wxBOTH );
+	fgSizer252->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	wxBoxSizer* bSizer3;
+	bSizer3 = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_staticText345 = new wxStaticText( sbSizer132->GetStaticBox(), wxID_ANY, wxT("FCLK1_DLY:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText345->Wrap( -1 );
+	bSizer3->Add( m_staticText345, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbFCLK1_DLY = new wxComboBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+	cmbFCLK1_DLY->Append( wxT("No Delay") );
+	cmbFCLK1_DLY->Append( wxT("No delay") );
+	cmbFCLK1_DLY->Append( wxT("2x delay") );
+	cmbFCLK1_DLY->Append( wxT("3x delay") );
+	cmbFCLK1_DLY->Append( wxT("1x delay") );
+	cmbFCLK1_DLY->SetSelection( 0 );
+	bSizer3->Add( cmbFCLK1_DLY, 1, wxLEFT, 5 );
+	
+	
+	fgSizer252->Add( bSizer3, 1, wxEXPAND, 5 );
+	
+	wxBoxSizer* bSizer31;
+	bSizer31 = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_staticText3451 = new wxStaticText( sbSizer132->GetStaticBox(), wxID_ANY, wxT("FCLK2_DLY:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText3451->Wrap( -1 );
+	bSizer31->Add( m_staticText3451, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbFCLK2_DLY = new wxComboBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+	cmbFCLK2_DLY->Append( wxT("No Delay") );
+	cmbFCLK2_DLY->Append( wxT("No delay") );
+	cmbFCLK2_DLY->Append( wxT("2x delay") );
+	cmbFCLK2_DLY->Append( wxT("3x delay") );
+	cmbFCLK2_DLY->Append( wxT("1x delay") );
+	cmbFCLK2_DLY->SetSelection( 0 );
+	bSizer31->Add( cmbFCLK2_DLY, 1, wxLEFT, 5 );
+	
+	
+	fgSizer252->Add( bSizer31, 1, wxEXPAND, 5 );
+	
+	wxBoxSizer* bSizer32;
+	bSizer32 = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_staticText3452 = new wxStaticText( sbSizer132->GetStaticBox(), wxID_ANY, wxT("MCLK1_DLY:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText3452->Wrap( -1 );
+	bSizer32->Add( m_staticText3452, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbMCLK1_DLY = new wxComboBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+	cmbMCLK1_DLY->Append( wxT("No Delay") );
+	cmbMCLK1_DLY->Append( wxT("No delay") );
+	cmbMCLK1_DLY->Append( wxT("2x delay") );
+	cmbMCLK1_DLY->Append( wxT("3x delay") );
+	cmbMCLK1_DLY->Append( wxT("1x delay") );
+	cmbMCLK1_DLY->SetSelection( 0 );
+	bSizer32->Add( cmbMCLK1_DLY, 0, wxLEFT, 5 );
+	
+	
+	fgSizer252->Add( bSizer32, 1, wxEXPAND, 5 );
+	
+	wxBoxSizer* bSizer321;
+	bSizer321 = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_staticText34521 = new wxStaticText( sbSizer132->GetStaticBox(), wxID_ANY, wxT("MCLK2_DLY:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText34521->Wrap( -1 );
+	bSizer321->Add( m_staticText34521, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbMCLK1_DLY1 = new wxComboBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("No Delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+	cmbMCLK1_DLY1->Append( wxT("No Delay") );
+	cmbMCLK1_DLY1->Append( wxT("No delay") );
+	cmbMCLK1_DLY1->Append( wxT("2x delay") );
+	cmbMCLK1_DLY1->Append( wxT("3x delay") );
+	cmbMCLK1_DLY1->Append( wxT("1x delay") );
+	cmbMCLK1_DLY1->SetSelection( 0 );
+	bSizer321->Add( cmbMCLK1_DLY1, 0, wxLEFT, 5 );
+	
+	
+	fgSizer252->Add( bSizer321, 1, wxEXPAND, 5 );
+	
+	chkMCLK1_INV = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("MCLK1 Invert"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer252->Add( chkMCLK1_INV, 0, 0, 5 );
+	
+	chkMCLK2_INV = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("MCLK2 invert"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer252->Add( chkMCLK2_INV, 0, 0, 5 );
+	
+	chkLML1_TRXIQPULSE = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("LML1_TRXIQPULSE mode"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer252->Add( chkLML1_TRXIQPULSE, 0, 0, 5 );
+	
+	chkLML2_TRXIQPULSE = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("LML2_TRXIQPULSE mode"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer252->Add( chkLML2_TRXIQPULSE, 0, 0, 5 );
+	
+	chkLML1_SISODDR = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("LML1_SISODDR mode"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer252->Add( chkLML1_SISODDR, 0, 0, 5 );
+	
+	chkLML2_SISODDR = new wxCheckBox( sbSizer132->GetStaticBox(), wxID_ANY, wxT("LML2_SISODDR mode"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer252->Add( chkLML2_SISODDR, 0, 0, 5 );
+	
+	
+	sbSizer132->Add( fgSizer252, 1, wxEXPAND, 5 );
+	
+	
+	fgSizer251->Add( sbSizer132, 1, wxEXPAND, 5 );
+	
+	wxStaticBoxSizer* sbSizer133;
+	sbSizer133 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("TxTSP") ), wxHORIZONTAL );
+	
+	m_staticText352 = new wxStaticText( sbSizer133->GetStaticBox(), wxID_ANY, wxT("CMIX_GAIN:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText352->Wrap( -1 );
+	sbSizer133->Add( m_staticText352, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_comboBox143 = new wxComboBox( sbSizer133->GetStaticBox(), wxID_ANY, wxT("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); 
+	sbSizer133->Add( m_comboBox143, 0, 0, 5 );
+	
+	
+	fgSizer251->Add( sbSizer133, 0, 0, 5 );
+	
+	wxStaticBoxSizer* sbSizer134;
+	sbSizer134 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("RxTSP") ), wxVERTICAL );
+	
+	wxBoxSizer* bSizer13;
+	bSizer13 = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_staticText353 = new wxStaticText( sbSizer134->GetStaticBox(), wxID_ANY, wxT("HBD delay"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText353->Wrap( -1 );
+	bSizer13->Add( m_staticText353, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbHBD_DLY = new wxComboBox( sbSizer134->GetStaticBox(), wxID_ANY, wxT("No delay"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+	cmbHBD_DLY->Append( wxT("No delay") );
+	cmbHBD_DLY->Append( wxT("Delay 1 clock cycle") );
+	cmbHBD_DLY->Append( wxT("Delay 2 clock cycles") );
+	cmbHBD_DLY->Append( wxT("Delay 3 clock cycles") );
+	cmbHBD_DLY->Append( wxT("Delay 4 clock cycles") );
+	cmbHBD_DLY->Append( wxT("Delay 2 clock cycle") );
+	cmbHBD_DLY->Append( wxT("Delay 2 clock cycle") );
+	cmbHBD_DLY->Append( wxT("delay 1 clock cycle") );
+	bSizer13->Add( cmbHBD_DLY, 0, 0, 5 );
+	
+	
+	sbSizer134->Add( bSizer13, 1, wxEXPAND, 5 );
+	
+	
+	fgSizer251->Add( sbSizer134, 1, wxEXPAND, 5 );
+	
+	wxStaticBoxSizer* sbSizer139;
+	sbSizer139 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("LDO") ), wxHORIZONTAL );
+	
+	m_staticText362 = new wxStaticText( sbSizer139->GetStaticBox(), wxID_ANY, wxT("ISINK_SPI_BUFF"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText362->Wrap( -1 );
+	sbSizer139->Add( m_staticText362, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbISINK_SPIBUFF = new wxComboBox( sbSizer139->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); 
+	sbSizer139->Add( cmbISINK_SPIBUFF, 0, wxLEFT, 5 );
+	
+	
+	fgSizer251->Add( sbSizer139, 1, 0, 5 );
+	
+	wxStaticBoxSizer* sbSizer140;
+	sbSizer140 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("TRX_GAIN") ), wxVERTICAL );
+	
+	chkTRX_GAIN_SRC = new wxCheckBox( sbSizer140->GetStaticBox(), wxID_ANY, wxT("Alternative TRX gain source"), wxDefaultPosition, wxDefaultSize, 0 );
+	sbSizer140->Add( chkTRX_GAIN_SRC, 0, wxLEFT, 5 );
+	
+	wxFlexGridSizer* fgSizer256;
+	fgSizer256 = new wxFlexGridSizer( 0, 2, 0, 0 );
+	fgSizer256->SetFlexibleDirection( wxBOTH );
+	fgSizer256->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	wxStaticBoxSizer* sbSizer137;
+	sbSizer137 = new wxStaticBoxSizer( new wxStaticBox( sbSizer140->GetStaticBox(), wxID_ANY, wxT("TBB") ), wxVERTICAL );
+	
+	wxFlexGridSizer* fgSizer254;
+	fgSizer254 = new wxFlexGridSizer( 0, 2, 0, 0 );
+	fgSizer254->AddGrowableCol( 1 );
+	fgSizer254->SetFlexibleDirection( wxBOTH );
+	fgSizer254->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	m_staticText355 = new wxStaticText( sbSizer137->GetStaticBox(), wxID_ANY, wxT("CG_IAMP:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText355->Wrap( -1 );
+	fgSizer254->Add( m_staticText355, 0, 0, 5 );
+	
+	spinCG_IAMP_TBB = new wxSpinCtrl( sbSizer137->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10, 0 );
+	fgSizer254->Add( spinCG_IAMP_TBB, 0, wxEXPAND, 5 );
+	
+	m_staticText356 = new wxStaticText( sbSizer137->GetStaticBox(), wxID_ANY, wxT("LOSS_LIN_TXPAD"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText356->Wrap( -1 );
+	fgSizer254->Add( m_staticText356, 0, 0, 5 );
+	
+	spinLOSS_LIN_TXPAD_TRF = new wxSpinCtrl( sbSizer137->GetStaticBox(), wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0 );
+	fgSizer254->Add( spinLOSS_LIN_TXPAD_TRF, 0, wxEXPAND, 5 );
+	
+	m_staticText357 = new wxStaticText( sbSizer137->GetStaticBox(), wxID_ANY, wxT("LOSS_MAIN_TXPAD"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText357->Wrap( -1 );
+	fgSizer254->Add( m_staticText357, 0, 0, 5 );
+	
+	spinLOSS_MAIN_TXPAD_TRF = new wxSpinCtrl( sbSizer137->GetStaticBox(), wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 31, 0 );
+	fgSizer254->Add( spinLOSS_MAIN_TXPAD_TRF, 0, wxEXPAND, 5 );
+	
+	
+	sbSizer137->Add( fgSizer254, 1, wxEXPAND, 5 );
+	
+	chkR5_LPF_BYP_TBB = new wxCheckBox( sbSizer137->GetStaticBox(), wxID_ANY, wxT("Bypass LPFS5 low pass real-pole filter capacitor banks"), wxDefaultPosition, wxDefaultSize, 0 );
+	sbSizer137->Add( chkR5_LPF_BYP_TBB, 0, 0, 5 );
+	
+	
+	fgSizer256->Add( sbSizer137, 1, 0, 5 );
+	
+	wxStaticBoxSizer* sbSizer138;
+	sbSizer138 = new wxStaticBoxSizer( new wxStaticBox( sbSizer140->GetStaticBox(), wxID_ANY, wxT("RX") ), wxVERTICAL );
+	
+	wxFlexGridSizer* fgSizer255;
+	fgSizer255 = new wxFlexGridSizer( 0, 2, 0, 0 );
+	fgSizer255->SetFlexibleDirection( wxBOTH );
+	fgSizer255->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	m_staticText358 = new wxStaticText( sbSizer138->GetStaticBox(), wxID_ANY, wxT("C_CTL_PGA_RBB"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText358->Wrap( -1 );
+	fgSizer255->Add( m_staticText358, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	spinC_CTL_PGA_RBB = new wxSpinCtrl( sbSizer138->GetStaticBox(), wxID_ANY, wxT("2"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 2 );
+	fgSizer255->Add( spinC_CTL_PGA_RBB, 0, 0, 5 );
+	
+	m_staticText359 = new wxStaticText( sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_PGA_RBB"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText359->Wrap( -1 );
+	fgSizer255->Add( m_staticText359, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbG_PGA_RBB = new wxComboBox( sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); 
+	fgSizer255->Add( cmbG_PGA_RBB, 0, wxEXPAND, 5 );
+	
+	m_staticText360 = new wxStaticText( sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_LNA"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText360->Wrap( -1 );
+	fgSizer255->Add( m_staticText360, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbG_LNA_RFE = new wxComboBox( sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); 
+	fgSizer255->Add( cmbG_LNA_RFE, 0, wxEXPAND, 5 );
+	
+	m_staticText361 = new wxStaticText( sbSizer138->GetStaticBox(), wxID_ANY, wxT("G_TIA"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText361->Wrap( -1 );
+	fgSizer255->Add( m_staticText361, 0, wxALIGN_CENTER_VERTICAL, 5 );
+	
+	cmbG_TIA_RFE = new wxComboBox( sbSizer138->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); 
+	fgSizer255->Add( cmbG_TIA_RFE, 0, wxEXPAND, 5 );
+	
+	
+	sbSizer138->Add( fgSizer255, 1, wxEXPAND, 5 );
+	
+	
+	fgSizer256->Add( sbSizer138, 1, wxEXPAND, 5 );
+	
+	
+	sbSizer140->Add( fgSizer256, 1, wxEXPAND, 5 );
+	
+	
+	fgSizer251->Add( sbSizer140, 1, wxEXPAND, 5 );
+	
+	
+	this->SetSizer( fgSizer251 );
+	this->Layout();
+	fgSizer251->Fit( this );
+	
+	// Connect Events
+	cmbFCLK1_DLY->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbFCLK2_DLY->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbMCLK1_DLY->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbMCLK1_DLY1->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkLML1_TRXIQPULSE->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkLML2_TRXIQPULSE->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkLML1_SISODDR->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkLML2_SISODDR->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	m_comboBox143->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkTRX_GAIN_SRC->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinCG_IAMP_TBB->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinCG_IAMP_TBB->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinLOSS_LIN_TXPAD_TRF->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinLOSS_LIN_TXPAD_TRF->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinLOSS_MAIN_TXPAD_TRF->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinLOSS_MAIN_TXPAD_TRF->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinC_CTL_PGA_RBB->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinC_CTL_PGA_RBB->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbG_PGA_RBB->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbG_LNA_RFE->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbG_TIA_RFE->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+}
+
+pnlR3::~pnlR3()
+{
+	// Disconnect Events
+	cmbFCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbFCLK2_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbMCLK1_DLY->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbMCLK1_DLY1->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkLML1_TRXIQPULSE->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkLML2_TRXIQPULSE->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkLML1_SISODDR->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkLML2_SISODDR->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	m_comboBox143->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	chkTRX_GAIN_SRC->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinCG_IAMP_TBB->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinCG_IAMP_TBB->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinLOSS_LIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinLOSS_LIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinLOSS_MAIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinLOSS_MAIN_TXPAD_TRF->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinC_CTL_PGA_RBB->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	spinC_CTL_PGA_RBB->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbG_PGA_RBB->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbG_LNA_RFE->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	cmbG_TIA_RFE->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( pnlR3::ParameterChangeHandler ), NULL, this );
+	
+}
diff --git a/src/lms7002_wxgui/lms7002_wxgui.fbp b/src/lms7002_wxgui/lms7002_wxgui.fbp
index 522620e..760d25f 100644
--- a/src/lms7002_wxgui/lms7002_wxgui.fbp
+++ b/src/lms7002_wxgui/lms7002_wxgui.fbp
@@ -1334,7 +1334,7 @@
                         <object class="notebookpage" expanded="0">
                             <property name="bitmap"></property>
                             <property name="label">Calibrations</property>
-                            <property name="select">1</property>
+                            <property name="select">0</property>
                             <object class="wxPanel" expanded="0">
                                 <property name="BottomDockable">1</property>
                                 <property name="LeftDockable">1</property>
@@ -35708,7 +35708,7 @@
                 </object>
             </object>
         </object>
-        <object class="Panel" expanded="0">
+        <object class="Panel" expanded="1">
             <property name="aui_managed">0</property>
             <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
             <property name="bg"></property>
@@ -35760,7 +35760,7 @@
             <event name="OnSetFocus"></event>
             <event name="OnSize"></event>
             <event name="OnUpdateUI"></event>
-            <object class="wxFlexGridSizer" expanded="0">
+            <object class="wxFlexGridSizer" expanded="1">
                 <property name="cols">3</property>
                 <property name="flexible_direction">wxBOTH</property>
                 <property name="growablecols"></property>
@@ -42123,6 +42123,24 @@
                                 </object>
                             </object>
                         </object>
+                        <object class="sizeritem" expanded="1">
+                            <property name="border">5</property>
+                            <property name="flag">wxEXPAND</property>
+                            <property name="proportion">1</property>
+                            <object class="wxFlexGridSizer" expanded="1">
+                                <property name="cols">2</property>
+                                <property name="flexible_direction">wxBOTH</property>
+                                <property name="growablecols"></property>
+                                <property name="growablerows"></property>
+                                <property name="hgap">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="name">sizerR3</property>
+                                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                                <property name="permission">protected</property>
+                                <property name="rows">0</property>
+                                <property name="vgap">0</property>
+                            </object>
+                        </object>
                     </object>
                 </object>
             </object>
@@ -48738,6 +48756,24 @@
                                 </object>
                             </object>
                         </object>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag">wxEXPAND</property>
+                            <property name="proportion">1</property>
+                            <object class="wxFlexGridSizer" expanded="0">
+                                <property name="cols">2</property>
+                                <property name="flexible_direction">wxBOTH</property>
+                                <property name="growablecols"></property>
+                                <property name="growablerows"></property>
+                                <property name="hgap">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="name">sizerR3</property>
+                                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                                <property name="permission">protected</property>
+                                <property name="rows">0</property>
+                                <property name="vgap">0</property>
+                            </object>
+                        </object>
                     </object>
                 </object>
             </object>
@@ -91885,7 +91921,7 @@
                 </object>
             </object>
         </object>
-        <object class="Panel" expanded="1">
+        <object class="Panel" expanded="0">
             <property name="aui_managed">0</property>
             <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
             <property name="bg"></property>
@@ -91937,7 +91973,7 @@
             <event name="OnSetFocus"></event>
             <event name="OnSize"></event>
             <event name="OnUpdateUI"></event>
-            <object class="wxFlexGridSizer" expanded="1">
+            <object class="wxFlexGridSizer" expanded="0">
                 <property name="cols">3</property>
                 <property name="flexible_direction">wxBOTH</property>
                 <property name="growablecols">0,1</property>
@@ -94521,11 +94557,11 @@
                         </object>
                     </object>
                 </object>
-                <object class="sizeritem" expanded="1">
+                <object class="sizeritem" expanded="0">
                     <property name="border">5</property>
                     <property name="flag"></property>
                     <property name="proportion">0</property>
-                    <object class="wxStaticBoxSizer" expanded="1">
+                    <object class="wxStaticBoxSizer" expanded="0">
                         <property name="id">wxID_ANY</property>
                         <property name="label">Full calibration</property>
                         <property name="minimum_size"></property>
@@ -94621,7 +94657,7 @@
                                 <event name="OnUpdateUI"></event>
                             </object>
                         </object>
-                        <object class="sizeritem" expanded="1">
+                        <object class="sizeritem" expanded="0">
                             <property name="border">5</property>
                             <property name="flag">wxEXPAND</property>
                             <property name="proportion">1</property>
@@ -94979,11 +95015,11 @@
                                 </object>
                             </object>
                         </object>
-                        <object class="sizeritem" expanded="1">
+                        <object class="sizeritem" expanded="0">
                             <property name="border">5</property>
                             <property name="flag"></property>
                             <property name="proportion">0</property>
-                            <object class="wxFlexGridSizer" expanded="1">
+                            <object class="wxFlexGridSizer" expanded="0">
                                 <property name="cols">1</property>
                                 <property name="flexible_direction">wxVERTICAL</property>
                                 <property name="growablecols"></property>
@@ -94995,11 +95031,11 @@
                                 <property name="permission">none</property>
                                 <property name="rows">0</property>
                                 <property name="vgap">0</property>
-                                <object class="sizeritem" expanded="1">
+                                <object class="sizeritem" expanded="0">
                                     <property name="border">5</property>
                                     <property name="flag">wxALL</property>
                                     <property name="proportion">0</property>
-                                    <object class="wxRadioBox" expanded="1">
+                                    <object class="wxRadioBox" expanded="0">
                                         <property name="BottomDockable">1</property>
                                         <property name="LeftDockable">1</property>
                                         <property name="RightDockable">1</property>
@@ -97959,5 +97995,3424 @@
                 </object>
             </object>
         </object>
+        <object class="Panel" expanded="0">
+            <property name="aui_managed">0</property>
+            <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+            <property name="bg"></property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="enabled">1</property>
+            <property name="event_handler">decl_pure_virtual</property>
+            <property name="fg"></property>
+            <property name="font"></property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="maximum_size"></property>
+            <property name="minimum_size"></property>
+            <property name="name">pnlR3</property>
+            <property name="pos"></property>
+            <property name="size">-1,-1</property>
+            <property name="subclass"></property>
+            <property name="tooltip"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style">wxTAB_TRAVERSAL</property>
+            <event name="OnAuiFindManager"></event>
+            <event name="OnAuiPaneButton"></event>
+            <event name="OnAuiPaneClose"></event>
+            <event name="OnAuiPaneMaximize"></event>
+            <event name="OnAuiPaneRestore"></event>
+            <event name="OnAuiRender"></event>
+            <event name="OnChar"></event>
+            <event name="OnEnterWindow"></event>
+            <event name="OnEraseBackground"></event>
+            <event name="OnInitDialog"></event>
+            <event name="OnKeyDown"></event>
+            <event name="OnKeyUp"></event>
+            <event name="OnKillFocus"></event>
+            <event name="OnLeaveWindow"></event>
+            <event name="OnLeftDClick"></event>
+            <event name="OnLeftDown"></event>
+            <event name="OnLeftUp"></event>
+            <event name="OnMiddleDClick"></event>
+            <event name="OnMiddleDown"></event>
+            <event name="OnMiddleUp"></event>
+            <event name="OnMotion"></event>
+            <event name="OnMouseEvents"></event>
+            <event name="OnMouseWheel"></event>
+            <event name="OnPaint"></event>
+            <event name="OnRightDClick"></event>
+            <event name="OnRightDown"></event>
+            <event name="OnRightUp"></event>
+            <event name="OnSetFocus"></event>
+            <event name="OnSize"></event>
+            <event name="OnUpdateUI"></event>
+            <object class="wxFlexGridSizer" expanded="0">
+                <property name="cols">2</property>
+                <property name="flexible_direction">wxBOTH</property>
+                <property name="growablecols"></property>
+                <property name="growablerows"></property>
+                <property name="hgap">0</property>
+                <property name="minimum_size"></property>
+                <property name="name">fgSizer251</property>
+                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                <property name="permission">none</property>
+                <property name="rows">0</property>
+                <property name="vgap">0</property>
+                <object class="sizeritem" expanded="0">
+                    <property name="border">5</property>
+                    <property name="flag">wxEXPAND</property>
+                    <property name="proportion">1</property>
+                    <object class="wxStaticBoxSizer" expanded="0">
+                        <property name="id">wxID_ANY</property>
+                        <property name="label">LimeLight</property>
+                        <property name="minimum_size"></property>
+                        <property name="name">sbSizer132</property>
+                        <property name="orient">wxVERTICAL</property>
+                        <property name="permission">none</property>
+                        <event name="OnUpdateUI"></event>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag">wxEXPAND</property>
+                            <property name="proportion">1</property>
+                            <object class="wxFlexGridSizer" expanded="0">
+                                <property name="cols">2</property>
+                                <property name="flexible_direction">wxBOTH</property>
+                                <property name="growablecols"></property>
+                                <property name="growablerows"></property>
+                                <property name="hgap">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="name">fgSizer252</property>
+                                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                                <property name="permission">none</property>
+                                <property name="rows">0</property>
+                                <property name="vgap">0</property>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxEXPAND</property>
+                                    <property name="proportion">1</property>
+                                    <object class="wxBoxSizer" expanded="0">
+                                        <property name="minimum_size"></property>
+                                        <property name="name">bSizer3</property>
+                                        <property name="orient">wxHORIZONTAL</property>
+                                        <property name="permission">none</property>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxStaticText" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">FCLK1_DLY:</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">m_staticText345</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <property name="wrap">-1</property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxLEFT</property>
+                                            <property name="proportion">1</property>
+                                            <object class="wxComboBox" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="choices">"No Delay" "No delay" "2x delay" "3x delay" "1x delay"</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">cmbFCLK1_DLY</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="selection">0</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="validator_data_type"></property>
+                                                <property name="validator_style">wxFILTER_NONE</property>
+                                                <property name="validator_type">wxDefaultValidator</property>
+                                                <property name="validator_variable"></property>
+                                                <property name="value">No Delay</property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnCombobox">ParameterChangeHandler</event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnText"></event>
+                                                <event name="OnTextEnter"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxEXPAND</property>
+                                    <property name="proportion">1</property>
+                                    <object class="wxBoxSizer" expanded="0">
+                                        <property name="minimum_size"></property>
+                                        <property name="name">bSizer31</property>
+                                        <property name="orient">wxHORIZONTAL</property>
+                                        <property name="permission">none</property>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxStaticText" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">FCLK2_DLY:</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">m_staticText3451</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <property name="wrap">-1</property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxLEFT</property>
+                                            <property name="proportion">1</property>
+                                            <object class="wxComboBox" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="choices">"No Delay" "No delay" "2x delay" "3x delay" "1x delay"</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">cmbFCLK2_DLY</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="selection">0</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="validator_data_type"></property>
+                                                <property name="validator_style">wxFILTER_NONE</property>
+                                                <property name="validator_type">wxDefaultValidator</property>
+                                                <property name="validator_variable"></property>
+                                                <property name="value">No Delay</property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnCombobox">ParameterChangeHandler</event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnText"></event>
+                                                <event name="OnTextEnter"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxEXPAND</property>
+                                    <property name="proportion">1</property>
+                                    <object class="wxBoxSizer" expanded="0">
+                                        <property name="minimum_size"></property>
+                                        <property name="name">bSizer32</property>
+                                        <property name="orient">wxHORIZONTAL</property>
+                                        <property name="permission">none</property>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxStaticText" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">MCLK1_DLY:</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">m_staticText3452</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <property name="wrap">-1</property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxLEFT</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxComboBox" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="choices">"No Delay" "No delay" "2x delay" "3x delay" "1x delay"</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">cmbMCLK1_DLY</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="selection">0</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="validator_data_type"></property>
+                                                <property name="validator_style">wxFILTER_NONE</property>
+                                                <property name="validator_type">wxDefaultValidator</property>
+                                                <property name="validator_variable"></property>
+                                                <property name="value">No Delay</property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnCombobox">ParameterChangeHandler</event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnText"></event>
+                                                <event name="OnTextEnter"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxEXPAND</property>
+                                    <property name="proportion">1</property>
+                                    <object class="wxBoxSizer" expanded="0">
+                                        <property name="minimum_size"></property>
+                                        <property name="name">bSizer321</property>
+                                        <property name="orient">wxHORIZONTAL</property>
+                                        <property name="permission">none</property>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxStaticText" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">MCLK2_DLY:</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">m_staticText34521</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <property name="wrap">-1</property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxLEFT</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxComboBox" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="choices">"No Delay" "No delay" "2x delay" "3x delay" "1x delay"</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">cmbMCLK1_DLY1</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="selection">0</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="validator_data_type"></property>
+                                                <property name="validator_style">wxFILTER_NONE</property>
+                                                <property name="validator_type">wxDefaultValidator</property>
+                                                <property name="validator_variable"></property>
+                                                <property name="value">No Delay</property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnCombobox">ParameterChangeHandler</event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnText"></event>
+                                                <event name="OnTextEnter"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag"></property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxCheckBox" expanded="0">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="checked">0</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">MCLK1 Invert</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">chkMCLK1_INV</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="validator_data_type"></property>
+                                        <property name="validator_style">wxFILTER_NONE</property>
+                                        <property name="validator_type">wxDefaultValidator</property>
+                                        <property name="validator_variable"></property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnCheckBox"></event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag"></property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxCheckBox" expanded="0">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="checked">0</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">MCLK2 invert</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">chkMCLK2_INV</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="validator_data_type"></property>
+                                        <property name="validator_style">wxFILTER_NONE</property>
+                                        <property name="validator_type">wxDefaultValidator</property>
+                                        <property name="validator_variable"></property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnCheckBox"></event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag"></property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxCheckBox" expanded="0">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="checked">0</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">LML1_TRXIQPULSE mode</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">chkLML1_TRXIQPULSE</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="validator_data_type"></property>
+                                        <property name="validator_style">wxFILTER_NONE</property>
+                                        <property name="validator_type">wxDefaultValidator</property>
+                                        <property name="validator_variable"></property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnCheckBox">ParameterChangeHandler</event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag"></property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxCheckBox" expanded="0">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="checked">0</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">LML2_TRXIQPULSE mode</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">chkLML2_TRXIQPULSE</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="validator_data_type"></property>
+                                        <property name="validator_style">wxFILTER_NONE</property>
+                                        <property name="validator_type">wxDefaultValidator</property>
+                                        <property name="validator_variable"></property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnCheckBox">ParameterChangeHandler</event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag"></property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxCheckBox" expanded="0">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="checked">0</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">LML1_SISODDR mode</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">chkLML1_SISODDR</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="validator_data_type"></property>
+                                        <property name="validator_style">wxFILTER_NONE</property>
+                                        <property name="validator_type">wxDefaultValidator</property>
+                                        <property name="validator_variable"></property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnCheckBox">ParameterChangeHandler</event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag"></property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxCheckBox" expanded="0">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="checked">0</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">LML2_SISODDR mode</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">chkLML2_SISODDR</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="validator_data_type"></property>
+                                        <property name="validator_style">wxFILTER_NONE</property>
+                                        <property name="validator_type">wxDefaultValidator</property>
+                                        <property name="validator_variable"></property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnCheckBox">ParameterChangeHandler</event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+                <object class="sizeritem" expanded="0">
+                    <property name="border">5</property>
+                    <property name="flag"></property>
+                    <property name="proportion">0</property>
+                    <object class="wxStaticBoxSizer" expanded="0">
+                        <property name="id">wxID_ANY</property>
+                        <property name="label">TxTSP</property>
+                        <property name="minimum_size"></property>
+                        <property name="name">sbSizer133</property>
+                        <property name="orient">wxHORIZONTAL</property>
+                        <property name="permission">none</property>
+                        <event name="OnUpdateUI"></event>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                            <property name="proportion">0</property>
+                            <object class="wxStaticText" expanded="0">
+                                <property name="BottomDockable">1</property>
+                                <property name="LeftDockable">1</property>
+                                <property name="RightDockable">1</property>
+                                <property name="TopDockable">1</property>
+                                <property name="aui_layer"></property>
+                                <property name="aui_name"></property>
+                                <property name="aui_position"></property>
+                                <property name="aui_row"></property>
+                                <property name="best_size"></property>
+                                <property name="bg"></property>
+                                <property name="caption"></property>
+                                <property name="caption_visible">1</property>
+                                <property name="center_pane">0</property>
+                                <property name="close_button">1</property>
+                                <property name="context_help"></property>
+                                <property name="context_menu">1</property>
+                                <property name="default_pane">0</property>
+                                <property name="dock">Dock</property>
+                                <property name="dock_fixed">0</property>
+                                <property name="docking">Left</property>
+                                <property name="enabled">1</property>
+                                <property name="fg"></property>
+                                <property name="floatable">1</property>
+                                <property name="font"></property>
+                                <property name="gripper">0</property>
+                                <property name="hidden">0</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="label">CMIX_GAIN:</property>
+                                <property name="max_size"></property>
+                                <property name="maximize_button">0</property>
+                                <property name="maximum_size"></property>
+                                <property name="min_size"></property>
+                                <property name="minimize_button">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="moveable">1</property>
+                                <property name="name">m_staticText352</property>
+                                <property name="pane_border">1</property>
+                                <property name="pane_position"></property>
+                                <property name="pane_size"></property>
+                                <property name="permission">protected</property>
+                                <property name="pin_button">1</property>
+                                <property name="pos"></property>
+                                <property name="resize">Resizable</property>
+                                <property name="show">1</property>
+                                <property name="size"></property>
+                                <property name="style"></property>
+                                <property name="subclass"></property>
+                                <property name="toolbar_pane">0</property>
+                                <property name="tooltip"></property>
+                                <property name="window_extra_style"></property>
+                                <property name="window_name"></property>
+                                <property name="window_style"></property>
+                                <property name="wrap">-1</property>
+                                <event name="OnChar"></event>
+                                <event name="OnEnterWindow"></event>
+                                <event name="OnEraseBackground"></event>
+                                <event name="OnKeyDown"></event>
+                                <event name="OnKeyUp"></event>
+                                <event name="OnKillFocus"></event>
+                                <event name="OnLeaveWindow"></event>
+                                <event name="OnLeftDClick"></event>
+                                <event name="OnLeftDown"></event>
+                                <event name="OnLeftUp"></event>
+                                <event name="OnMiddleDClick"></event>
+                                <event name="OnMiddleDown"></event>
+                                <event name="OnMiddleUp"></event>
+                                <event name="OnMotion"></event>
+                                <event name="OnMouseEvents"></event>
+                                <event name="OnMouseWheel"></event>
+                                <event name="OnPaint"></event>
+                                <event name="OnRightDClick"></event>
+                                <event name="OnRightDown"></event>
+                                <event name="OnRightUp"></event>
+                                <event name="OnSetFocus"></event>
+                                <event name="OnSize"></event>
+                                <event name="OnUpdateUI"></event>
+                            </object>
+                        </object>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag"></property>
+                            <property name="proportion">0</property>
+                            <object class="wxComboBox" expanded="0">
+                                <property name="BottomDockable">1</property>
+                                <property name="LeftDockable">1</property>
+                                <property name="RightDockable">1</property>
+                                <property name="TopDockable">1</property>
+                                <property name="aui_layer"></property>
+                                <property name="aui_name"></property>
+                                <property name="aui_position"></property>
+                                <property name="aui_row"></property>
+                                <property name="best_size"></property>
+                                <property name="bg"></property>
+                                <property name="caption"></property>
+                                <property name="caption_visible">1</property>
+                                <property name="center_pane">0</property>
+                                <property name="choices"></property>
+                                <property name="close_button">1</property>
+                                <property name="context_help"></property>
+                                <property name="context_menu">1</property>
+                                <property name="default_pane">0</property>
+                                <property name="dock">Dock</property>
+                                <property name="dock_fixed">0</property>
+                                <property name="docking">Left</property>
+                                <property name="enabled">1</property>
+                                <property name="fg"></property>
+                                <property name="floatable">1</property>
+                                <property name="font"></property>
+                                <property name="gripper">0</property>
+                                <property name="hidden">0</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="max_size"></property>
+                                <property name="maximize_button">0</property>
+                                <property name="maximum_size"></property>
+                                <property name="min_size"></property>
+                                <property name="minimize_button">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="moveable">1</property>
+                                <property name="name">m_comboBox143</property>
+                                <property name="pane_border">1</property>
+                                <property name="pane_position"></property>
+                                <property name="pane_size"></property>
+                                <property name="permission">protected</property>
+                                <property name="pin_button">1</property>
+                                <property name="pos"></property>
+                                <property name="resize">Resizable</property>
+                                <property name="selection">-1</property>
+                                <property name="show">1</property>
+                                <property name="size"></property>
+                                <property name="style"></property>
+                                <property name="subclass"></property>
+                                <property name="toolbar_pane">0</property>
+                                <property name="tooltip"></property>
+                                <property name="validator_data_type"></property>
+                                <property name="validator_style">wxFILTER_NONE</property>
+                                <property name="validator_type">wxDefaultValidator</property>
+                                <property name="validator_variable"></property>
+                                <property name="value">Combo!</property>
+                                <property name="window_extra_style"></property>
+                                <property name="window_name"></property>
+                                <property name="window_style"></property>
+                                <event name="OnChar"></event>
+                                <event name="OnCombobox">ParameterChangeHandler</event>
+                                <event name="OnEnterWindow"></event>
+                                <event name="OnEraseBackground"></event>
+                                <event name="OnKeyDown"></event>
+                                <event name="OnKeyUp"></event>
+                                <event name="OnKillFocus"></event>
+                                <event name="OnLeaveWindow"></event>
+                                <event name="OnLeftDClick"></event>
+                                <event name="OnLeftDown"></event>
+                                <event name="OnLeftUp"></event>
+                                <event name="OnMiddleDClick"></event>
+                                <event name="OnMiddleDown"></event>
+                                <event name="OnMiddleUp"></event>
+                                <event name="OnMotion"></event>
+                                <event name="OnMouseEvents"></event>
+                                <event name="OnMouseWheel"></event>
+                                <event name="OnPaint"></event>
+                                <event name="OnRightDClick"></event>
+                                <event name="OnRightDown"></event>
+                                <event name="OnRightUp"></event>
+                                <event name="OnSetFocus"></event>
+                                <event name="OnSize"></event>
+                                <event name="OnText"></event>
+                                <event name="OnTextEnter"></event>
+                                <event name="OnUpdateUI"></event>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+                <object class="sizeritem" expanded="0">
+                    <property name="border">5</property>
+                    <property name="flag">wxEXPAND</property>
+                    <property name="proportion">1</property>
+                    <object class="wxStaticBoxSizer" expanded="0">
+                        <property name="id">wxID_ANY</property>
+                        <property name="label">RxTSP</property>
+                        <property name="minimum_size"></property>
+                        <property name="name">sbSizer134</property>
+                        <property name="orient">wxVERTICAL</property>
+                        <property name="permission">none</property>
+                        <event name="OnUpdateUI"></event>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag">wxEXPAND</property>
+                            <property name="proportion">1</property>
+                            <object class="wxBoxSizer" expanded="0">
+                                <property name="minimum_size"></property>
+                                <property name="name">bSizer13</property>
+                                <property name="orient">wxHORIZONTAL</property>
+                                <property name="permission">none</property>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxStaticText" expanded="0">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">HBD delay</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">m_staticText353</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <property name="wrap">-1</property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag"></property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxComboBox" expanded="0">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="choices">"No delay" "Delay 1 clock cycle" "Delay 2 clock cycles" "Delay 3 clock cycles" "Delay 4 clock cycles" "Delay 2 clock cycle" "Delay 2 clock cycle" "delay 1 clock cycle"</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">cmbHBD_DLY</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="selection">-1</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="validator_data_type"></property>
+                                        <property name="validator_style">wxFILTER_NONE</property>
+                                        <property name="validator_type">wxDefaultValidator</property>
+                                        <property name="validator_variable"></property>
+                                        <property name="value">No delay</property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnCombobox"></event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnText"></event>
+                                        <event name="OnTextEnter"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+                <object class="sizeritem" expanded="0">
+                    <property name="border">5</property>
+                    <property name="flag"></property>
+                    <property name="proportion">1</property>
+                    <object class="wxStaticBoxSizer" expanded="0">
+                        <property name="id">wxID_ANY</property>
+                        <property name="label">LDO</property>
+                        <property name="minimum_size"></property>
+                        <property name="name">sbSizer139</property>
+                        <property name="orient">wxHORIZONTAL</property>
+                        <property name="permission">none</property>
+                        <event name="OnUpdateUI"></event>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                            <property name="proportion">0</property>
+                            <object class="wxStaticText" expanded="0">
+                                <property name="BottomDockable">1</property>
+                                <property name="LeftDockable">1</property>
+                                <property name="RightDockable">1</property>
+                                <property name="TopDockable">1</property>
+                                <property name="aui_layer"></property>
+                                <property name="aui_name"></property>
+                                <property name="aui_position"></property>
+                                <property name="aui_row"></property>
+                                <property name="best_size"></property>
+                                <property name="bg"></property>
+                                <property name="caption"></property>
+                                <property name="caption_visible">1</property>
+                                <property name="center_pane">0</property>
+                                <property name="close_button">1</property>
+                                <property name="context_help"></property>
+                                <property name="context_menu">1</property>
+                                <property name="default_pane">0</property>
+                                <property name="dock">Dock</property>
+                                <property name="dock_fixed">0</property>
+                                <property name="docking">Left</property>
+                                <property name="enabled">1</property>
+                                <property name="fg"></property>
+                                <property name="floatable">1</property>
+                                <property name="font"></property>
+                                <property name="gripper">0</property>
+                                <property name="hidden">0</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="label">ISINK_SPI_BUFF</property>
+                                <property name="max_size"></property>
+                                <property name="maximize_button">0</property>
+                                <property name="maximum_size"></property>
+                                <property name="min_size"></property>
+                                <property name="minimize_button">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="moveable">1</property>
+                                <property name="name">m_staticText362</property>
+                                <property name="pane_border">1</property>
+                                <property name="pane_position"></property>
+                                <property name="pane_size"></property>
+                                <property name="permission">protected</property>
+                                <property name="pin_button">1</property>
+                                <property name="pos"></property>
+                                <property name="resize">Resizable</property>
+                                <property name="show">1</property>
+                                <property name="size"></property>
+                                <property name="style"></property>
+                                <property name="subclass"></property>
+                                <property name="toolbar_pane">0</property>
+                                <property name="tooltip"></property>
+                                <property name="window_extra_style"></property>
+                                <property name="window_name"></property>
+                                <property name="window_style"></property>
+                                <property name="wrap">-1</property>
+                                <event name="OnChar"></event>
+                                <event name="OnEnterWindow"></event>
+                                <event name="OnEraseBackground"></event>
+                                <event name="OnKeyDown"></event>
+                                <event name="OnKeyUp"></event>
+                                <event name="OnKillFocus"></event>
+                                <event name="OnLeaveWindow"></event>
+                                <event name="OnLeftDClick"></event>
+                                <event name="OnLeftDown"></event>
+                                <event name="OnLeftUp"></event>
+                                <event name="OnMiddleDClick"></event>
+                                <event name="OnMiddleDown"></event>
+                                <event name="OnMiddleUp"></event>
+                                <event name="OnMotion"></event>
+                                <event name="OnMouseEvents"></event>
+                                <event name="OnMouseWheel"></event>
+                                <event name="OnPaint"></event>
+                                <event name="OnRightDClick"></event>
+                                <event name="OnRightDown"></event>
+                                <event name="OnRightUp"></event>
+                                <event name="OnSetFocus"></event>
+                                <event name="OnSize"></event>
+                                <event name="OnUpdateUI"></event>
+                            </object>
+                        </object>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag">wxLEFT</property>
+                            <property name="proportion">0</property>
+                            <object class="wxComboBox" expanded="0">
+                                <property name="BottomDockable">1</property>
+                                <property name="LeftDockable">1</property>
+                                <property name="RightDockable">1</property>
+                                <property name="TopDockable">1</property>
+                                <property name="aui_layer"></property>
+                                <property name="aui_name"></property>
+                                <property name="aui_position"></property>
+                                <property name="aui_row"></property>
+                                <property name="best_size"></property>
+                                <property name="bg"></property>
+                                <property name="caption"></property>
+                                <property name="caption_visible">1</property>
+                                <property name="center_pane">0</property>
+                                <property name="choices"></property>
+                                <property name="close_button">1</property>
+                                <property name="context_help"></property>
+                                <property name="context_menu">1</property>
+                                <property name="default_pane">0</property>
+                                <property name="dock">Dock</property>
+                                <property name="dock_fixed">0</property>
+                                <property name="docking">Left</property>
+                                <property name="enabled">1</property>
+                                <property name="fg"></property>
+                                <property name="floatable">1</property>
+                                <property name="font"></property>
+                                <property name="gripper">0</property>
+                                <property name="hidden">0</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="max_size"></property>
+                                <property name="maximize_button">0</property>
+                                <property name="maximum_size"></property>
+                                <property name="min_size"></property>
+                                <property name="minimize_button">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="moveable">1</property>
+                                <property name="name">cmbISINK_SPIBUFF</property>
+                                <property name="pane_border">1</property>
+                                <property name="pane_position"></property>
+                                <property name="pane_size"></property>
+                                <property name="permission">protected</property>
+                                <property name="pin_button">1</property>
+                                <property name="pos"></property>
+                                <property name="resize">Resizable</property>
+                                <property name="selection">-1</property>
+                                <property name="show">1</property>
+                                <property name="size"></property>
+                                <property name="style"></property>
+                                <property name="subclass"></property>
+                                <property name="toolbar_pane">0</property>
+                                <property name="tooltip"></property>
+                                <property name="validator_data_type"></property>
+                                <property name="validator_style">wxFILTER_NONE</property>
+                                <property name="validator_type">wxDefaultValidator</property>
+                                <property name="validator_variable"></property>
+                                <property name="value"></property>
+                                <property name="window_extra_style"></property>
+                                <property name="window_name"></property>
+                                <property name="window_style"></property>
+                                <event name="OnChar"></event>
+                                <event name="OnCombobox"></event>
+                                <event name="OnEnterWindow"></event>
+                                <event name="OnEraseBackground"></event>
+                                <event name="OnKeyDown"></event>
+                                <event name="OnKeyUp"></event>
+                                <event name="OnKillFocus"></event>
+                                <event name="OnLeaveWindow"></event>
+                                <event name="OnLeftDClick"></event>
+                                <event name="OnLeftDown"></event>
+                                <event name="OnLeftUp"></event>
+                                <event name="OnMiddleDClick"></event>
+                                <event name="OnMiddleDown"></event>
+                                <event name="OnMiddleUp"></event>
+                                <event name="OnMotion"></event>
+                                <event name="OnMouseEvents"></event>
+                                <event name="OnMouseWheel"></event>
+                                <event name="OnPaint"></event>
+                                <event name="OnRightDClick"></event>
+                                <event name="OnRightDown"></event>
+                                <event name="OnRightUp"></event>
+                                <event name="OnSetFocus"></event>
+                                <event name="OnSize"></event>
+                                <event name="OnText"></event>
+                                <event name="OnTextEnter"></event>
+                                <event name="OnUpdateUI"></event>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+                <object class="sizeritem" expanded="0">
+                    <property name="border">5</property>
+                    <property name="flag">wxEXPAND</property>
+                    <property name="proportion">1</property>
+                    <object class="wxStaticBoxSizer" expanded="0">
+                        <property name="id">wxID_ANY</property>
+                        <property name="label">TRX_GAIN</property>
+                        <property name="minimum_size"></property>
+                        <property name="name">sbSizer140</property>
+                        <property name="orient">wxVERTICAL</property>
+                        <property name="permission">none</property>
+                        <event name="OnUpdateUI"></event>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag">wxLEFT</property>
+                            <property name="proportion">0</property>
+                            <object class="wxCheckBox" expanded="0">
+                                <property name="BottomDockable">1</property>
+                                <property name="LeftDockable">1</property>
+                                <property name="RightDockable">1</property>
+                                <property name="TopDockable">1</property>
+                                <property name="aui_layer"></property>
+                                <property name="aui_name"></property>
+                                <property name="aui_position"></property>
+                                <property name="aui_row"></property>
+                                <property name="best_size"></property>
+                                <property name="bg"></property>
+                                <property name="caption"></property>
+                                <property name="caption_visible">1</property>
+                                <property name="center_pane">0</property>
+                                <property name="checked">0</property>
+                                <property name="close_button">1</property>
+                                <property name="context_help"></property>
+                                <property name="context_menu">1</property>
+                                <property name="default_pane">0</property>
+                                <property name="dock">Dock</property>
+                                <property name="dock_fixed">0</property>
+                                <property name="docking">Left</property>
+                                <property name="enabled">1</property>
+                                <property name="fg"></property>
+                                <property name="floatable">1</property>
+                                <property name="font"></property>
+                                <property name="gripper">0</property>
+                                <property name="hidden">0</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="label">Alternative TRX gain source</property>
+                                <property name="max_size"></property>
+                                <property name="maximize_button">0</property>
+                                <property name="maximum_size"></property>
+                                <property name="min_size"></property>
+                                <property name="minimize_button">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="moveable">1</property>
+                                <property name="name">chkTRX_GAIN_SRC</property>
+                                <property name="pane_border">1</property>
+                                <property name="pane_position"></property>
+                                <property name="pane_size"></property>
+                                <property name="permission">protected</property>
+                                <property name="pin_button">1</property>
+                                <property name="pos"></property>
+                                <property name="resize">Resizable</property>
+                                <property name="show">1</property>
+                                <property name="size"></property>
+                                <property name="style"></property>
+                                <property name="subclass"></property>
+                                <property name="toolbar_pane">0</property>
+                                <property name="tooltip"></property>
+                                <property name="validator_data_type"></property>
+                                <property name="validator_style">wxFILTER_NONE</property>
+                                <property name="validator_type">wxDefaultValidator</property>
+                                <property name="validator_variable"></property>
+                                <property name="window_extra_style"></property>
+                                <property name="window_name"></property>
+                                <property name="window_style"></property>
+                                <event name="OnChar"></event>
+                                <event name="OnCheckBox">ParameterChangeHandler</event>
+                                <event name="OnEnterWindow"></event>
+                                <event name="OnEraseBackground"></event>
+                                <event name="OnKeyDown"></event>
+                                <event name="OnKeyUp"></event>
+                                <event name="OnKillFocus"></event>
+                                <event name="OnLeaveWindow"></event>
+                                <event name="OnLeftDClick"></event>
+                                <event name="OnLeftDown"></event>
+                                <event name="OnLeftUp"></event>
+                                <event name="OnMiddleDClick"></event>
+                                <event name="OnMiddleDown"></event>
+                                <event name="OnMiddleUp"></event>
+                                <event name="OnMotion"></event>
+                                <event name="OnMouseEvents"></event>
+                                <event name="OnMouseWheel"></event>
+                                <event name="OnPaint"></event>
+                                <event name="OnRightDClick"></event>
+                                <event name="OnRightDown"></event>
+                                <event name="OnRightUp"></event>
+                                <event name="OnSetFocus"></event>
+                                <event name="OnSize"></event>
+                                <event name="OnUpdateUI"></event>
+                            </object>
+                        </object>
+                        <object class="sizeritem" expanded="0">
+                            <property name="border">5</property>
+                            <property name="flag">wxEXPAND</property>
+                            <property name="proportion">1</property>
+                            <object class="wxFlexGridSizer" expanded="0">
+                                <property name="cols">2</property>
+                                <property name="flexible_direction">wxBOTH</property>
+                                <property name="growablecols"></property>
+                                <property name="growablerows"></property>
+                                <property name="hgap">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="name">fgSizer256</property>
+                                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                                <property name="permission">none</property>
+                                <property name="rows">0</property>
+                                <property name="vgap">0</property>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag"></property>
+                                    <property name="proportion">1</property>
+                                    <object class="wxStaticBoxSizer" expanded="0">
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">TBB</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="name">sbSizer137</property>
+                                        <property name="orient">wxVERTICAL</property>
+                                        <property name="permission">none</property>
+                                        <event name="OnUpdateUI"></event>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxEXPAND</property>
+                                            <property name="proportion">1</property>
+                                            <object class="wxFlexGridSizer" expanded="0">
+                                                <property name="cols">2</property>
+                                                <property name="flexible_direction">wxBOTH</property>
+                                                <property name="growablecols">1</property>
+                                                <property name="growablerows"></property>
+                                                <property name="hgap">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="name">fgSizer254</property>
+                                                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                                                <property name="permission">none</property>
+                                                <property name="rows">0</property>
+                                                <property name="vgap">0</property>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag"></property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">CG_IAMP:</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_staticText355</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxEXPAND</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxSpinCtrl" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="initial">0</property>
+                                                        <property name="max">10</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min">0</property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">spinCG_IAMP_TBB</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style">wxSP_ARROW_KEYS</property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="value"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnSpinCtrl">ParameterChangeHandler</event>
+                                                        <event name="OnSpinCtrlText">ParameterChangeHandler</event>
+                                                        <event name="OnTextEnter"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag"></property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">LOSS_LIN_TXPAD</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_staticText356</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxEXPAND</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxSpinCtrl" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="initial">0</property>
+                                                        <property name="max">31</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min">0</property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">spinLOSS_LIN_TXPAD_TRF</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style">wxSP_ARROW_KEYS</property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="value">0</property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnSpinCtrl">ParameterChangeHandler</event>
+                                                        <event name="OnSpinCtrlText">ParameterChangeHandler</event>
+                                                        <event name="OnTextEnter"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag"></property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">LOSS_MAIN_TXPAD</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_staticText357</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxEXPAND</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxSpinCtrl" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="initial">0</property>
+                                                        <property name="max">31</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min">0</property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">spinLOSS_MAIN_TXPAD_TRF</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style">wxSP_ARROW_KEYS</property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="value">0</property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnSpinCtrl">ParameterChangeHandler</event>
+                                                        <event name="OnSpinCtrlText">ParameterChangeHandler</event>
+                                                        <event name="OnTextEnter"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag"></property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxCheckBox" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="checked">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">Bypass LPFS5 low pass real-pole filter capacitor banks</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">chkR5_LPF_BYP_TBB</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass"></property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="validator_data_type"></property>
+                                                <property name="validator_style">wxFILTER_NONE</property>
+                                                <property name="validator_type">wxDefaultValidator</property>
+                                                <property name="validator_variable"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <event name="OnChar"></event>
+                                                <event name="OnCheckBox"></event>
+                                                <event name="OnEnterWindow"></event>
+                                                <event name="OnEraseBackground"></event>
+                                                <event name="OnKeyDown"></event>
+                                                <event name="OnKeyUp"></event>
+                                                <event name="OnKillFocus"></event>
+                                                <event name="OnLeaveWindow"></event>
+                                                <event name="OnLeftDClick"></event>
+                                                <event name="OnLeftDown"></event>
+                                                <event name="OnLeftUp"></event>
+                                                <event name="OnMiddleDClick"></event>
+                                                <event name="OnMiddleDown"></event>
+                                                <event name="OnMiddleUp"></event>
+                                                <event name="OnMotion"></event>
+                                                <event name="OnMouseEvents"></event>
+                                                <event name="OnMouseWheel"></event>
+                                                <event name="OnPaint"></event>
+                                                <event name="OnRightDClick"></event>
+                                                <event name="OnRightDown"></event>
+                                                <event name="OnRightUp"></event>
+                                                <event name="OnSetFocus"></event>
+                                                <event name="OnSize"></event>
+                                                <event name="OnUpdateUI"></event>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="0">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxEXPAND</property>
+                                    <property name="proportion">1</property>
+                                    <object class="wxStaticBoxSizer" expanded="0">
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">RX</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="name">sbSizer138</property>
+                                        <property name="orient">wxVERTICAL</property>
+                                        <property name="permission">none</property>
+                                        <event name="OnUpdateUI"></event>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxEXPAND</property>
+                                            <property name="proportion">1</property>
+                                            <object class="wxFlexGridSizer" expanded="0">
+                                                <property name="cols">2</property>
+                                                <property name="flexible_direction">wxBOTH</property>
+                                                <property name="growablecols"></property>
+                                                <property name="growablerows"></property>
+                                                <property name="hgap">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="name">fgSizer255</property>
+                                                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                                                <property name="permission">none</property>
+                                                <property name="rows">0</property>
+                                                <property name="vgap">0</property>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">C_CTL_PGA_RBB</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_staticText358</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag"></property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxSpinCtrl" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="initial">2</property>
+                                                        <property name="max">255</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min">0</property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">spinC_CTL_PGA_RBB</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style">wxSP_ARROW_KEYS</property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="value">2</property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnSpinCtrl">ParameterChangeHandler</event>
+                                                        <event name="OnSpinCtrlText">ParameterChangeHandler</event>
+                                                        <event name="OnTextEnter"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">G_PGA_RBB</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_staticText359</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxEXPAND</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxComboBox" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="choices"></property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">cmbG_PGA_RBB</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="selection">-1</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="validator_data_type"></property>
+                                                        <property name="validator_style">wxFILTER_NONE</property>
+                                                        <property name="validator_type">wxDefaultValidator</property>
+                                                        <property name="validator_variable"></property>
+                                                        <property name="value"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnCombobox">ParameterChangeHandler</event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnText"></event>
+                                                        <event name="OnTextEnter"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">G_LNA</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_staticText360</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxEXPAND</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxComboBox" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="choices"></property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">cmbG_LNA_RFE</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="selection">-1</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="validator_data_type"></property>
+                                                        <property name="validator_style">wxFILTER_NONE</property>
+                                                        <property name="validator_type">wxDefaultValidator</property>
+                                                        <property name="validator_variable"></property>
+                                                        <property name="value"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnCombobox">ParameterChangeHandler</event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnText"></event>
+                                                        <event name="OnTextEnter"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">G_TIA</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_staticText361</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxEXPAND</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxComboBox" expanded="1">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="choices"></property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">cmbG_TIA_RFE</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="selection">-1</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass"></property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="validator_data_type"></property>
+                                                        <property name="validator_style">wxFILTER_NONE</property>
+                                                        <property name="validator_type">wxDefaultValidator</property>
+                                                        <property name="validator_variable"></property>
+                                                        <property name="value"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <event name="OnChar"></event>
+                                                        <event name="OnCombobox">ParameterChangeHandler</event>
+                                                        <event name="OnEnterWindow"></event>
+                                                        <event name="OnEraseBackground"></event>
+                                                        <event name="OnKeyDown"></event>
+                                                        <event name="OnKeyUp"></event>
+                                                        <event name="OnKillFocus"></event>
+                                                        <event name="OnLeaveWindow"></event>
+                                                        <event name="OnLeftDClick"></event>
+                                                        <event name="OnLeftDown"></event>
+                                                        <event name="OnLeftUp"></event>
+                                                        <event name="OnMiddleDClick"></event>
+                                                        <event name="OnMiddleDown"></event>
+                                                        <event name="OnMiddleUp"></event>
+                                                        <event name="OnMotion"></event>
+                                                        <event name="OnMouseEvents"></event>
+                                                        <event name="OnMouseWheel"></event>
+                                                        <event name="OnPaint"></event>
+                                                        <event name="OnRightDClick"></event>
+                                                        <event name="OnRightDown"></event>
+                                                        <event name="OnRightUp"></event>
+                                                        <event name="OnSetFocus"></event>
+                                                        <event name="OnSize"></event>
+                                                        <event name="OnText"></event>
+                                                        <event name="OnTextEnter"></event>
+                                                        <event name="OnUpdateUI"></event>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+            </object>
+        </object>
     </object>
 </wxFormBuilder_Project>
diff --git a/src/lms7002_wxgui/lms7002_wxgui.h b/src/lms7002_wxgui/lms7002_wxgui.h
index b2fd8c3..4ddaca1 100644
--- a/src/lms7002_wxgui/lms7002_wxgui.h
+++ b/src/lms7002_wxgui/lms7002_wxgui.h
@@ -1078,6 +1078,7 @@ class pnlCLKGEN_view : public wxPanel
 		NumericSlider* cmbIOFFSET_CP_CGEN;
 		wxStaticText* ID_STATICTEXT17;
 		NumericSlider* cmbIPULSE_CP_CGEN;
+		wxFlexGridSizer* sizerR3;
 		
 		// Virtual event handlers, overide them in your derived class
 		virtual void ParameterChangeHandler( wxCommandEvent& event ) { event.Skip(); }
@@ -1218,6 +1219,7 @@ class pnlSX_view : public wxPanel
 		wxComboBox* cmbRSEL_LDO_VCO;
 		wxStaticText* ID_STATICTEXT12;
 		wxComboBox* cmbIOFFSET_CP;
+		wxFlexGridSizer* sizerR3;
 		
 		// Virtual event handlers, overide them in your derived class
 		virtual void ParameterChangeHandler( wxCommandEvent& event ) { event.Skip(); }
@@ -2232,4 +2234,61 @@ class dlgVCOfrequencies : public wxDialog
 	
 };
 
+///////////////////////////////////////////////////////////////////////////////
+/// Class pnlR3
+///////////////////////////////////////////////////////////////////////////////
+class pnlR3 : public wxPanel 
+{
+	private:
+	
+	protected:
+		wxStaticText* m_staticText345;
+		wxComboBox* cmbFCLK1_DLY;
+		wxStaticText* m_staticText3451;
+		wxComboBox* cmbFCLK2_DLY;
+		wxStaticText* m_staticText3452;
+		wxComboBox* cmbMCLK1_DLY;
+		wxStaticText* m_staticText34521;
+		wxComboBox* cmbMCLK1_DLY1;
+		wxCheckBox* chkMCLK1_INV;
+		wxCheckBox* chkMCLK2_INV;
+		wxCheckBox* chkLML1_TRXIQPULSE;
+		wxCheckBox* chkLML2_TRXIQPULSE;
+		wxCheckBox* chkLML1_SISODDR;
+		wxCheckBox* chkLML2_SISODDR;
+		wxStaticText* m_staticText352;
+		wxComboBox* m_comboBox143;
+		wxStaticText* m_staticText353;
+		wxComboBox* cmbHBD_DLY;
+		wxStaticText* m_staticText362;
+		wxComboBox* cmbISINK_SPIBUFF;
+		wxCheckBox* chkTRX_GAIN_SRC;
+		wxStaticText* m_staticText355;
+		wxSpinCtrl* spinCG_IAMP_TBB;
+		wxStaticText* m_staticText356;
+		wxSpinCtrl* spinLOSS_LIN_TXPAD_TRF;
+		wxStaticText* m_staticText357;
+		wxSpinCtrl* spinLOSS_MAIN_TXPAD_TRF;
+		wxCheckBox* chkR5_LPF_BYP_TBB;
+		wxStaticText* m_staticText358;
+		wxSpinCtrl* spinC_CTL_PGA_RBB;
+		wxStaticText* m_staticText359;
+		wxComboBox* cmbG_PGA_RBB;
+		wxStaticText* m_staticText360;
+		wxComboBox* cmbG_LNA_RFE;
+		wxStaticText* m_staticText361;
+		wxComboBox* cmbG_TIA_RFE;
+		
+		// Virtual event handlers, overide them in your derived class
+		virtual void ParameterChangeHandler( wxCommandEvent& event ) = 0;
+		virtual void ParameterChangeHandler( wxSpinEvent& event ) = 0;
+		
+	
+	public:
+		
+		pnlR3( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); 
+		~pnlR3();
+	
+};
+
 #endif //__LMS7002_WXGUI_H__
diff --git a/src/lms7002_wxgui/pnlBoardControls.cpp b/src/lms7002_wxgui/pnlBoardControls.cpp
index 07cf86c..b2f7b1d 100644
--- a/src/lms7002_wxgui/pnlBoardControls.cpp
+++ b/src/lms7002_wxgui/pnlBoardControls.cpp
@@ -8,7 +8,7 @@
 #include <wx/wx.h>
 #endif //WX_PRECOMP
 
-
+#include "pnlUltimateEVB.h"
 #include "pnluLimeSDR.h"
 #include "pnlLimeSDR.h"
 #include <IConnection.h>
@@ -153,61 +153,57 @@ pnlBoardControls::pnlBoardControls(wxWindow* parent, wxWindowID id, const wxStri
 
     fgSizer247->Add(pnlCustomControls, 1, wxEXPAND, 5);
 
-	wxFlexGridSizer* fgSizer249;
-	fgSizer249 = new wxFlexGridSizer( 0, 2, 5, 5 );
-	fgSizer249->AddGrowableCol( 0 );
-	fgSizer249->AddGrowableCol( 1 );
-	fgSizer249->SetFlexibleDirection( wxBOTH );
-	fgSizer249->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+    wxFlexGridSizer* fgSizer249;
+    fgSizer249 = new wxFlexGridSizer( 0, 2, 5, 5 );
+    fgSizer249->AddGrowableCol( 0 );
+    fgSizer249->AddGrowableCol( 1 );
+    fgSizer249->SetFlexibleDirection( wxBOTH );
+    fgSizer249->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
 
-	wxStaticBoxSizer* sbSizer133;
-	sbSizer133 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Read") ), wxVERTICAL );
+    wxStaticBoxSizer* sbSizer133;
+    sbSizer133 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Read") ), wxVERTICAL );
 
-	sizerAnalogRd = new wxFlexGridSizer( 0, 4, 2, 2 );
-	sizerAnalogRd->SetFlexibleDirection( wxBOTH );
-	sizerAnalogRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+    sizerAnalogRd = new wxFlexGridSizer( 0, 4, 2, 2 );
+    sizerAnalogRd->SetFlexibleDirection( wxBOTH );
+    sizerAnalogRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
     sizerAnalogRd->Add(new wxStaticText(this, wxID_ANY, _("Ch.")), 1, wxALL, 5);
     sizerAnalogRd->Add(new wxStaticText(this, wxID_ANY, _("Name")), 1, wxALL, 5);
     sizerAnalogRd->Add(new wxStaticText(this, wxID_ANY, _("Value")), 1, wxALL, 5);
     sizerAnalogRd->Add(new wxStaticText(this, wxID_ANY, _("Units")), 1, wxALL, 5);
 
-
-	sbSizer133->Add( sizerAnalogRd, 1, wxEXPAND, 5 );
+    sbSizer133->Add( sizerAnalogRd, 1, wxEXPAND, 5 );
 
 
-	fgSizer249->Add( sbSizer133, 1, wxEXPAND, 5 );
+    fgSizer249->Add( sbSizer133, 1, wxEXPAND, 5 );
 
-	wxStaticBoxSizer* sbSizer134;
-	sbSizer134 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Write") ), wxVERTICAL );
+    wxStaticBoxSizer* sbSizer134;
+    sbSizer134 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Write") ), wxVERTICAL );
 
-	sizerAnalogWr = new wxFlexGridSizer( 0, 4, 2, 2 );
-	sizerAnalogWr->SetFlexibleDirection( wxBOTH );
-	sizerAnalogWr->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+    sizerAnalogWr = new wxFlexGridSizer( 0, 4, 2, 2 );
+    sizerAnalogWr->SetFlexibleDirection( wxBOTH );
+    sizerAnalogWr->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
 
 
-	sbSizer134->Add( sizerAnalogWr, 1, wxEXPAND, 5 );
+    sbSizer134->Add( sizerAnalogWr, 1, wxEXPAND, 5 );
     sizerAnalogWr->Add(new wxStaticText(this, wxID_ANY, _("Ch.")), 1, wxALL, 5);
     sizerAnalogWr->Add(new wxStaticText(this, wxID_ANY, _("Name")), 1, wxALL, 5);
     sizerAnalogWr->Add(new wxStaticText(this, wxID_ANY, _("Value")), 1, wxALL, 5);
     sizerAnalogWr->Add(new wxStaticText(this, wxID_ANY, _("Units")), 1, wxALL, 5);
 
+    fgSizer249->Add( sbSizer134, 1, wxEXPAND, 5 );
 
-	fgSizer249->Add( sbSizer134, 1, wxEXPAND, 5 );
-
-
-	fgSizer247->Add( fgSizer249, 1, wxEXPAND, 5 );
+    fgSizer247->Add( fgSizer249, 1, wxEXPAND, 5 );
 
     sizerAdditionalControls = new wxFlexGridSizer(0, 1, 0, 0);
     fgSizer247->Add(sizerAdditionalControls, 1, wxEXPAND, 5);
-
-	this->SetSizer( fgSizer247 );
-	this->Layout();
-	fgSizer247->Fit( this );
+    this->SetSizer( fgSizer247 );
+    this->Layout();
+    fgSizer247->Fit( this );
 
 	// Connect Events
     cmbBoardSelection->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(pnlBoardControls::OnUserChangedBoardType), NULL, this);
-	btnReadAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnReadAll ), NULL, this );
-	btnWriteAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnWriteAll ), NULL, this );
+    btnReadAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnReadAll ), NULL, this );
+    btnWriteAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnWriteAll ), NULL, this );
 
     SetupControls(GetDeviceName(LMS_DEV_UNKNOWN));
 }
@@ -318,7 +314,7 @@ void pnlBoardControls::UpdatePanel()
     {
         mADC_GUI_widgets[i]->channel->SetLabel(wxString::Format(_("%i"), mADCparameters[i].channel));
         mADC_GUI_widgets[i]->title->SetLabel(wxString(mADCparameters[i].name));
-        mADC_GUI_widgets[i]->value->SetLabel(wxString::Format(_("%i"), mADCparameters[i].value));
+        mADC_GUI_widgets[i]->value->SetLabel(wxString::Format(_("%1.0f"), mADCparameters[i].value));
         mADC_GUI_widgets[i]->units->SetLabelText(wxString::Format("%s", mADCparameters[i].units));
     }
 
@@ -336,23 +332,13 @@ std::vector<pnlBoardControls::ADC_DAC> pnlBoardControls::getBoardADCs(const stri
     std::vector<ADC_DAC> paramList;
     if(boardID == GetDeviceName(LMS_DEV_LIMESDR)
         || boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE)
-        || boardID == GetDeviceName(LMS_DEV_QSPARK))
+        || boardID == GetDeviceName(LMS_DEV_LIMESDR_QPCIE)
+        || boardID == GetDeviceName(LMS_DEV_LIMESDR_USB_SP)
+        || boardID == GetDeviceName(LMS_DEV_LMS7002M_ULTIMATE_EVB))
     {
-        ADC_DAC dacVoltage;
-        dacVoltage.name = "DAC";
-        dacVoltage.channel = 0;
-        dacVoltage.powerOf10 = 0;
-        dacVoltage.units = adcUnits2string(RAW);
-        dacVoltage.value = 0;
-        paramList.push_back(dacVoltage);
 
-        ADC_DAC temperature;
-        temperature.name = "Temperature";
-        temperature.channel = 1;
-        temperature.powerOf10 = 0;
-        temperature.units = adcUnits2string(TEMPERATURE);
-        temperature.value = 0;
-        paramList.push_back(temperature);
+        paramList.push_back(ADC_DAC{"DAC", 0, 0, adcUnits2string(RAW)});
+        paramList.push_back(ADC_DAC{"Board Temperature", 0, 1, adcUnits2string(TEMPERATURE)});
     }
     return paramList;
 }
@@ -362,7 +348,9 @@ std::vector<pnlBoardControls::ADC_DAC> pnlBoardControls::getBoardDACs(const std:
     std::vector<ADC_DAC> paramList;
     if(boardID == GetDeviceName(LMS_DEV_LIMESDR)
         || boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE)
-        || boardID == GetDeviceName(LMS_DEV_QSPARK))
+        || boardID == GetDeviceName(LMS_DEV_LIMESDR_QPCIE)
+        || boardID == GetDeviceName(LMS_DEV_LIMESDR_USB_SP)
+        || boardID == GetDeviceName(LMS_DEV_LMS7002M_ULTIMATE_EVB))
     {
         ADC_DAC dacVoltage;
         dacVoltage.name = "DAC";
@@ -452,13 +440,21 @@ void pnlBoardControls::SetupControls(const std::string &boardID)
         additionalControls = pnl;
         sizerAdditionalControls->Add(additionalControls);
     }
-    else if(boardID == GetDeviceName(LMS_DEV_LIMESDR) || boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE))
+    else if(boardID == GetDeviceName(LMS_DEV_LIMESDR)
+         || boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE))
     {
         pnlLimeSDR* pnl = new pnlLimeSDR(this, wxNewId());
         pnl->Initialize(lmsControl);
         additionalControls = pnl;
         sizerAdditionalControls->Add(additionalControls);
     }
+    else if(boardID == GetDeviceName(LMS_DEV_LMS7002M_ULTIMATE_EVB))
+    {
+        pnlUltimateEVB* pnl = new pnlUltimateEVB(this, wxNewId());
+        pnl->Initialize(lmsControl);
+        additionalControls = pnl;
+        sizerAdditionalControls->Add(additionalControls);
+    }
 
     Layout();
     Fit();
@@ -518,7 +514,8 @@ void pnlBoardControls::OnCustomRead(wxCommandEvent& event)
     }
 
     txtCustomUnitsRd->SetLabel(units);
-    txtCustomValueRd->SetLabel(wxString::Format(_("%f"), value));
+    txtCustomValueRd->SetLabel(wxString::Format(_("%1.1f"), value));
+
 }
 
 void pnlBoardControls::OnCustomWrite(wxCommandEvent& event)
diff --git a/src/lms7002_wxgui/pnlBoardControls.h b/src/lms7002_wxgui/pnlBoardControls.h
index 7120170..2ba8888 100644
--- a/src/lms7002_wxgui/pnlBoardControls.h
+++ b/src/lms7002_wxgui/pnlBoardControls.h
@@ -33,7 +33,7 @@ class pnlBoardControls : public wxFrame
         struct ADC_DAC
         {
             std::string name;
-            int16_t value;
+            double value;
             uint8_t channel;
             std::string units;
             int8_t powerOf10;
diff --git a/src/lms7002m/CalibrationCache.cpp b/src/lms7002m/CalibrationCache.cpp
index 6030f6e..a63e1c0 100644
--- a/src/lms7002m/CalibrationCache.cpp
+++ b/src/lms7002m/CalibrationCache.cpp
@@ -1,5 +1,6 @@
 #include "CalibrationCache.h"
 #include "ErrorReporting.h"
+#include "SystemResources.h"
 #include <fstream>
 #include <sstream>
 #include <iostream>
@@ -10,13 +11,11 @@
 #include <cmath>
 #ifndef __unix__
     #include <Windows.h>
-    #include <Shlobj.h>
 #endif
 using namespace std;
 using namespace lime;
 
 std::string CalibrationCache::cachePath = "";
-static const char* limeSuiteDirName = ".limesuite";
 static const char* cacheFilename = "LMS7002M_cache_values.db";
 
 int CalibrationCache::instanceCount = 0;
@@ -32,26 +31,8 @@ CalibrationCache::CalibrationCache()
 {
     if(instanceCount == 0)
     {
-        std::string limeSuiteDir;
-        std::string homeDir;
-#ifdef __unix__
-        homeDir = getenv("HOME");
-        //check if HOME variable is set
-        if (homeDir.size() == 0)
-        {
-            printf("HOME variable is not set\n");
-            homeDir = "/tmp"; //home not defined move to temp
-        }
-#else
-        CHAR path[MAX_PATH];
-        if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, path)) != S_OK)
-        {
-            printf("HOME variable is not set\n");
-            GetTempPathA(MAX_PATH, path); //home not defined move to temp
-        }
-        homeDir = path;
-#endif
-        limeSuiteDir = homeDir + "/" + limeSuiteDirName;
+        std::string limeSuiteDir = lime::getConfigDirectory();
+
         //check if limesuite directory exists
         struct stat info;
         if( stat( limeSuiteDir.c_str(), &info ) != 0 )
diff --git a/src/lms7002m/LMS7002M.cpp b/src/lms7002m/LMS7002M.cpp
index d813222..39a8e69 100644
--- a/src/lms7002m/LMS7002M.cpp
+++ b/src/lms7002m/LMS7002M.cpp
@@ -37,7 +37,7 @@ using namespace lime;
 #include "MCU_BD.h"
 
 float_type LMS7002M::gVCO_frequency_table[3][2] = { { 3800e6, 5222e6 }, { 4961e6, 6754e6 }, {6306e6, 7714e6} };
-float_type LMS7002M::gCGEN_VCO_frequencies[2] = {1950e6, 2700e6};
+float_type LMS7002M::gCGEN_VCO_frequencies[2] = {1950e6, 2900e6};
 
 ///define for parameter enumeration if prefix might be needed
 extern std::vector<const LMS7Parameter*> LMS7parameterList;
@@ -1028,9 +1028,9 @@ float_type LMS7002M::GetReferenceClk_SX(bool tx)
 */
 float_type LMS7002M::GetFrequencyCGEN()
 {
-    float_type dMul = (GetReferenceClk_SX(Rx)/2.0)/(Get_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN))+1); //DIV_OUTCH_CGEN
-    uint16_t gINT = Get_SPI_Reg_bits(0x0088, 13, 0); //read whole register to reduce SPI transfers
-    uint32_t gFRAC = ((gINT & 0xF) * 65536) | Get_SPI_Reg_bits(0x0087, 15, 0);
+    float_type dMul = (GetReferenceClk_SX(Rx)/2.0)/(Get_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN), true)+1); //DIV_OUTCH_CGEN
+    uint16_t gINT = Get_SPI_Reg_bits(0x0088, 13, 0, true); //read whole register to reduce SPI transfers
+    uint32_t gFRAC = ((gINT & 0xF) * 65536) | Get_SPI_Reg_bits(0x0087, 15, 0, true);
     return dMul * (((gINT>>4) + 1 + gFRAC/1048576.0));
 }
 
@@ -1175,7 +1175,7 @@ bool LMS7002M::GetSXLocked(bool tx)
     @return 0-success, other-failure
 */
 int LMS7002M::TuneVCO(VCO_Module module) // 0-cgen, 1-SXR, 2-SXT
-{   
+{
     auto settlingTime = chrono::microseconds(50); //can be lower
     struct CSWInteval
     {
diff --git a/src/lms7002m/LMS7002M_RegistersMap.cpp b/src/lms7002m/LMS7002M_RegistersMap.cpp
index 96586ee..681f82b 100644
--- a/src/lms7002m/LMS7002M_RegistersMap.cpp
+++ b/src/lms7002m/LMS7002M_RegistersMap.cpp
@@ -56,11 +56,13 @@ void LMS7002M_RegistersMap::SetValue(uint8_t channel, const uint16_t address, co
 
 uint16_t LMS7002M_RegistersMap::GetValue(uint8_t channel, uint16_t address) const
 {
-    const std::map<const uint16_t, Register> *regMap;
+    const std::map<const uint16_t, Register> *regMap(nullptr);
     if(channel == 0)
         regMap = &mChannelA;
     else if(channel == 1)
         regMap = &mChannelB;
+    else
+        return 0;
     std::map<const uint16_t, Register>::const_iterator iter;
     iter = regMap->find(address);
     if (iter != regMap->end())
diff --git a/src/lms7002m/LMS7002M_RxTxCalibrations.cpp b/src/lms7002m/LMS7002M_RxTxCalibrations.cpp
index af93069..f76e4bd 100644
--- a/src/lms7002m/LMS7002M_RxTxCalibrations.cpp
+++ b/src/lms7002m/LMS7002M_RxTxCalibrations.cpp
@@ -503,6 +503,8 @@ int LMS7002M::CalibrateTxSetup(float_type bandwidth_Hz, const bool useExtLoopbac
     Modify_SPI_Reg_bits(LMS7param(GFIR2_BYP_RXTSP), 1);
     Modify_SPI_Reg_bits(LMS7param(GFIR1_BYP_RXTSP), 1);
     Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 4); //Decimation HBD ratio
+    if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
 
     //CDS
     Modify_SPI_Reg_bits(LMS7param(CDS_TXATSP), 3);
@@ -868,7 +870,7 @@ int LMS7002M::CalibrateTx(float_type bandwidth_Hz, bool useExtLoopback)
     uint16_t gcorri, gcorrq;
     int16_t dccorri, dccorrq, phaseOffset;
 
-    bool useOnBoardLoopback = (info.deviceName == GetDeviceName(LMS_DEV_LIMESDR) && info.hardwareVersion == "3");
+    bool useOnBoardLoopback = (info.deviceName == GetDeviceName(LMS_DEV_LIMESDR) && std::stoi(info.hardwareVersion) >= 3);
     const char* methodName;
     if(useExtLoopback)
     {
@@ -1254,6 +1256,8 @@ int LMS7002M::CalibrateRxSetup(float_type bandwidth_Hz, const bool useExtLoopbac
         Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP), 1);
         Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 0);
     }
+    if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
 
     //CDS
     Modify_SPI_Reg_bits(LMS7param(CDS_TXATSP), 3);
@@ -1345,6 +1349,8 @@ int LMS7002M::CalibrateRxSetup(float_type bandwidth_Hz, const bool useExtLoopbac
 */
 int LMS7002M::CalibrateRx(float_type bandwidth_Hz, bool useExtLoopback)
 {
+    if(controlPort == nullptr)
+        return ReportError(ENODEV, "Device not connected");
 #ifdef __cplusplus
     auto beginTime = std::chrono::high_resolution_clock::now();
 #endif
@@ -1361,7 +1367,7 @@ int LMS7002M::CalibrateRx(float_type bandwidth_Hz, bool useExtLoopback)
     }
 #endif // ENABLE_CALIBRATION_USING_FFT
     DeviceInfo info = controlPort->GetDeviceInfo();
-    bool useOnBoardLoopback = (info.deviceName == GetDeviceName(LMS_DEV_LIMESDR) && info.hardwareVersion == "3");
+    bool useOnBoardLoopback = (info.deviceName == GetDeviceName(LMS_DEV_LIMESDR) && std::stoi(info.hardwareVersion) >= 3);
     int status;
     verbose_printf(cSquaresLine);
     verbose_printf("Rx calibration using %s %s %s loopback\n",
@@ -1390,11 +1396,11 @@ int LMS7002M::CalibrateRx(float_type bandwidth_Hz, bool useExtLoopback)
                 Get_SPI_Reg_bits(LMS7param(G_LNA_RFE)),
                 Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)));
 
-    int16_t dcoffi;
-    int16_t dcoffq;
-    uint16_t gcorri;
-    uint16_t gcorrq;
-    int16_t phaseOffset;
+    int16_t dcoffi(0);
+    int16_t dcoffq(0);
+    uint16_t gcorri(0);
+    uint16_t gcorrq(0);
+    int16_t phaseOffset(0);
 
     if(useCache)
     {
@@ -1520,7 +1526,10 @@ int LMS7002M::CalibrateRx(float_type bandwidth_Hz, bool useExtLoopback)
 
     CheckSaturationRx(bandwidth_Hz, useExtLoopback);
 
-    Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
+    if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 0);
+    else
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
     Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP), 0);
     SetNCOFrequency(LMS7002M::Rx, 0, bandwidth_Hz/calibUserBwDivider + offsetNCO);
 
@@ -1630,7 +1639,10 @@ void LMS7002M::RestoreAllRegisters()
 
 int LMS7002M::CheckSaturationRx(const float_type bandwidth_Hz, const bool useExtLoopback)
 {
-    Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 0);
+    if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
+    else
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 0);
     Modify_SPI_Reg_bits(LMS7param(CMIX_BYP_RXTSP), 0);
     SetNCOFrequency(LMS7002M::Rx, 0, bandwidth_Hz / calibUserBwDivider - offsetNCO);
 
@@ -1711,7 +1723,7 @@ void LMS7002M::GridSearch(GridSearchParam* args)
     const uint16_t DCOFFaddr = 0x010E;
     const bool rxDC = (args->a.param.address == DCOFFaddr || args->b.param.address == DCOFFaddr);
     uint32_t rssi, minRSSI = ~0;
-    int16_t minI, minQ, i, q;
+    int16_t minI(0), minQ(0), i, q;
 
     for(i=args->a.minValue; i<=args->a.maxValue; ++i)
     {
diff --git a/src/lms7002m/LMS7002M_filtersCalibration.cpp b/src/lms7002m/LMS7002M_filtersCalibration.cpp
index cf57b9c..d6aa34a 100644
--- a/src/lms7002m/LMS7002M_filtersCalibration.cpp
+++ b/src/lms7002m/LMS7002M_filtersCalibration.cpp
@@ -681,6 +681,8 @@ int LMS7002M::TuneRxFilterSetup(const float_type rx_lpf_IF)
     Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 1);
     Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 4);
     Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 0);
+    if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
     SetNCOFrequency(LMS7002M::Rx, 0, 0);
 
     if(ch == 2)
@@ -833,6 +835,8 @@ int LMS7002M::TuneTxFilterSetup(const float_type tx_lpf_IF)
     Modify_SPI_Reg_bits(LMS7param(GFIR1_BYP_RXTSP), 1);
     Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 1);
     Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 4);
+    if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
 
     if(tx_lpf_IF <= TxLPF_RF_LimitLowMid/2)
     {
@@ -945,6 +949,8 @@ int LMS7002M::TuneTxFilterFixedSetup()
     Modify_SPI_Reg_bits(LMS7param(GFIR1_BYP_RXTSP), 1);
     Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 1);
     Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 4);
+    if (Get_SPI_Reg_bits(LMS7_MASK, true) != 0)
+        Modify_SPI_Reg_bits(LMS7param(CMIX_SC_RXTSP), 1);
 
     const float_type rxNCO_freqs[] = {0, 4.4e6, 2.4e6, 4.9e6, 7.4e6, 9.9e6};
     for(int i=0; i<6; ++i)
diff --git a/src/lms7002m/LMS7002M_parameters.cpp b/src/lms7002m/LMS7002M_parameters.cpp
index 88b2b7a..440d552 100644
--- a/src/lms7002m/LMS7002M_parameters.cpp
+++ b/src/lms7002m/LMS7002M_parameters.cpp
@@ -559,7 +559,6 @@ std::vector<const LMS7Parameter*> LMS7parameterList =
 &LMS7_HBD_OVR_RXTSP,
 &LMS7_IQCORR_RXTSP,
 &LMS7_HBD_DLY,
-&LMS7_DCLOOP_BYP,
 &LMS7_DCCORR_AVG_RXTSP,
 &LMS7_GFIR1_L_RXTSP,
 &LMS7_GFIR1_N_RXTSP,
@@ -586,5 +585,155 @@ std::vector<const LMS7Parameter*> LMS7parameterList =
 &LMS7_CAPD,
 &LMS7_DTHBIT_RX,
 &LMS7_SEL_RX,
-&LMS7_MODE_RX
+&LMS7_MODE_RX,
+&LMS7_TRX_GAIN_SRC,
+&LMS7_DCMODE,
+&LMS7_PD_DCDAC_RXB,
+&LMS7_PD_DCDAC_RXA,
+&LMS7_PD_DCDAC_TXB,
+&LMS7_PD_DCDAC_TXA,
+&LMS7_PD_DCCMP_RXB,
+&LMS7_PD_DCCMP_RXA,
+&LMS7_PD_DCCMP_TXB,
+&LMS7_PD_DCCMP_TXA,
+&LMS7_DCCAL_CALSTATUS,
+&LMS7_DCCAL_CMPSTATUS,
+&LMS7_DCCAL_CMPCFG,
+&LMS7_DCCAL_START,
+&LMS7_DCWR_TXAI,
+&LMS7_DCRD_TXAI,
+&LMS7_DC_TXAI,
+&LMS7_DCWR_TXAQ,
+&LMS7_DCRD_TXAQ,
+&LMS7_DC_TXAQ,
+&LMS7_DCWR_TXBI,
+&LMS7_DCRD_TXBI,
+&LMS7_DC_TXBI,
+&LMS7_DCWR_TXBQ,
+&LMS7_DCRD_TXBQ,
+&LMS7_DC_TXBQ,
+&LMS7_DCWR_RXAI,
+&LMS7_DCRD_RXAI,
+&LMS7_DC_RXAI,
+&LMS7_DCWR_RXAQ,
+&LMS7_DCRD_RXAQ,
+&LMS7_DC_RXAQ,
+&LMS7_DCWR_RXBI,
+&LMS7_DCRD_RXBI,
+&LMS7_DC_RXBI,
+&LMS7_DCWR_RXBQ,
+&LMS7_DCRD_RXBQ,
+&LMS7_DC_RXBQ,
+&LMS7_DC_RXCDIV,
+&LMS7_DC_TXCDIV,
+&LMS7_HYSCMP_RXB,
+&LMS7_HYSCMP_RXA,
+&LMS7_HYSCMP_TXB,
+&LMS7_HYSCMP_TXA,
+&LMS7_DAC_CLKDIV,
+&LMS7_RSSI_RSSIMODE,
+&LMS7_RSSI_PD,
+&LMS7_RSSI_CMPSTATUS,
+&LMS7_RSSI_BIAS,
+&LMS7_RSSI_HYSCMP,
+&LMS7_RSSI_CMPCFG,
+&LMS7_RSSI_DAC_VAL,
+&LMS7_RSSI_PDET2_VAL,
+&LMS7_RSSI_PDET1_VAL,
+&LMS7_RSSI_RSSI2_VAL,
+&LMS7_RSSI_RSSI1_VAL,
+&LMS7_RSSI_TREF_VAL,
+&LMS7_RSSI_TVPTAT_VAL,
+&LMS7_RSSIDC_CMPSTATUS,
+&LMS7_RSSIDC_RSEL,
+&LMS7_RSSIDC_HYSCMP,
+&LMS7_RSSIDC_PD,
+&LMS7_RSSIDC_DCO2,
+&LMS7_RSSIDC_DCO1,
+&LMS7_LML2_TRXIQPULSE,
+&LMS7_LML2_SISODDR,
+&LMS7_LML1_TRXIQPULSE,
+&LMS7_LML1_SISODDR,
+&LMS7_MCLK2_DLY,
+&LMS7_MCLK1_DLY,
+&LMS7_MCLK2_INV,
+&LMS7_MCLK1_INV,
+&LMS7_CMIX_GAIN_TXTSP_R3,
+&LMS7_CMIX_GAIN_RXTSP_R3,
+&LMS7_R5_LPF_BYP_TBB,
+&LMS7_CG_IAMP_TBB_R3,
+&LMS7_LOSS_LIN_TXPAD_R3,
+&LMS7_LOSS_MAIN_TXPAD_R3,
+&LMS7_C_CTL_PGA_RBB_R3,
+&LMS7_G_PGA_RBB_R3,
+&LMS7_G_LNA_RFE_R3,
+&LMS7_G_TIA_RFE_R3,
+&LMS7_RZ_CTRL,
+&LMS7_CMPLO_CTRL_SX,
+&LMS7_CMPLO_CTRL_CGEN_R3,
+&LMS7_ISINK_SPIBUFF,
+&LMS7_DCMODE,
+&LMS7_PD_DCDAC_RXB,
+&LMS7_PD_DCDAC_RXA,
+&LMS7_PD_DCDAC_TXB,
+&LMS7_PD_DCDAC_TXA,
+&LMS7_PD_DCCMP_RXB,
+&LMS7_PD_DCCMP_RXA,
+&LMS7_PD_DCCMP_TXB,
+&LMS7_PD_DCCMP_TXA,
+&LMS7_DCCAL_CALSTATUS,
+&LMS7_DCCAL_CMPSTATUS,
+&LMS7_DCCAL_CMPCFG,
+&LMS7_DCCAL_START,
+&LMS7_DCWR_TXAI,
+&LMS7_DCRD_TXAI,
+&LMS7_DC_TXAI,
+&LMS7_DCWR_TXAQ,
+&LMS7_DCRD_TXAQ,
+&LMS7_DC_TXAQ,
+&LMS7_DCWR_TXBI,
+&LMS7_DCRD_TXBI,
+&LMS7_DC_TXBI,
+&LMS7_DCWR_TXBQ,
+&LMS7_DCRD_TXBQ,
+&LMS7_DC_TXBQ,
+&LMS7_DCWR_RXAI,
+&LMS7_DCRD_RXAI,
+&LMS7_DC_RXAI,
+&LMS7_DCWR_RXAQ,
+&LMS7_DCRD_RXAQ,
+&LMS7_DC_RXAQ,
+&LMS7_DCWR_RXBI,
+&LMS7_DCRD_RXBI,
+&LMS7_DC_RXBI,
+&LMS7_DCWR_RXBQ,
+&LMS7_DCRD_RXBQ,
+&LMS7_DC_RXBQ,
+&LMS7_DC_RXCDIV,
+&LMS7_DC_TXCDIV,
+&LMS7_HYSCMP_RXB,
+&LMS7_HYSCMP_RXA,
+&LMS7_HYSCMP_TXB,
+&LMS7_HYSCMP_TXA,
+&LMS7_DAC_CLKDIV,
+&LMS7_RSSI_RSSIMODE,
+&LMS7_RSSI_PD,
+&LMS7_RSSI_CMPSTATUS,
+&LMS7_RSSI_BIAS,
+&LMS7_RSSI_HYSCMP,
+&LMS7_RSSI_CMPCFG,
+&LMS7_RSSI_DAC_VAL,
+&LMS7_RSSI_PDET2_VAL,
+&LMS7_RSSI_PDET1_VAL,
+&LMS7_RSSI_RSSI2_VAL,
+&LMS7_RSSI_RSSI1_VAL,
+&LMS7_RSSI_TREF_VAL,
+&LMS7_RSSI_TVPTAT_VAL,
+&LMS7_RSSIDC_CMPSTATUS,
+&LMS7_RSSIDC_RSEL,
+&LMS7_RSSIDC_HYSCMP,
+&LMS7_RSSIDC_PD,
+&LMS7_RSSIDC_DCO2,
+&LMS7_RSSIDC_DCO1,
+&LMS7_DCLOOP_STOP,
 };
diff --git a/src/lms7002m/LMS7002M_parameters.h b/src/lms7002m/LMS7002M_parameters.h
index fb8a2b8..2ba2cbf 100644
--- a/src/lms7002m/LMS7002M_parameters.h
+++ b/src/lms7002m/LMS7002M_parameters.h
@@ -24,7 +24,7 @@ struct LMS7Parameter
     const char* tooltip;
 };
 
-int LMS7ParameterCompare(LMS7Parameter a, LMS7Parameter b);
+int LMS7ParameterCompare(struct LMS7Parameter a, struct LMS7Parameter b);
 
 static const struct LMS7Parameter LMS7_LRST_TX_B = { 0x0020, 15, 15, 1, "LRST_TX_B", "Resets all the logic registers to the default state for Tx MIMO channel B" };
 static const struct LMS7Parameter LMS7_MRST_TX_B = { 0x0020, 14, 14, 1, "MRST_TX_B", "Resets all the configuration memory to the default state for Tx MIMO channel B" };
@@ -575,7 +575,7 @@ static const struct LMS7Parameter LMS7_MODE_TX = { 0x0240, 0, 0, 0, "MODE_TX", "
 static const struct LMS7Parameter LMS7_PHO_TX = { 0x0241, 15, 0, 0, "PHO_TX", "" };
 static const struct LMS7Parameter LMS7_CAPTURE = { 0x0400, 15, 15, 0, "CAPTURE", "" };
 static const struct LMS7Parameter LMS7_CAPSEL = { 0x0400, 14, 13, 0, "CAPSEL", "" };
-static const struct LMS7Parameter LMS7_CAPSEL_ADC = { 0x0400, 12, 12, 0, "CAPSEL_ADC", "" };
+static const struct LMS7Parameter LMS7_CAPSEL_ADC = { 0x0400, 12, 12, 0, "CAPSEL_ADC", "Selects ADC value source to be captured" };
 static const struct LMS7Parameter LMS7_TSGFC_RXTSP = { 0x0400, 9, 9, 0, "TSGFC_RXTSP", "TSG full scale control" };
 static const struct LMS7Parameter LMS7_TSGFCW_RXTSP = { 0x0400, 8, 7, 1, "TSGFCW_RXTSP", "Set frequency of TSG's NCO" };
 static const struct LMS7Parameter LMS7_TSGDCLDQ_RXTSP = { 0x0400, 6, 6, 0, "TSGDCLDQ_RXTSP", "" };
@@ -590,7 +590,6 @@ static const struct LMS7Parameter LMS7_GCORRI_RXTSP = { 0x0402, 10, 0, 2047, "GC
 static const struct LMS7Parameter LMS7_HBD_OVR_RXTSP = { 0x0403, 14, 12, 0, "HBD_OVR_RXTSP", "HBD interpolation ratio. Interpolation ratio is 2HBD_OVR+1" };
 static const struct LMS7Parameter LMS7_IQCORR_RXTSP = { 0x0403, 11, 0, 0, "IQCORR_RXTSP", "Phase corrector value (tan(Alpha/2)). Integer, 2's complement" };
 static const struct LMS7Parameter LMS7_HBD_DLY = { 0x0404, 15, 13, 0, "HBD_DLY", "" };
-static const struct LMS7Parameter LMS7_DCLOOP_BYP = { 0x0404, 8, 8, 0, "DCLOOP_BYP", "" };
 static const struct LMS7Parameter LMS7_DCCORR_AVG_RXTSP = { 0x0404, 2, 0, 0, "DCCORR_AVG_RXTSP", "Number of samples to average for Automatic DC corrector. Number of samples to average is 2DCCORR_AVG + 12" };
 static const struct LMS7Parameter LMS7_GFIR1_L_RXTSP = { 0x0405, 10, 8, 0, "GFIR1_L_RXTSP", "Parameter l of GFIR1 (l = roundUp(CoeffN/5)-1). Unsigned integer" };
 static const struct LMS7Parameter LMS7_GFIR1_N_RXTSP = { 0x0405, 7, 0, 0, "GFIR1_N_RXTSP", "Clock division ratio of GFIR1 is GFIR1_N + 1. Unsigned integer" };
@@ -619,6 +618,97 @@ static const struct LMS7Parameter LMS7_DTHBIT_RX = { 0x0440, 8, 5, 1, "DTHBIT_RX
 static const struct LMS7Parameter LMS7_SEL_RX = { 0x0440, 4, 1, 0, "SEL_RX", "" };
 static const struct LMS7Parameter LMS7_MODE_RX = { 0x0440, 0, 0, 0, "MODE_RX", "" };
 static const struct LMS7Parameter LMS7_PHO_RX = { 0x0441, 15, 0, 0, "PHO_RX", "" };
+static const struct LMS7Parameter LMS7_TRX_GAIN_SRC = { 0x0081, 15, 15, 0, "TRX_GAIN_SRC", "Alternative TRX gain source select" };
+
+static const struct LMS7Parameter LMS7_LML2_TRXIQPULSE = { 0x0022, 15, 15, 0, "LML2_TRXIQPULSE", "TRXIQPULSE mode selection for LML Port 2" };
+static const struct LMS7Parameter LMS7_LML2_SISODDR = { 0x0022, 14, 14, 0, "LML2_SISODDR", "SISODDR mode selection for LML Port 2" };
+static const struct LMS7Parameter LMS7_LML1_TRXIQPULSE = { 0x0022, 13, 13, 0, "LML1_TRXIQPULSE", "TRXIQPULSE mode selection for LML Port 1" };
+static const struct LMS7Parameter LMS7_LML1_SISODDR = { 0x0022, 12, 12, 0, "LML1_SISODDR", "SISODDR mode selection for LML Port 1" };
+static const struct LMS7Parameter LMS7_MCLK2_DLY = { 0x002B, 13, 12, 0, "MCLK2_DLY", "MCLK2 clock internal delay." };
+static const struct LMS7Parameter LMS7_MCLK1_DLY = { 0x002B, 11, 10, 0, "MCLK1_DLY", "MCLK1 clock internal delay." };
+static const struct LMS7Parameter LMS7_MCLK2_INV = { 0x002B, 9, 9, 0, "MCLK2_INV", "MCLK2 clock inversion." };
+static const struct LMS7Parameter LMS7_MCLK1_INV = { 0x002B, 8, 8, 0, "MCLK1_INV", "MCLK1 clock inversion." };
+
+static const struct LMS7Parameter LMS7_CMIX_GAIN_TXTSP_R3 = { 0x0208, 12, 12, 0, "CMIX_GAIN_TXTSP_R3", "Gain of CMIX output, most significant part" };
+static const struct LMS7Parameter LMS7_CMIX_GAIN_RXTSP_R3 = { 0x040C, 12, 12, 0, "CMIX_GAIN_RXTSP_R3", "Gain of CMIX output, most significant part" };
+static const struct LMS7Parameter LMS7_R5_LPF_BYP_TBB = { 0x010B, 0, 0, 0, "R5_LPF_BYP_TBB", "Bypasses LPFS5_TBB low pass real-pole filter capacitor banks" };
+static const struct LMS7Parameter LMS7_CG_IAMP_TBB_R3 = { 0x0125, 15, 10, 37, "CG_IAMP_TBB_R3", ""};
+static const struct LMS7Parameter LMS7_LOSS_LIN_TXPAD_R3 = { 0x0125, 9, 5, 0, "LOSS_LIN_TXPAD_R3", ""};
+static const struct LMS7Parameter LMS7_LOSS_MAIN_TXPAD_R3 = { 0x0125, 4, 0, 0, "LOSS_MAIN_TXPAD_R3", ""};
+static const struct LMS7Parameter LMS7_C_CTL_PGA_RBB_R3 = { 0x0126, 12, 11, 2, "C_CTL_PGA_RBB_R3", ""};
+static const struct LMS7Parameter LMS7_G_PGA_RBB_R3 = { 0x0126, 10, 6, 11, "G_PGA_RBB_R3", ""};
+static const struct LMS7Parameter LMS7_G_LNA_RFE_R3 = { 0x0126, 5, 2, 15, "G_LNA_RFE_R3", ""};
+static const struct LMS7Parameter LMS7_G_TIA_RFE_R3 = { 0x0126, 1, 0, 3, "G_TIA_RFE_R3", ""};
+static const struct LMS7Parameter LMS7_RZ_CTRL = { 0x0122, 15, 14, 0, "RZ_CTRL", "Controls the PLL LPF zero resistor values"};
+static const struct LMS7Parameter LMS7_CMPLO_CTRL_SX = { 0x0122, 13, 13, 0, "CMPLO_CTRL_SX", "Controls the SXR/SXT PLL VCO comparator low treshold value"};
+static const struct LMS7Parameter LMS7_CMPLO_CTRL_CGEN_R3 = { 0x008B, 14, 14, 0, "CMPLO_CTRL_CGEN", "Controls the CGEN PLL VCO comparator low treshold value"};
+static const struct LMS7Parameter LMS7_ISINK_SPIBUFF = { 0x00A6, 15, 13, 0, "ISINK_SPI_BUFF", "Controls the SPIBUF LDO output resistive load"};
+
+static const struct LMS7Parameter LMS7_DCMODE = { 0x05C0, 15, 15, 0, "DCMODE", "DC calibration mode" };
+static const struct LMS7Parameter LMS7_PD_DCDAC_RXB = { 0x05C0, 7, 7, 0, "PD_DCDAC_RXB", ""};
+static const struct LMS7Parameter LMS7_PD_DCDAC_RXA = { 0x05C0, 6, 6, 0, "PD_DCDAC_RXA", ""};
+static const struct LMS7Parameter LMS7_PD_DCDAC_TXB = { 0x05C0, 5, 5, 0, "PD_DCDAC_TXB", ""};
+static const struct LMS7Parameter LMS7_PD_DCDAC_TXA = { 0x05C0, 4, 4, 0, "PD_DCDAC_TXA", ""};
+static const struct LMS7Parameter LMS7_PD_DCCMP_RXB = { 0x05C0, 3, 3, 0, "PD_DCCMP_RXB", ""};
+static const struct LMS7Parameter LMS7_PD_DCCMP_RXA = { 0x05C0, 2, 2, 0, "PD_DCCMP_RXA", ""};
+static const struct LMS7Parameter LMS7_PD_DCCMP_TXB = { 0x05C0, 1, 1, 0, "PD_DCCMP_TXB", ""};
+static const struct LMS7Parameter LMS7_PD_DCCMP_TXA = { 0x05C0, 0, 0, 0, "PD_DCCMP_TXA", ""};
+static const struct LMS7Parameter LMS7_DCCAL_CALSTATUS = { 0x05C1, 15, 8, 0, "DCCAL_CALSTATUS", ""};
+static const struct LMS7Parameter LMS7_DCCAL_CMPSTATUS = { 0x05C1, 7, 0, 0, "DCCAL_CMPSTATUS", ""};
+static const struct LMS7Parameter LMS7_DCCAL_CMPCFG = { 0x05C2, 15, 8, 0, "DCCAL_CMPCFG", ""};
+static const struct LMS7Parameter LMS7_DCCAL_START = { 0x05C2, 7, 0, 0, "DCCAL_START", ""};
+static const struct LMS7Parameter LMS7_DCWR_TXAI = { 0x05C3, 15, 15, 0, "DCWR_TXAI", ""};
+static const struct LMS7Parameter LMS7_DCRD_TXAI = { 0x05C3, 14, 14, 0, "DCRD_TXAI", ""};
+static const struct LMS7Parameter LMS7_DC_TXAI = { 0x05C3, 10, 0, 0, "DC_TXAI", ""};
+static const struct LMS7Parameter LMS7_DCWR_TXAQ = { 0x05C4, 15, 15, 0, "DCWR_TXAQ", ""};
+static const struct LMS7Parameter LMS7_DCRD_TXAQ = { 0x05C4, 14, 14, 0, "DCRD_TXAQ", ""};
+static const struct LMS7Parameter LMS7_DC_TXAQ = { 0x05C4, 10, 0, 0, "DC_TXAQ", ""};
+static const struct LMS7Parameter LMS7_DCWR_TXBI = { 0x05C5, 15, 15, 0, "DCWR_TXBI", ""};
+static const struct LMS7Parameter LMS7_DCRD_TXBI = { 0x05C5, 14, 14, 0, "DCRD_TXBI", ""};
+static const struct LMS7Parameter LMS7_DC_TXBI = { 0x05C5, 10, 0, 0, "DC_TXBI", ""};
+static const struct LMS7Parameter LMS7_DCWR_TXBQ = { 0x05C6, 15, 15, 0, "DCWR_TXBQ", ""};
+static const struct LMS7Parameter LMS7_DCRD_TXBQ = { 0x05C6, 14, 14, 0, "DCRD_TXBQ", ""};
+static const struct LMS7Parameter LMS7_DC_TXBQ = { 0x05C6, 10, 0, 0, "DC_TXBQ", ""};
+static const struct LMS7Parameter LMS7_DCWR_RXAI = { 0x05C7, 15, 15, 0, "DCWR_RXAI", ""};
+static const struct LMS7Parameter LMS7_DCRD_RXAI = { 0x05C7, 14, 14, 0, "DCRD_RXAI", ""};
+static const struct LMS7Parameter LMS7_DC_RXAI = { 0x05C7, 10, 0, 0, "DC_RXAI", ""};
+static const struct LMS7Parameter LMS7_DCWR_RXAQ = { 0x05C8, 15, 15, 0, "DCWR_RXAQ", ""};
+static const struct LMS7Parameter LMS7_DCRD_RXAQ = { 0x05C8, 14, 14, 0, "DCRD_RXAQ", ""};
+static const struct LMS7Parameter LMS7_DC_RXAQ = { 0x05C8, 10, 0, 0, "DC_RXAQ", ""};
+static const struct LMS7Parameter LMS7_DCWR_RXBI = { 0x05C9, 15, 15, 0, "DCWR_RXBI", ""};
+static const struct LMS7Parameter LMS7_DCRD_RXBI = { 0x05C9, 14, 14, 0, "DCRD_RXBI", ""};
+static const struct LMS7Parameter LMS7_DC_RXBI = { 0x05C9, 10, 0, 0, "DC_RXBI", ""};
+static const struct LMS7Parameter LMS7_DCWR_RXBQ = { 0x05CA, 15, 15, 0, "DCWR_RXBQ", ""};
+static const struct LMS7Parameter LMS7_DCRD_RXBQ = { 0x05CA, 14, 14, 0, "DCRD_RXBQ", ""};
+static const struct LMS7Parameter LMS7_DC_RXBQ = { 0x05CA, 10, 0, 0, "DC_RXBQ", ""};
+static const struct LMS7Parameter LMS7_DC_RXCDIV = { 0x05CB, 15, 8, 0, "DC_RXCDIV", "Clock division ratio for Rx DC calibration loop"};
+static const struct LMS7Parameter LMS7_DC_TXCDIV = { 0x05CB, 7, 0, 0, "DC_TXCDIV", "Clock division ratio for Tx DC calibration loop"};
+static const struct LMS7Parameter LMS7_HYSCMP_RXB = { 0x05CC, 11, 9, 0, "HYSCMP_RXB", "Comparator hysteresis control, RXB channel"};
+static const struct LMS7Parameter LMS7_HYSCMP_RXA = { 0x05CC, 8, 6, 0, "HYSCMP_RXA", "Comparator hysteresis control, RXA channel"};
+static const struct LMS7Parameter LMS7_HYSCMP_TXB = { 0x05CC, 5, 3, 0, "HYSCMP_TXB", "Comparator hysteresis control, TXB channel"};
+static const struct LMS7Parameter LMS7_HYSCMP_TXA = { 0x05CC, 2, 0, 0, "HYSCMP_TXA", "Comparator hysteresis control, TXA channel"};
+static const struct LMS7Parameter LMS7_DAC_CLKDIV = { 0x0600, 15, 8, 15, "DAC_CLKDIV", "Clock division ratio for measurement loop" };
+static const struct LMS7Parameter LMS7_RSSI_RSSIMODE = { 0x0600, 1, 1, 0, "RSSI_RSSIMODE", ""};
+static const struct LMS7Parameter LMS7_RSSI_PD = { 0x0600, 0, 0, 0, "RSSI_PD", ""};
+static const struct LMS7Parameter LMS7_RSSI_CMPSTATUS = { 0x0601, 5, 0, 0, "RSSI_CMPSTATUS", ""};
+static const struct LMS7Parameter LMS7_RSSI_BIAS = { 0x0602, 13, 9, 1<<4, "RSSI_BIAS", "Controls the reference bias current of the test ADC"};
+static const struct LMS7Parameter LMS7_RSSI_HYSCMP = { 0x0602, 8, 6, 0, "RSSI_HYSCMP", "Comparator hysteresis control"};
+static const struct LMS7Parameter LMS7_RSSI_CMPCFG = { 0x0602, 5, 0, 0, "RSSI_CMPCFG", "Comparator configuration"};
+static const struct LMS7Parameter LMS7_RSSI_DAC_VAL = { 0x0603, 7, 0, 0, "RSSI_DAC_VAL", "Stores the value to be written to the DAC, when MODE = 1"};
+static const struct LMS7Parameter LMS7_RSSI_PDET2_VAL = { 0x0604, 15, 8, 0, "RSSI_PDET2_VAL", "Stores the value of Power Detector 2"};
+static const struct LMS7Parameter LMS7_RSSI_PDET1_VAL = { 0x0604, 7, 0, 0, "RSSI_PDET1_VAL", "Stores the value of Power Detector 1"};
+static const struct LMS7Parameter LMS7_RSSI_RSSI2_VAL = { 0x0605, 15, 8, 0, "RSSI_RSSI2_VAL", "Stores the value of RSSI 2"};
+static const struct LMS7Parameter LMS7_RSSI_RSSI1_VAL = { 0x0605, 7, 0, 0, "RSSI_RSSI1_VAL", "Stores the value of RSSI 1"};
+static const struct LMS7Parameter LMS7_RSSI_TREF_VAL = { 0x0606, 15, 8, 0, "RSSI_TREF_CAL", "Stores the temperature reference value"};
+static const struct LMS7Parameter LMS7_RSSI_TVPTAT_VAL = { 0x0606, 7, 0, 0, "RSSI_TVPTAT_VAL", "Stores the voltage proportional to absolute temperature value"};
+static const struct LMS7Parameter LMS7_RSSIDC_CMPSTATUS = { 0x0640, 15, 15, 0, "RSSIDC_CMPSTATUS", ""};
+static const struct LMS7Parameter LMS7_RSSIDC_RSEL = { 0x0640, 8, 4, 10, "RSSIDC_RSEL", "Reference voltage for the RSSI output comparator"};
+static const struct LMS7Parameter LMS7_RSSIDC_HYSCMP = { 0x0640, 3, 1, 0, "RSSIDC_HYSCMP", ""};
+static const struct LMS7Parameter LMS7_RSSIDC_PD = { 0x0640, 0, 0, 0, "RSSIDC_PD", "Power down modules"};
+static const struct LMS7Parameter LMS7_RSSIDC_DCO2 = { 0x0641, 13, 7, 32, "RSSIDC_DCO2", "Value of RSSI offset DAC2"};
+static const struct LMS7Parameter LMS7_RSSIDC_DCO1 = { 0x0641, 6, 0, 32, "RSSIDC_DCO1", "Value of RSSI offset DAC1"};
+static const struct LMS7Parameter LMS7_DCLOOP_STOP = { 0x040C, 8, 8, 0, "DCLOOP_STOP", "RxDC tracking loop stop" };
+
 //}
 
 #ifdef __cplusplus
diff --git a/src/lms7002m_mcu/MCU_BD.cpp b/src/lms7002m_mcu/MCU_BD.cpp
index 0724a49..c11d0a9 100644
--- a/src/lms7002m_mcu/MCU_BD.cpp
+++ b/src/lms7002m_mcu/MCU_BD.cpp
@@ -570,6 +570,7 @@ int MCU_BD::Program_MCU(int m_iMode1, int m_iMode0)
     case 1: mode = IConnection::MCU_PROG_MODE::EEPROM_AND_SRAM; break;
     case 2: mode = IConnection::MCU_PROG_MODE::SRAM; break;
     case 3: mode = IConnection::MCU_PROG_MODE::BOOT_SRAM_FROM_EEPROM; break;
+    default: mode = IConnection::MCU_PROG_MODE::RESET; break;
     }
     if(m_serPort)
         return m_serPort->ProgramMCU(byte_array, byte_array_size, mode, callback);
diff --git a/src/lms7002m_mcu/MCU_File.h b/src/lms7002m_mcu/MCU_File.h
index 70f1f66..61235be 100644
--- a/src/lms7002m_mcu/MCU_File.h
+++ b/src/lms7002m_mcu/MCU_File.h
@@ -89,7 +89,7 @@ public:
 	{
 		char szLine[1024];
 		bool formatDetected = false;
-		bool intel;
+		bool intel = false;
 		bool endSeen = false;
 		bool linear = true;				// Only used for intel hex
 		unsigned long addressBase = 0;	// Only used for intel hex
diff --git a/src/lms7suiteAppFrame.cpp b/src/lms7suiteAppFrame.cpp
index 6955617..6dad71f 100644
--- a/src/lms7suiteAppFrame.cpp
+++ b/src/lms7suiteAppFrame.cpp
@@ -281,7 +281,9 @@ void LMS7SuiteAppFrame::OnControlBoardConnect(wxCommandEvent& event)
         wxString controlDev = _("Control port: ");
 
         controlDev.Append(info->deviceName);
-        controlDev.Append(wxString::Format(_(" FW:%s HW:%s Protocol:%s GW:%s GW_rev:%s"), info->firmwareVersion, info->hardwareVersion, info->protocolVersion, info->gatewareVersion, info->gatewareRevision));
+        double refClk;
+        LMS_GetClockFreq(lmsControl,LMS_CLOCK_REF, &refClk);
+        controlDev.Append(wxString::Format(_(" FW:%s HW:%s Protocol:%s GW:%s GW_rev:%s Ref Clk: %1.2f MHz"), info->firmwareVersion, info->hardwareVersion, info->protocolVersion, info->gatewareVersion, info->gatewareRevision, refClk/1e6));
         statusBar->SetStatusText(controlDev, controlCollumn);
 
         LMS_SetDataLogCallback(lmsControl, &LMS7SuiteAppFrame::OnLogDataTransfer);
@@ -414,7 +416,7 @@ void LMS7SuiteAppFrame::OnShowPrograming(wxCommandEvent& event)
         programmer->Show();
     else
     {
-        programmer = new LMS_Programing_wxgui(this, wxNewId(), _("Programing"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE);
+        programmer = new LMS_Programing_wxgui(this, wxNewId(), _("Programming"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE);
         programmer->SetConnection(lmsControl);
         programmer->Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(LMS7SuiteAppFrame::OnProgramingClose), NULL, this);
         programmer->Show();
diff --git a/src/lms7suiteApp_gui.cpp b/src/lms7suiteApp_gui.cpp
index a2ff92e..19602e1 100644
--- a/src/lms7suiteApp_gui.cpp
+++ b/src/lms7suiteApp_gui.cpp
@@ -57,7 +57,7 @@ AppFrame_view::AppFrame_view( wxWindow* parent, wxWindowID id, const wxString& t
 	mnuModules->Append( mnuSi5351C );
 	
 	wxMenuItem* mnuPrograming;
-	mnuPrograming = new wxMenuItem( mnuModules, wxID_ANY, wxString( wxT("Programing") ) , wxEmptyString, wxITEM_NORMAL );
+	mnuPrograming = new wxMenuItem( mnuModules, wxID_ANY, wxString( wxT("Programming") ) , wxEmptyString, wxITEM_NORMAL );
 	mnuModules->Append( mnuPrograming );
 	
 	wxMenuItem* mnuRFSpark;
diff --git a/src/oglGraph/OpenGLGraph.cpp b/src/oglGraph/OpenGLGraph.cpp
index 64c3f70..0e6df2a 100644
--- a/src/oglGraph/OpenGLGraph.cpp
+++ b/src/oglGraph/OpenGLGraph.cpp
@@ -1628,8 +1628,8 @@ void OpenGLGraph::onReset(wxCommandEvent& event)
 bool OpenGLGraph::SearchPeak()
 {
     bool found = false;
-    double maxValue;
-    unsigned maxPos;
+    double maxValue(0.0);
+    unsigned maxPos(0);
     //Init max value
     for(unsigned int i=0; i<series.size(); i++)
     {
diff --git a/src/oglGraph/dlgMarkers.cpp b/src/oglGraph/dlgMarkers.cpp
index 1d625ad..b08dcbf 100644
--- a/src/oglGraph/dlgMarkers.cpp
+++ b/src/oglGraph/dlgMarkers.cpp
@@ -103,9 +103,9 @@ void dlgMarkers::AddMarker(int id)
 void dlgMarkers::AddDeltas()
 {
     wxArrayString selections;
-    for(size_t i=0; i<parent_graph->markers.size(); ++i)
+    for(unsigned i=0; i<parent_graph->markers.size(); ++i)
     {
-        selections.push_back(wxString::Format("M%i", i));
+        selections.push_back(wxString::Format("M%u", i));
     }
     for(int i=0; i<5; ++i)
     {
diff --git a/src/protocols/ILimeSDRStreaming.cpp b/src/protocols/ILimeSDRStreaming.cpp
index 3521a2b..e4bfdc3 100644
--- a/src/protocols/ILimeSDRStreaming.cpp
+++ b/src/protocols/ILimeSDRStreaming.cpp
@@ -23,8 +23,7 @@ int ILimeSDRStreaming::SetupStream(size_t& streamID, const StreamConfig& config)
     if(rxRunning.load() == true || txRunning.load() == true)
         return ReportError(EPERM, "All streams must be stopped before doing setups");
     streamID = ~0;
-    StreamChannel* stream = new StreamChannel(this);
-    stream->config = config;
+    StreamChannel* stream = new StreamChannel(this,config);
     //TODO check for duplicate streams
     if(config.isTx)
         mTxStreams.push_back(stream);
@@ -181,24 +180,27 @@ double ILimeSDRStreaming::GetHardwareTimestampRate(void)
     return mExpectedSampleRate;
 }
 
-int ILimeSDRStreaming::UpdateThreads()
+int ILimeSDRStreaming::UpdateThreads(bool stopAll)
 {
     bool needTx = false;
     bool needRx = false;
 
     //check which threads are needed
-    for(auto i : mRxStreams)
-        if(i->IsActive())
-        {
-            needRx = true;
-            break;
-        }
-    for(auto i : mTxStreams)
-        if(i->IsActive())
-        {
-            needTx = true;
-            break;
-        }
+    if (!stopAll)
+    {
+        for(auto i : mRxStreams)
+            if(i->IsActive())
+            {
+                needRx = true;
+                break;
+            }
+        for(auto i : mTxStreams)
+            if(i->IsActive())
+            {
+                needTx = true;
+                break;
+            }
+    }
 
     //stop threads if not needed
     if(not needTx and txRunning.load())
@@ -297,7 +299,6 @@ int ILimeSDRStreaming::UpdateThreads()
             lmsControl.Modify_SPI_Reg_bits(LMS7param(LML2_S3S), 3, fromChip);
         }
 
-
         if(channelEnables & 0x2) //enable MIMO
         {
             uint16_t macBck = lmsControl.Get_SPI_Reg_bits(LMS7param(MAC), fromChip);
@@ -352,11 +353,22 @@ int ILimeSDRStreaming::UpdateThreads()
 
 
 //-----------------------------------------------------------------------------
-ILimeSDRStreaming::StreamChannel::StreamChannel(lime::IConnection* port) :
+ILimeSDRStreaming::StreamChannel::StreamChannel(lime::IConnection* port, StreamConfig conf) :
     mActive(false)
 {
     this->port = dynamic_cast<ILimeSDRStreaming*>(port);
-    fifo = new RingFIFO(1024*8);
+    this->config = conf;
+
+    if (this->config.bufferLength == 0) //default size
+        this->config.bufferLength = 1024*8*SamplesPacket::maxSamplesInPacket;
+    else
+    {
+        size_t fifoSize = 64;
+        while(fifoSize < conf.bufferLength/SamplesPacket::maxSamplesInPacket)
+            fifoSize <<= 1;
+        this->config.bufferLength = fifoSize*SamplesPacket::maxSamplesInPacket;
+    }
+    fifo = new RingFIFO(this->config.bufferLength);
 }
 
 ILimeSDRStreaming::StreamChannel::~StreamChannel()
@@ -377,7 +389,6 @@ int ILimeSDRStreaming::StreamChannel::Read(void* samples, const uint32_t count,
         for(int i=2*popped-1; i>=0; --i)
             samplesFloat[i] = (float)samplesShort[i]/2048.0;
     }
-    //else if(config.format == StreamConfig::STREAM_12_BIT_IN_16)
     else
     {
         complex16_t* ptr = (complex16_t*)samples;
@@ -397,7 +408,7 @@ int ILimeSDRStreaming::StreamChannel::Write(const void* samples, const uint32_t
             samplesShort[i] = samplesFloat[i]*2047;
         const complex16_t* ptr = (const complex16_t*)samplesShort ;
         pushed = fifo->push_samples(ptr, count, 1, meta->timestamp, timeout_ms, meta->flags);
-        delete samplesShort;
+        delete[] samplesShort;
     }
     //else if(config.format == StreamConfig::STREAM_12_BIT_IN_16)
     else
diff --git a/src/protocols/ILimeSDRStreaming.h b/src/protocols/ILimeSDRStreaming.h
index 341934e..a3948c1 100644
--- a/src/protocols/ILimeSDRStreaming.h
+++ b/src/protocols/ILimeSDRStreaming.h
@@ -26,7 +26,7 @@ public:
             static const uint16_t samplesCount = 1360;
             complex16_t samples[samplesCount];
         };
-        StreamChannel(IConnection* port);
+        StreamChannel(IConnection* port, StreamConfig config);
         ~StreamChannel();
 
         int Read(void* samples, const uint32_t count, Metadata* meta, const int32_t timeout_ms = 100);
@@ -77,7 +77,7 @@ public:
     };
     virtual void ReceivePacketsLoop(const ThreadData args) = 0;
     virtual void TransmitPacketsLoop(const ThreadData args) = 0;
-    virtual int UpdateThreads();
+    virtual int UpdateThreads(bool stopAll = false);
 
     StreamConfig config;
     std::thread rxThread;
diff --git a/src/protocols/LMS64CProtocol.cpp b/src/protocols/LMS64CProtocol.cpp
index ce42315..2fd4ae4 100644
--- a/src/protocols/LMS64CProtocol.cpp
+++ b/src/protocols/LMS64CProtocol.cpp
@@ -491,7 +491,7 @@ int LMS64CProtocol::TransferPacket(GenericPacket& pkt)
         }
         ParsePacket(pkt, inBuffer, inDataPos, protocol);
     }
-    delete outBuffer;
+    delete[] outBuffer;
     delete[] inBuffer;
     return status;
 }
@@ -794,13 +794,19 @@ int LMS64CProtocol::CustomParameterRead(const uint8_t *ids, double *values, cons
 
     for (size_t i = 0; i < count; ++i)
     {
-        int unitsIndex = (pkt.inBuffer[i * 4 + 1] & 0xF0) >> 4;
+        int unitsIndex = pkt.inBuffer[i * 4 + 1];
         if(units)
-            units[i] = adcUnits2string(unitsIndex);
-        values[i] = pkt.inBuffer[i * 4 + 2] << 8 | pkt.inBuffer[i * 4 + 3];
-        int powerOf10 = pkt.inBuffer[i * 4 + 1] & 0x0F;
-        values[i] *= pow(10, powerOf10);
-        if(unitsIndex == TEMPERATURE)
+        {
+
+            const char adc_units_prefix[] = {
+                ' ', 'k', 'M', 'G', 'T', 'P', 'E', 'Z',
+                'y', 'z', 'a', 'f', 'p', 'n', 'u', 'm'};
+            units[i] = adc_units_prefix[unitsIndex&0x0F];
+            units[i] += adcUnits2string((unitsIndex & 0xF0)>>4);
+        }
+        values[i] = (int16_t)(pkt.inBuffer[i * 4 + 2] << 8 | pkt.inBuffer[i * 4 + 3]);
+
+        if((unitsIndex & 0xF0)>>4 == TEMPERATURE)
             values[i] /= 10;
     }
     return 0;
@@ -853,7 +859,10 @@ int LMS64CProtocol::GPIORead(uint8_t *buffer, const size_t bufLength)
 int LMS64CProtocol::ProgramMCU(const uint8_t *buffer, const size_t length, const MCU_PROG_MODE mode, ProgrammingCallback callback)
 {
     LMSinfo lmsInfo = this->GetInfo();
-    if(lmsInfo.device == LMS_DEV_LIMESDR)
+    if(lmsInfo.device == LMS_DEV_LIMESDR
+    || lmsInfo.device == LMS_DEV_LIMESDR_PCIE
+    || lmsInfo.device == LMS_DEV_LIMESDR_USB_SP
+    || lmsInfo.device == LMS_DEV_LMS7002M_ULTIMATE_EVB)
         return IConnection::ProgramMCU(buffer, length, mode, callback);
 
 #ifndef NDEBUG
@@ -911,3 +920,18 @@ int LMS64CProtocol::ProgramMCU(const uint8_t *buffer, const size_t length, const
 #endif
     return success ? 0 : -1;
 }
+
+/**	@brief Reads chip version information form LMS7 chip.
+*/
+int LMS64CProtocol::GetChipVersion()
+{
+    LMS64CProtocol::GenericPacket ctrPkt;
+    ctrPkt.cmd = CMD_LMS7002_RD;
+    ctrPkt.outBuffer.push_back(0x00); //reset bulk endpoints
+    ctrPkt.outBuffer.push_back(0x2F); //reset bulk endpoints
+    if(TransferPacket(ctrPkt) != 0)
+        this->chipVersion = 0;
+    else
+        this->chipVersion=(ctrPkt.inBuffer[2]<<8)|ctrPkt.inBuffer[3];
+    return this->chipVersion;
+}
diff --git a/src/protocols/LMS64CProtocol.h b/src/protocols/LMS64CProtocol.h
index dbace8f..a5ed316 100644
--- a/src/protocols/LMS64CProtocol.h
+++ b/src/protocols/LMS64CProtocol.h
@@ -182,6 +182,9 @@ public:
     virtual int GPIORead(uint8_t *buffer, const size_t bufLength);
 
     int ProgramMCU(const uint8_t *buffer, const size_t length, const MCU_PROG_MODE mode, ProgrammingCallback callback) override;
+protected:
+    int GetChipVersion();
+    unsigned chipVersion;
 private:
 
     int WriteLMS7002MSPI(const uint32_t *writeData, const size_t size);
diff --git a/src/protocols/LMSBoards.h b/src/protocols/LMSBoards.h
index a91bad7..03f7e8e 100644
--- a/src/protocols/LMSBoards.h
+++ b/src/protocols/LMSBoards.h
@@ -9,50 +9,56 @@ namespace lime {
 
 enum eLMS_DEV
 {
-	LMS_DEV_UNKNOWN,
-	LMS_DEV_EVB6,
-	LMS_DEV_DIGIGREEN,
-	LMS_DEV_DIGIRED,
-	LMS_DEV_EVB7,
-	LMS_DEV_ZIPPER,
-	LMS_DEV_SOCKETBOARD,
-	LMS_DEV_EVB7V2,
-	LMS_DEV_STREAM,
-	LMS_DEV_NOVENA,
-	LMS_DEV_DATASPARK,
-	LMS_DEV_RFSPARK,
-	LMS_DEV_LMS6002USB,
-	LMS_DEV_RFESPARK,
-        LMS_DEV_LIMESDR,
-        LMS_DEV_LIMESDR_PCIE,
-        LMS_DEV_QSPARK,
-        LMS_DEV_ULIMESDR,
-        LMS_DEV_USTREAM,
+    LMS_DEV_UNKNOWN,
+    LMS_DEV_EVB6,
+    LMS_DEV_DIGIGREEN,
+    LMS_DEV_DIGIRED,
+    LMS_DEV_EVB7,
+    LMS_DEV_ZIPPER,
+    LMS_DEV_SOCKETBOARD,
+    LMS_DEV_EVB7V2,
+    LMS_DEV_STREAM,
+    LMS_DEV_NOVENA,
+    LMS_DEV_DATASPARK,
+    LMS_DEV_RFSPARK,
+    LMS_DEV_LMS6002USB,
+    LMS_DEV_RFESPARK,
+    LMS_DEV_LIMESDR,
+    LMS_DEV_LIMESDR_PCIE,
+    LMS_DEV_LIMESDR_QPCIE,
+    LMS_DEV_ULIMESDR,
+    LMS_DEV_USTREAM,
+    LMS_DEV_LIMESDR_SONY, //stand alone board with Sony PAs, tuners
+    LMS_DEV_LIMESDR_USB_SP,
+    LMS_DEV_LMS7002M_ULTIMATE_EVB,
 
-	LMS_DEV_COUNT
+    LMS_DEV_COUNT
 };
 
-const char LMS_DEV_NAMES[][80] = 
+const char LMS_DEV_NAMES[][80] =
 {
-	"UNKNOWN",
-	"EVB6",
-	"DigiGreen",
-	"DigiRed",
-	"EVB7",
-	"ZIPPER",
-	"Socket Board",
-	"EVB7_v2",
-	"Stream",
-	"Novena",
-	"DataSpark",
-	"RF-Spark",
-	"LMS6002-USB Stick",
-	"RF-ESpark",
-    "LimeSDR USB",
-    "LimeSDR PCI-E",
-    "QSpark",
+    "UNKNOWN",
+    "EVB6",
+    "DigiGreen",
+    "DigiRed",
+    "EVB7",
+    "ZIPPER",
+    "Socket Board",
+    "EVB7_v2",
+    "Stream",
+    "Novena",
+    "DataSpark",
+    "RF-Spark",
+    "LMS6002-USB Stick",
+    "RF-ESpark",
+    "LimeSDR-USB",
+    "LimeSDR-PCIe",
+    "LimeSDR-QPCIe",
     "uLimeSDR",
     "uStream",
+    "LimeSDR SONY PA",
+    "LimeSDR-USB SP",
+    "LMS7002M Ultimate EVB"
 };
 
 static inline const char* GetDeviceName(const eLMS_DEV device)
@@ -63,32 +69,32 @@ static inline const char* GetDeviceName(const eLMS_DEV device)
         return LMS_DEV_NAMES[LMS_DEV_UNKNOWN];
 }
 
-enum eEXP_BOARD 
+enum eEXP_BOARD
 {
-	EXP_BOARD_UNKNOWN,
-	EXP_BOARD_UNSUPPORTED,
-	EXP_BOARD_NO,
-	EXP_BOARD_MYRIAD1,
-	EXP_BOARD_MYRIAD2,
-	EXP_BOARD_MYRIAD_NOVENA,
-	EXP_BOARD_HPM1000,
-	EXP_BOARD_MYRIAD7,
-	EXP_BOARD_HPM7,
+    EXP_BOARD_UNKNOWN,
+    EXP_BOARD_UNSUPPORTED,
+    EXP_BOARD_NO,
+    EXP_BOARD_MYRIAD1,
+    EXP_BOARD_MYRIAD2,
+    EXP_BOARD_MYRIAD_NOVENA,
+    EXP_BOARD_HPM1000,
+    EXP_BOARD_MYRIAD7,
+    EXP_BOARD_HPM7,
     EXP_BOARD_MYRIAD7_NOVENA,
-	
-	EXP_BOARD_COUNT
+
+    EXP_BOARD_COUNT
 };
 
-const char EXP_BOARD_NAMES[][80] = 
+const char EXP_BOARD_NAMES[][80] =
 {
-	"UNKNOWN", 
-	"UNSUPPORTED", 
-	"NOT AVAILABLE",
-	"Myriad1",
-	"Myriad2",
-	"Novena",
-	"HPM1000",
-	"Myriad7",
+    "UNKNOWN",
+    "UNSUPPORTED",
+    "NOT AVAILABLE",
+    "Myriad1",
+    "Myriad2",
+    "Novena",
+    "HPM1000",
+    "Myriad7",
     "HMP7",
     "Myriad7 Novena",
 };
diff --git a/src/protocols/dataTypes.h b/src/protocols/dataTypes.h
index 8c75c17..884f72f 100644
--- a/src/protocols/dataTypes.h
+++ b/src/protocols/dataTypes.h
@@ -26,7 +26,7 @@ public:
     uint64_t timestamp; //timestamp of the packet
     uint16_t first; //index of first unused sample in samples
     uint16_t last; //end index of samples
-    complex16_t samples[1360];
+    complex16_t samples[maxSamplesInPacket];
     uint32_t flags;
 
     SamplesPacket()
diff --git a/src/protocols/fifo.h b/src/protocols/fifo.h
index ee82501..330a3f2 100644
--- a/src/protocols/fifo.h
+++ b/src/protocols/fifo.h
@@ -33,15 +33,15 @@ public:
     {
         std::unique_lock<std::mutex> lck(lock);
         BufferInfo stats;
-        stats.size = mBufferSize;
-        stats.itemsFilled = mElementsFilled;
+        stats.size = mBufferSize*mBuffer->maxSamplesInPacket;
+        stats.itemsFilled = mElementsFilled*mBuffer->maxSamplesInPacket;
         return stats;
     }
 
     //!    @brief Initializes FIFO memory
-    RingFIFO(const uint32_t bufLength) : mBufferSize(bufLength)
+    RingFIFO(const uint32_t bufLength) : mBufferSize(1+(bufLength-1)/mBuffer->maxSamplesInPacket)
     {
-        mBuffer = new SamplesPacket[bufLength];
+        mBuffer = new SamplesPacket[mBufferSize];
         Clear();
     }
 
diff --git a/src/utilities_gui/dlgConnectionSettings.cpp b/src/utilities_gui/dlgConnectionSettings.cpp
index 5a45b0b..065d488 100644
--- a/src/utilities_gui/dlgConnectionSettings.cpp
+++ b/src/utilities_gui/dlgConnectionSettings.cpp
@@ -2,6 +2,7 @@
 #include <wx/msgdlg.h>
 #include <vector>
 #include "lms7suiteEvents.h"
+#include "ConnectionHandle.h"
 #include <iso646.h> // alternative operators for visual c++: not, and, or...
 using namespace std;
 
@@ -29,8 +30,8 @@ void dlgConnectionSettings::GetDeviceList( wxInitDialogEvent& event )
         return;
     for (int i = 0; i<ret; ++i)
     {
-        std::string str = list[i];
-        mListLMS7ports->Append(str.substr(0,str.find(',')));
+        const auto handle = lime::ConnectionHandle(list[i]);
+        mListLMS7ports->Append(handle.ToString());
     }
     if (lmsOpenedIndex >= 0 && lmsOpenedIndex < int(mListLMS7ports->GetCount()))
         mListLMS7ports->SetSelection(lmsOpenedIndex);
diff --git a/src/windowFunction.cpp b/src/windowFunction.cpp
index e8c07d8..28bd5dc 100644
--- a/src/windowFunction.cpp
+++ b/src/windowFunction.cpp
@@ -1,49 +1,42 @@
 #include "windowFunction.h"
 #include <cmath>
 
-void GenerateWindowCoefficients(int func, int coefCount, std::vector<float> &windowFcoefs, float &amplitudeCorrection)
+void GenerateWindowCoefficients(int func, int N /*coef count*/, std::vector<float> &windowFcoefs, float amplitudeCorrection)
 {
     windowFcoefs.clear();
 
-    windowFcoefs.resize(coefCount);
+    windowFcoefs.resize(N);
     float a0 = 0.35875;
     float a1 = 0.48829;
     float a2 = 0.14128;
     float a3 = 0.01168;
-    int N = coefCount;
-	float PI = 3.14159265359;
+    float PI = 3.14159265359;
     switch(func)
     {
 	case 1: //blackman-harris
-		for (int i = 0; i<N; ++i)
-		{
-			windowFcoefs[i] = a0 - a1*cos((2 * PI*i) / (N - 1)) + a2*cos((4 * PI*i) / (N - 1)) - a3*cos((6 * PI*i) / (N - 1));
-			amplitudeCorrection += windowFcoefs[i];
-		}
-		amplitudeCorrection = 1.0 / (amplitudeCorrection / N);
-		break;
-    case 2: //hamming
-        amplitudeCorrection = 0;
-        a0 = 0.54;
-        for(int i=0; i<N; ++i)
-        {
-            windowFcoefs[i] = a0 -(1-a0)*cos((2*PI*i)/(N));
-            amplitudeCorrection += windowFcoefs[i];
-        }
-        amplitudeCorrection = 1.0/(amplitudeCorrection/N);
-        break;
-    case 3: //hanning
-        amplitudeCorrection = 0;
-        for(int i=0; i<N; ++i)
-        {
-            windowFcoefs[i] = 0.5 *(1 - cos((2*PI*i)/(N)));
-            amplitudeCorrection += windowFcoefs[i];
-        }
-        amplitudeCorrection = 1.0/(amplitudeCorrection/N);
-        break;
-    default:
-        for (int i = 0; i<N; ++i)
-            windowFcoefs[i] = 1;
-        amplitudeCorrection = 1;
+            for (int i = 0; i<N; ++i)
+                windowFcoefs[i] = a0 - a1*cos((2 * PI*i) / (N - 1)) + a2*cos((4 * PI*i) / (N - 1)) - a3*cos((6 * PI*i) / (N - 1));
+            break;
+        case 2: //hamming
+            amplitudeCorrection = 0;
+            a0 = 0.54;
+            for(int i=0; i<N; ++i)
+                windowFcoefs[i] = a0 -(1-a0)*cos((2*PI*i)/(N));
+            break;
+        case 3: //hanning
+            amplitudeCorrection = 0;
+            for(int i=0; i<N; ++i)
+                windowFcoefs[i] = 0.5 *(1 - cos((2*PI*i)/(N)));
+            break;
+        default:
+            for (int i = 0; i<N; ++i)
+                windowFcoefs[i] = 1;
+            return;
     }
+    for (int i = 0; i<N; ++i)
+        amplitudeCorrection += windowFcoefs[i];
+    amplitudeCorrection = 1.0/(amplitudeCorrection/N);
+    for (int i = 0; i<N; ++i)
+        windowFcoefs[i] *= amplitudeCorrection;
+
 }
diff --git a/src/windowFunction.h b/src/windowFunction.h
index 5d8f3af..e43a66b 100644
--- a/src/windowFunction.h
+++ b/src/windowFunction.h
@@ -3,6 +3,6 @@
 
 #include <vector>
 
-void GenerateWindowCoefficients(int func, int fftsize, std::vector<float> &windowFcoefs, float &amplitudeCorrection);
+void GenerateWindowCoefficients(int func, int fftsize, std::vector<float> &windowFcoefs, float amplitudeCorrection);
 
 #endif
\ No newline at end of file
diff --git a/udev-rules/64-limesuite.rules b/udev-rules/64-limesuite.rules
index a1ad06f..e928210 100644
--- a/udev-rules/64-limesuite.rules
+++ b/udev-rules/64-limesuite.rules
@@ -2,3 +2,4 @@ ATTR{idVendor}=="04b4", ATTR{idProduct}=="8613", SYMLINK+="stream-%k", MODE="660
 ATTR{idVendor}=="04b4", ATTR{idProduct}=="00f1", SYMLINK+="stream-%k", MODE="660", GROUP="plugdev"
 ATTR{idVendor}=="0403", ATTR{idProduct}=="601f", SYMLINK+="stream-%k", MODE="660", GROUP="plugdev"
 ATTR{idVendor}=="1d50", ATTR{idProduct}=="6108", SYMLINK+="stream-%k", MODE="660", GROUP="plugdev"
+SUBSYSTEM=="xillybus", MODE="666", OPTIONS="last_rule"

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/limesuite.git



More information about the pkg-hamradio-commits mailing list