[hamradio-commits] [cubicsdr] 01/08: New upstream version 0.2.2+dfsg

Andreas E. Bombe aeb at moszumanska.debian.org
Mon Aug 21 19:45:10 UTC 2017


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

aeb pushed a commit to branch master
in repository cubicsdr.

commit 1bd0f6b90c79716d98ab6cddf0b8b254ab0b8c8c
Author: Andreas Bombe <aeb at debian.org>
Date:   Wed Aug 9 00:03:39 2017 -0400

    New upstream version 0.2.2+dfsg
---
 CMakeLists.txt                              |  45 +-
 external/rs232/README                       |  29 ++
 external/rs232/README.md                    |  13 +
 external/rs232/rs232-linux.cpp              | 261 ++++++++++
 external/rs232/rs232-win.cpp                | 253 ++++++++++
 external/rs232/rs232.h                      | 156 ++++++
 src/AppConfig.cpp                           |   4 +
 src/AppFrame.cpp                            |  81 +++-
 src/AppFrame.h                              |  12 +-
 src/BookmarkMgr.cpp                         |  88 ++--
 src/BookmarkMgr.h                           |  27 +-
 src/CubicSDR.cpp                            |   2 +-
 src/demod/DemodulatorInstance.cpp           |   8 +-
 src/demod/DemodulatorMgr.cpp                |  30 +-
 src/demod/DemodulatorMgr.h                  |   5 +
 src/forms/Bookmark/BookmarkPanel.cpp        |  24 +-
 src/forms/Bookmark/BookmarkPanel.fbp        |  10 +-
 src/forms/Bookmark/BookmarkPanel.h          |   4 +-
 src/forms/Bookmark/BookmarkView.cpp         | 202 +++-----
 src/forms/Bookmark/BookmarkView.h           |   4 +-
 src/forms/Dialog/AboutDialog.fbp            | 500 ++++++++++++++++++-
 src/forms/Dialog/AboutDialogBase.cpp        |  24 +
 src/forms/Dialog/AboutDialogBase.h          |   6 +
 src/forms/Dialog/PortSelectorDialog.cpp     |  39 ++
 src/forms/Dialog/PortSelectorDialog.fbp     | 727 ++++++++++++++++++++++++++++
 src/forms/Dialog/PortSelectorDialog.h       |  11 +
 src/forms/Dialog/PortSelectorDialogBase.cpp |  78 +++
 src/forms/Dialog/PortSelectorDialogBase.h   |  58 +++
 src/modules/modem/analog/ModemLSB.cpp       |  17 -
 src/modules/modem/analog/ModemLSB.h         |   6 -
 src/modules/modem/analog/ModemUSB.cpp       |  17 -
 src/modules/modem/analog/ModemUSB.h         |   5 -
 src/util/GLFont.cpp                         |   5 -
 src/visual/PrimaryGLContext.cpp             |   6 +-
 src/visual/ScopeContext.cpp                 |   2 +-
 35 files changed, 2464 insertions(+), 295 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 355ccfa..6a65c6b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
 SET(CUBICSDR_VERSION_MAJOR "0")
 SET(CUBICSDR_VERSION_MINOR "2")
 SET(CUBICSDR_VERSION_PATCH "2")
-SET(CUBICSDR_VERSION_SUFFIX "-alpha")
+SET(CUBICSDR_VERSION_SUFFIX "")
 SET(CUBICSDR_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}${CUBICSDR_VERSION_SUFFIX}")
 
 SET(CPACK_PACKAGE_VERSION "${CUBICSDR_VERSION_MAJOR}.${CUBICSDR_VERSION_MINOR}.${CUBICSDR_VERSION_PATCH}")
@@ -27,6 +27,8 @@ IF(CUSTOM_BUILD)
     # feature flags
     SET (CUBICSDR_ENABLE_VIEW_DEMOD ON CACHE BOOL "Enable Second Demodulator Spectrum/Waterfall view.")
     SET (CUBICSDR_ENABLE_VIEW_SCOPE ON CACHE BOOL "Enable Demodulator Scope/Spectrum view.")
+    SET (CUBICSDR_ENABLE_ABOUT_DIALOG ON CACHE BOOL "Enable About Dialog.")
+    SET (CUBICSDR_DEFAULT_HIDE_BOOKMARKS OFF CACHE BOOL "Hide Bookmarks by Default.")
     SET (CUBICSDR_MODEM_EXCLUDE CACHE "" "Comma-separated list of modems to exclude.")    
 
     IF (NOT CUBICSDR_HEADER_IMAGE STREQUAL "")
@@ -52,8 +54,10 @@ ELSE()
     SET (CUBICSDR_HEADER_IMAGE "")
     SET (CUBICSDR_HEADER_BG "")
     # feature flags
-    SET (CUBICSDR_ENABLE_VIEW_DEMOD TRUE)
-    SET (CUBICSDR_ENABLE_VIEW_SCOPE TRUE)
+    SET (CUBICSDR_ENABLE_VIEW_DEMOD ON)
+    SET (CUBICSDR_ENABLE_VIEW_SCOPE ON)
+    SET (CUBICSDR_DEFAULT_HIDE_BOOKMARKS OFF)
+    SET (CUBICSDR_ENABLE_ABOUT_DIALOG ON)
     SET (CUBICSDR_EXCLUDE_MODEM "")    
 ENDIF()
 
@@ -65,6 +69,14 @@ IF(CUBICSDR_ENABLE_VIEW_SCOPE)
     ADD_DEFINITIONS( -DCUBICSDR_ENABLE_VIEW_SCOPE=1 )
 ENDIF()
 
+IF(CUBICSDR_DEFAULT_HIDE_BOOKMARKS) 
+    ADD_DEFINITIONS( -DCUBICSDR_DEFAULT_HIDE_BOOKMARKS=1 )
+ENDIF()
+
+IF(CUBICSDR_ENABLE_ABOUT_DIALOG) 
+    ADD_DEFINITIONS( -DCUBICSDR_ENABLE_ABOUT_DIALOG=1 )
+ENDIF()
+
 ADD_DEFINITIONS(
     -DCUBICSDR_INSTALL_NAME="${CUBICSDR_INSTALL_NAME}"
     -DCUBICSDR_VERSION="${CUBICSDR_VERSION}"
@@ -528,12 +540,33 @@ ENDIF()
 IF (USE_HAMLIB)
     SET (cubicsdr_headers
         ${cubicsdr_headers}
+        src/forms/Dialog/PortSelectorDialogBase.h
+        src/forms/Dialog/PortSelectorDialog.h
         src/rig/RigThread.h
+        external/rs232/rs232.h
     )    
     SET (cubicsdr_sources
         ${cubicsdr_sources}
+	src/forms/Dialog/PortSelectorDialogBase.cpp
+        src/forms/Dialog/PortSelectorDialog.cpp
         src/rig/RigThread.cpp
     )
+    
+    IF(WIN32)
+        SET (cubicsdr_sources
+            ${cubicsdr_sources}
+            external/rs232/rs232-win.cpp
+        )
+    ELSE()
+        SET (cubicsdr_sources
+            ${cubicsdr_sources}
+            external/rs232/rs232-linux.cpp
+        )
+    ENDIF()    
+    
+    include_directories ( 
+        external/rs232/
+    )
 ENDIF()
 
 
@@ -571,6 +604,7 @@ SOURCE_GROUP("Forms\\Dialog" REGULAR_EXPRESSION "src/forms/Dialog/${REG_EXT}")
 SOURCE_GROUP("SDR" REGULAR_EXPRESSION "src/sdr/${REG_EXT}")
 IF(USE_HAMLIB)
     SOURCE_GROUP("Rig" REGULAR_EXPRESSION "src/rig/${REG_EXT}")    
+    SOURCE_GROUP("_ext-RS-232" REGULAR_EXPRESSION "external/rs232/${REG_EXT}")    
 ENDIF()
 SOURCE_GROUP("Demodulator" REGULAR_EXPRESSION "src/demod/${REG_EXT}")
 SOURCE_GROUP("Modem" REGULAR_EXPRESSION "src/modules/modem/${REG_EXT}")
@@ -733,9 +767,10 @@ IF (APPLE AND BUNDLE_APP)
         
     IF (BUNDLE_SOAPY_MODS)
     message(STATUS "SOAPY_ROOT: ${SOAPY_SDR_ROOT}")
-    SET(SOAPY_SDR_MOD_PATH "${SOAPY_SDR_ROOT}/lib/SoapySDR/modules/${SOAPY_SDR_ABI_VERSION}")
+    SET(SOAPY_SDR_MOD_PATH "${SOAPY_SDR_ROOT}/lib/SoapySDR/modules${SOAPY_SDR_ABI_VERSION}")
+    message(STATUS "SOAPY_SDR_MOD_PATH: ${SOAPY_SDR_MOD_PATH}")
     
-    file(GLOB SOAPY_MODS ${SOAPY_MOD_PATH}/*.so)
+    file(GLOB SOAPY_MODS ${SOAPY_SDR_MOD_PATH}/*.so)
     
     FOREACH(SOAPY_MOD_FILE ${SOAPY_MODS})
             INSTALL( FILES "${SOAPY_MOD_FILE}"
diff --git a/external/rs232/README b/external/rs232/README
new file mode 100644
index 0000000..6cac813
--- /dev/null
+++ b/external/rs232/README
@@ -0,0 +1,29 @@
+Cross-platform serial / RS232 library
+Version 0.21, 11/10/2015
+The MIT License (MIT)
+
+Supported platforms:
+- Windows (XP / Win7, possibly 8 and 10)
+- Linux
+- MacOS X
+
+Copyright (c) 2007 - 2015 Fr�d�ric Meslin
+Contact: fredericmeslin at hotmail.com, @marzacdev
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/external/rs232/README.md b/external/rs232/README.md
new file mode 100644
index 0000000..2a38508
--- /dev/null
+++ b/external/rs232/README.md
@@ -0,0 +1,13 @@
+# rs232
+C / C++ RS232 cross-platform serial library  
+Version 0.21, 11/10/2015
+
+Supported platforms:  
+- Windows (XP / Win7, possibly 8 and 10)  
+- Linux  
+- MacOS X  
+
+Copyright (c) 2013-2015 Fr�d�ric Meslin  
+Email: fredericmeslin at hotmail.com  
+Website: www.fredslab.net  
+Twitter: @marzacdev  
diff --git a/external/rs232/rs232-linux.cpp b/external/rs232/rs232-linux.cpp
new file mode 100644
index 0000000..c8e629a
--- /dev/null
+++ b/external/rs232/rs232-linux.cpp
@@ -0,0 +1,261 @@
+/*
+    Cross-platform serial / RS232 library
+    Version 0.21, 11/10/2015
+    -> LINUX and MacOS implementation
+    -> rs232-linux.c
+
+    The MIT License (MIT)
+
+    Copyright (c) 2013-2015 Frédéric Meslin, Florent Touchard
+    Email: fredericmeslin at hotmail.com
+    Website: www.fredslab.net
+    Twitter: @marzacdev
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in all
+    copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+    SOFTWARE.
+  
+*/
+
+#if defined(__unix__) || defined(__unix) || \
+    defined(__APPLE__) && defined(__MACH__)
+
+#define _DARWIN_C_SOURCE
+
+#include "rs232.h"
+
+#include <unistd.h>
+#define __USE_MISC // For CRTSCTS
+#include <termios.h>
+#include <fcntl.h>
+#include <dirent.h>
+
+#define __USE_SVID // For strdup
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+/*****************************************************************************/
+/** Base name for COM devices */
+#if defined(__APPLE__) && defined(__MACH__)
+    static const char * devBases[] = {
+        "tty."
+    };
+    static int noBases = 1;
+#else
+    static const char * devBases[] = {
+        "ttyACM", "ttyUSB", "rfcomm", "ttyS"
+    };
+    static int noBases = 4;
+#endif
+
+/*****************************************************************************/
+typedef struct {
+    char * port;
+    int handle;
+} COMDevice;
+
+#define COM_MAXDEVICES        64
+static COMDevice comDevices[COM_MAXDEVICES];
+static int noDevices = 0;
+
+/*****************************************************************************/
+/** Private functions */
+void _AppendDevices(const char * base);
+int _BaudFlag(int BaudRate);
+
+/*****************************************************************************/
+int comEnumerate()
+{
+    for (int i = 0; i < noDevices; i++) {
+        if (comDevices[i].port) free(comDevices[i].port);
+        comDevices[i].port = NULL;
+    }
+    noDevices = 0;
+    for (int i = 0; i < noBases; i++)
+        _AppendDevices(devBases[i]);
+    return noDevices;
+}
+
+void comTerminate()
+{
+    comCloseAll();
+    for (int i = 0; i < noDevices; i++) {
+        if (comDevices[i].port) free(comDevices[i].port);
+        comDevices[i].port = NULL;
+    }
+}
+
+int comGetNoPorts()
+{
+    return noDevices;
+}
+
+/*****************************************************************************/
+int comFindPort(const char * name)
+{
+    int p;
+    for (p = 0; p < noDevices; p++)
+        if (strcmp(name, comDevices[p].port) == 0)
+            return p;
+    return -1;
+}
+
+const char * comGetInternalName(int index)
+{
+    #define COM_MAXNAME    128
+    static char name[COM_MAXNAME];
+    if (index >= noDevices || index < 0)
+        return NULL;
+    sprintf(name, "/dev/%s", comDevices[index].port);
+    return name;
+}
+
+const char * comGetPortName(int index) {
+    if (index >= noDevices || index < 0)
+        return NULL;
+    return comDevices[index].port;
+}
+
+/*****************************************************************************/
+int comOpen(int index, int baudrate)
+{
+    if (index >= noDevices || index < 0)
+        return 0;
+// Close if already open
+    COMDevice * com = &comDevices[index];
+    if (com->handle >= 0) comClose(index);
+// Open port
+    printf("Try %s \n", comGetInternalName(index));
+    int handle = open(comGetInternalName(index), O_RDWR | O_NOCTTY | O_NDELAY);
+    if (handle < 0)
+        return 0;
+    printf("Open %s \n", comGetInternalName(index));
+// General configuration
+    struct termios config;
+    memset(&config, 0, sizeof(config));
+    tcgetattr(handle, &config);
+    config.c_iflag &= ~(INLCR | ICRNL);
+    config.c_iflag |= IGNPAR | IGNBRK;
+    config.c_oflag &= ~(OPOST | ONLCR | OCRNL);
+    config.c_cflag &= ~(PARENB | PARODD | CSTOPB | CSIZE | CRTSCTS);
+    config.c_cflag |= CLOCAL | CREAD | CS8;
+    config.c_lflag &= ~(ICANON | ISIG | ECHO);
+    int flag = _BaudFlag(baudrate);
+    cfsetospeed(&config, flag);
+    cfsetispeed(&config, flag);
+// Timeouts configuration
+    config.c_cc[VTIME] = 1;
+    config.c_cc[VMIN]  = 0;
+    //fcntl(handle, F_SETFL, FNDELAY);
+// Validate configuration
+    if (tcsetattr(handle, TCSANOW, &config) < 0) {
+        close(handle);
+        return 0;
+    }
+    com->handle = handle;
+    return 1;
+}
+
+void comClose(int index)
+{
+    if (index >= noDevices || index < 0)
+        return;
+    COMDevice * com = &comDevices[index];
+    if (com->handle < 0) 
+        return;
+    tcdrain(com->handle);
+    close(com->handle);
+    com->handle = -1;
+}
+
+void comCloseAll()
+{
+    for (int i = 0; i < noDevices; i++)
+        comClose(i);
+}
+
+/*****************************************************************************/
+int comWrite(int index, const char * buffer, size_t len)
+{
+    if (index >= noDevices || index < 0)
+        return 0;
+    if (comDevices[index].handle <= 0)
+        return 0;
+    int res = write(comDevices[index].handle, buffer, len);
+    if (res < 0)
+        res = 0;
+    return res;
+}
+
+int comRead(int index, char * buffer, size_t len)
+{
+    if (index >= noDevices || index < 0)
+        return 0;
+    if (comDevices[index].handle <= 0)
+        return 0;
+    int res = read(comDevices[index].handle, buffer, len);
+    if (res < 0)
+        res = 0;
+    return res;
+}
+
+/*****************************************************************************/
+int _BaudFlag(int BaudRate)
+{
+    switch(BaudRate)
+    {
+        case 50:      return B50; break;
+        case 110:     return B110; break;
+        case 134:     return B134; break;
+        case 150:     return B150; break;
+        case 200:     return B200; break;
+        case 300:     return B300; break;
+        case 600:     return B600; break;
+        case 1200:    return B1200; break;
+        case 1800:    return B1800; break;
+        case 2400:    return B2400; break;
+        case 4800:    return B4800; break;
+        case 9600:    return B9600; break;
+        case 19200:   return B19200; break;
+        case 38400:   return B38400; break;
+        case 57600:   return B57600; break;
+        case 115200:  return B115200; break;
+        case 230400:  return B230400; break;
+        default : return B0; break;
+    }
+}
+
+void _AppendDevices(const char * base)
+{
+    int baseLen = strlen(base);
+    struct dirent * dp;
+// Enumerate devices
+    DIR * dirp = opendir("/dev");
+    while ((dp = readdir(dirp)) && noDevices < COM_MAXDEVICES) {
+        if (strlen(dp->d_name) >= baseLen) {
+            if (memcmp(base, dp->d_name, baseLen) == 0) {
+                COMDevice * com = &comDevices[noDevices ++];
+                com->port = (char *) strdup(dp->d_name);
+                com->handle = -1;
+            }
+        }
+    }
+    closedir(dirp);
+}
+
+#endif // unix
diff --git a/external/rs232/rs232-win.cpp b/external/rs232/rs232-win.cpp
new file mode 100644
index 0000000..d4f4f99
--- /dev/null
+++ b/external/rs232/rs232-win.cpp
@@ -0,0 +1,253 @@
+/*
+    Cross-platform serial / RS232 library
+    Version 0.21, 11/10/2015
+    -> WIN32 implementation
+    -> rs232-win.c
+    
+    The MIT License (MIT)
+
+    Copyright (c) 2013-2015 Fr�d�ric Meslin, Florent Touchard
+    Email: fredericmeslin at hotmail.com
+    Website: www.fredslab.net
+    Twitter: @marzacdev
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+*/
+
+#ifdef _WIN32
+
+#include "rs232.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <Windows.h>
+
+/*****************************************************************************/
+
+typedef struct {
+    int port;
+    void * handle;
+} COMDevice;
+
+/*****************************************************************************/
+#define COM_MAXDEVICES 64
+static COMDevice comDevices[COM_MAXDEVICES];
+static int noDevices = 0;
+
+#define COM_MINDEVNAME 16384
+const char * comPtn = "COM???";
+
+/*****************************************************************************/
+const char * findPattern(const char * string, const char * pattern, int * value);
+const char * portInternalName(int index);
+
+/*****************************************************************************/
+int comEnumerate()
+{
+// Get devices information text
+    size_t size = COM_MINDEVNAME;
+    char * list = (char *) malloc(size);
+    SetLastError(0);
+    QueryDosDeviceA(NULL, list, size);
+    while (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+        size *= 2;
+        char * nlist = (char *) realloc(list, size);
+        if (!nlist) {
+            free(list);
+            return 0;
+        }
+        list = nlist;
+        SetLastError(0);
+        QueryDosDeviceA(NULL, list, size);
+    }
+// Gather all COM ports
+    int port;
+    const char * nlist = findPattern(list, comPtn, &port);
+    noDevices = 0;
+    while(port > 0 && noDevices < COM_MAXDEVICES) {
+        COMDevice * com = &comDevices[noDevices ++];
+        com->port = port;
+        com->handle    = 0;
+        nlist = findPattern(nlist, comPtn, &port);
+    }
+    free(list);
+    return noDevices;
+}
+
+void comTerminate()
+{
+    comCloseAll();    
+}
+
+int comGetNoPorts()
+{
+    return noDevices;
+}
+
+/*****************************************************************************/
+const char * comGetPortName(int index)
+{
+    #define COM_MAXNAME    32
+    static char name[COM_MAXNAME];
+    if (index < 0 || index >= noDevices)
+        return 0;
+    sprintf(name, "COM%i", comDevices[index].port);
+    return name;
+}
+
+int comFindPort(const char * name)
+{
+    for (int i = 0; i < noDevices; i++)
+        if (strcmp(name, comGetPortName(i)) == 0)
+            return i;
+    return -1;
+}
+
+const char * comGetInternalName(int index)
+{
+    #define COM_MAXNAME    32
+    static char name[COM_MAXNAME];
+    if (index < 0 || index >= noDevices)
+        return 0;
+    sprintf(name, "//./COM%i", comDevices[index].port);
+    return name;
+}
+
+/*****************************************************************************/
+int comOpen(int index, int baudrate)
+{
+    DCB config;
+    COMMTIMEOUTS timeouts;
+    if (index < 0 || index >= noDevices) 
+        return 0;
+// Close if already open
+    COMDevice * com = &comDevices[index];
+    if (com->handle) comClose(index);
+// Open COM port
+    void * handle = CreateFileA(comGetInternalName(index), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+    if (handle == INVALID_HANDLE_VALUE) 
+        return 0;
+    com->handle = handle;
+// Prepare read / write timeouts
+    SetupComm(handle, 64, 64);
+    timeouts.ReadIntervalTimeout = MAXDWORD;
+    timeouts.ReadTotalTimeoutConstant = 0;
+    timeouts.WriteTotalTimeoutConstant = 0;
+    timeouts.ReadTotalTimeoutMultiplier = 0;
+    timeouts.WriteTotalTimeoutMultiplier = 0;
+    SetCommTimeouts(handle, &timeouts);
+// Prepare serial communication format
+    GetCommState(handle, &config);
+    config.BaudRate = baudrate;
+    config.fBinary = true;
+    config.fParity = 0;
+    config.fErrorChar = 0;
+    config.fNull = 0;
+    config.fAbortOnError = 0;
+    config.ByteSize = 8;
+    config.Parity = 0;
+    config.StopBits = 0;
+    config.EvtChar = '\n';
+// Set the port state
+    if (SetCommState(handle, &config) == 0) {
+        CloseHandle(handle);
+        return 0;
+    }
+    return 1;
+}
+
+void comClose(int index)
+{
+    if (index < 0 || index >= noDevices) 
+        return;
+    COMDevice * com = &comDevices[index];
+    if (!com->handle) 
+        return;
+    CloseHandle(com->handle);
+    com->handle = 0;
+}
+
+void comCloseAll()
+{
+    for (int i = 0; i < noDevices; i++)
+        comClose(i);
+}
+
+/*****************************************************************************/
+int comWrite(int index, const char * buffer, size_t len)
+{
+    if (index < 0 || index >= noDevices)
+        return 0;
+    COMDevice * com = &comDevices[index];
+    uint32_t bytes = 0;
+    WriteFile(com->handle, buffer, len, (LPDWORD)&bytes, NULL);
+    return bytes;
+}
+
+int comRead(int index, char * buffer, size_t len)
+{
+    if (index < 0 || index >= noDevices)
+        return 0;
+    COMDevice * com = &comDevices[index];
+    uint32_t bytes = 0;
+    ReadFile(com->handle, buffer, len, (LPDWORD)&bytes, NULL);
+    return bytes;
+}
+
+/*****************************************************************************/
+const char * findPattern(const char * string, const char * pattern, int * value)
+{
+    char c, n = 0;
+    const char * sp = string;
+    const char * pp = pattern;
+// Check for the string pattern
+    while (1) {
+        c = *sp ++;
+        if (c == '\0') {
+            if (*pp == '?') break;
+            if (*sp == '\0') break;
+            n = 0;
+            pp = pattern;
+        }else{
+            if (*pp == '?') {
+            // Expect a digit
+                if (c >= '0' && c <= '9') {
+                    n = n * 10 + (c - '0');
+                    if (*pp ++ == '\0') break;
+                }else{
+                    n = 0;
+                    pp = comPtn;
+                }
+            }else{
+            // Expect a character
+                if (c == *pp) {
+                    if (*pp ++ == '\0') break;
+                }else{
+                    n = 0;
+                    pp = comPtn;
+                }
+            }
+        }
+    }
+// Return the value
+    * value = n;
+    return sp;
+}
+
+#endif // _WIN32
diff --git a/external/rs232/rs232.h b/external/rs232/rs232.h
new file mode 100644
index 0000000..0b1d00c
--- /dev/null
+++ b/external/rs232/rs232.h
@@ -0,0 +1,156 @@
+/*
+    Cross-platform serial / RS232 library
+    Version 0.21, 11/10/2015
+    -> All platforms header
+    -> rs232.h
+
+    The MIT License (MIT)
+
+    Copyright (c) 2013-2015 Fr�d�ric Meslin, Florent Touchard
+    Email: fredericmeslin at hotmail.com
+    Website: www.fredslab.net
+    Twitter: @marzacdev
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+*/
+
+#ifndef RS232_H
+#define RS232_H
+
+// TODO: convert to C++ class
+//#ifdef __cplusplus
+//extern "C" {
+//#endif
+
+    #include <stdint.h>
+    #include <stdlib.h>
+
+/*****************************************************************************/
+    /* Doxywizard specific */
+    /**
+    * \mainpage RS232
+    * \section intro_sec C / C++ RS232 cross-platform serial library
+    * <b>Version 0.21 - 11/10/2015</b>
+    *
+    * Supported platforms:  
+    * - Windows (XP / Win7, possibly 8 and 10)  
+    * - Linux  
+    * - MacOS X  
+    *
+    * Copyright (c) 2013-2015 Frédéric Meslin, Florent Touchard <br>
+    * Email: fredericmeslin at hotmail.com <br>
+    * Website: www.fredslab.net <br>
+    * Twitter: \@marzacdev <br>
+    */
+    
+/*****************************************************************************/
+    /**
+     * \fn int comEnumerate()
+     * \brief Enumerate available serial ports (Serial, USB serial, Bluetooth serial)
+     * \return number of enumerated ports
+     */
+    int comEnumerate();
+    
+    /**
+     * \fn int comGetNoPorts()
+     * \brief Return the number of enumerated ports
+     * \return number of enumerated ports
+     */
+    int comGetNoPorts();
+
+    /**
+     * \fn int comTerminate()
+     * \brief Release ports and memory resources used by the library
+     */    
+    void comTerminate();
+
+    /**
+     * \fn const char * comGetPortName(int index)
+     * \brief Get port user-friendly name
+     * \param[in] index port index
+     * \return null terminated port name
+     */    
+    const char * comGetPortName(int index);
+
+    /**
+     * \fn const char * comGetInternalName(int index)
+     * \brief Get port operating-system name
+     * \param[in] index port index
+     * \return null terminated port name
+     */        
+    const char * comGetInternalName(int index);
+    
+    /**
+     * \fn int comFindPort(const char * name)
+     * \brief Try to find a port given its user-friendly name
+     * \param[in] name port name (case sensitive)
+     * \return index of found port or -1 if not enumerated
+     */        
+    int comFindPort(const char * name);
+
+/*****************************************************************************/
+    /**
+     * \fn int comOpen(int index, int baudrate)
+     * \brief Try to open a port at a specific baudrate
+     * \brief (No parity, single stop bit, no hardware flow control)
+     * \param[in] index port index
+     * \param[in] baudrate port baudrate
+     * \return 1 if opened, 0 if not available
+     */        
+    int comOpen(int index, int baudrate);
+    
+    /**
+     * \fn void comClose(int index)
+     * \brief Close an opened port
+     * \param[in] index port index
+     */            
+    void comClose(int index);
+    
+    /**
+     * \fn void comCloseAll()
+     * \brief Close all opened ports
+     */            
+    void comCloseAll();
+
+/*****************************************************************************/
+    /**
+     * \fn int comWrite(int index, const char * buffer, size_t len)
+     * \brief Write data to the port (non-blocking)
+     * \param[in] index port index
+     * \param[in] buffer pointer to transmit buffer
+     * \param[in] len length of transmit buffer in bytes
+     * \return number of bytes transferred
+     */            
+    int comWrite(int index, const char * buffer, size_t len);
+    
+    /**
+     * \fn int comRead(int index, const char * buffer, size_t len)
+     * \brief Read data from the port (non-blocking)
+     * \param[in] index port index
+     * \param[in] buffer pointer to receive buffer
+     * \param[in] len length of receive buffer in bytes
+     * \return number of bytes transferred
+     */                
+    int comRead(int index, char * buffer, size_t len);
+
+//#ifdef __cplusplus
+//}
+//#endif
+
+#endif // RS232_H
diff --git a/src/AppConfig.cpp b/src/AppConfig.cpp
index eea6539..176838b 100644
--- a/src/AppConfig.cpp
+++ b/src/AppConfig.cpp
@@ -296,7 +296,11 @@ AppConfig::AppConfig() : configName("") {
     mainSplit = -1;
     visSplit = -1;
     bookmarkSplit = 200;
+#ifdef CUBICSDR_DEFAULT_HIDE_BOOKMARKS
+    bookmarksVisible.store(false);
+#else
     bookmarksVisible.store(true);
+#endif
     
 #ifdef USE_HAMLIB
     rigEnabled.store(false);
diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp
index bd3bdc5..ca5a8c1 100644
--- a/src/AppFrame.cpp
+++ b/src/AppFrame.cpp
@@ -45,6 +45,8 @@ wxEND_EVENT_TABLE()
 
 #ifdef USE_HAMLIB
 #include "RigThread.h"
+#include "PortSelectorDialog.h"
+#include "rs232.h"
 #endif
 
 
@@ -121,7 +123,13 @@ AppFrame::AppFrame() :
     for (auto mt_i : modemList) {
         demodModeSelector->addChoice(mt_i);
     }
+            
+#ifdef CUBICSDR_MODEM_EXCLUDE
+    demodModeSelector->setHelpTip("Use buttons to choose modulation type.");
+#else
     demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation (Hotkey F), Amplitude Modulation (A) and Lower (L), Upper (U), Double Side-Band and more.");
+#endif
+            
     demodModeSelector->SetMinSize(wxSize(50,-1));
     demodModeSelector->SetMaxSize(wxSize(50,-1));
     demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0);
@@ -392,9 +400,11 @@ AppFrame::AppFrame() :
     // Make a menubar
     menuBar = new wxMenuBar;
     wxMenu *menu = new wxMenu;
-#ifndef __APPLE__
+#ifndef __APPLE__ 
+#ifdef CUBICSDR_ENABLE_ABOUT_DIALOG
     menu->Append(wxID_ABOUT_CUBICSDR, "About " CUBICSDR_INSTALL_NAME);
 #endif
+#endif
     menu->Append(wxID_SDR_DEVICES, "SDR Devices");
     menu->AppendSeparator();
     menu->Append(wxID_SDR_START_STOP, "Stop / Start Device");
@@ -406,14 +416,16 @@ AppFrame::AppFrame() :
     menu->Append(wxID_RESET, "&Reset Session");
             
 #ifndef __APPLE__
-        menu->AppendSeparator();
-        menu->Append(wxID_CLOSE);
+    menu->AppendSeparator();
+    menu->Append(wxID_CLOSE);
 #else
-        if ( wxApp::s_macAboutMenuItemId != wxID_NONE ) {
-            wxString aboutLabel;
-            aboutLabel.Printf(_("About %s"), CUBICSDR_INSTALL_NAME);
-            menu->Append( wxApp::s_macAboutMenuItemId, aboutLabel);
-        }
+#ifdef CUBICSDR_ENABLE_ABOUT_DIALOG
+    if ( wxApp::s_macAboutMenuItemId != wxID_NONE ) {
+        wxString aboutLabel;
+        aboutLabel.Printf(_("About %s"), CUBICSDR_INSTALL_NAME);
+        menu->Append( wxApp::s_macAboutMenuItemId, aboutLabel);
+    }
+#endif
 #endif
 
     menuBar->Append(menu, wxT("&File"));
@@ -544,7 +556,7 @@ AppFrame::AppFrame() :
     rigModel = wxGetApp().getConfig()->getRigModel();
     rigSerialRate = wxGetApp().getConfig()->getRigRate();
     rigPort = wxGetApp().getConfig()->getRigPort();
-            
+    rigPortDialog = nullptr;
     rigMenu = new wxMenu;
 
     rigEnableMenuItem = rigMenu->AppendCheckItem(wxID_RIG_TOGGLE, wxT("Enable Rig"));
@@ -931,6 +943,31 @@ void AppFrame::disableRig() {
     wxGetApp().unlockFrequency();
     wxGetApp().getConfig()->setRigEnabled(false);
 }
+
+void AppFrame::setRigControlPort(std::string portName) {
+    if (rigPortDialog == nullptr) {
+        return;
+    }
+    if (portName != "") {
+        rigPort = portName;
+
+        wxGetApp().stopRig();
+        wxGetApp().initRig(rigModel, rigPort, rigSerialRate);
+        
+        Refresh();
+    }
+    rigPortDialog->EndModal(0);
+    delete rigPortDialog;
+    rigPortDialog = nullptr;
+}
+
+
+void AppFrame::dismissRigControlPortDialog() {
+    rigPortDialog->EndModal(0);
+    delete rigPortDialog;
+    rigPortDialog = nullptr;
+}
+
 #endif
 
 bool AppFrame::actionOnMenuDisplay(wxCommandEvent& event) {
@@ -1237,6 +1274,8 @@ bool AppFrame::actionOnMenuAudioSampleRate(wxCommandEvent& event) {
                     //audioSampleRateMenuItems[menu_id+j];
                     //std::cout << "Would set audio sample rate on device " << mdevices_i->second.name << " (" << mdevices_i->first << ") to " << (*srate) << "Hz" << std::endl;
                     AudioThread::setDeviceSampleRate(mdevices_i->first, *srate);
+
+                    return true;
                 }
 
                 j++;
@@ -1244,7 +1283,6 @@ bool AppFrame::actionOnMenuAudioSampleRate(wxCommandEvent& event) {
             i++;
         }
 
-        return true;
     }
 
     return false;
@@ -1327,13 +1365,10 @@ bool AppFrame::actionOnMenuRig(wxCommandEvent& event) {
     }
 
     if (event.GetId() == wxID_RIG_PORT) {
-        wxString stringVal = wxGetTextFromUser("Rig Serial / COM / Address", "Rig Control Port", rigPort);
-        std::string rigPortStr = stringVal.ToStdString();
-        if (rigPortStr != "") {
-            rigPort = rigPortStr;
-            resetRig = true;
+        if (rigPortDialog == nullptr) {
+            rigPortDialog = new PortSelectorDialog(this, wxID_ANY, rigPort);
+            rigPortDialog->ShowModal();
         }
-        bManaged = true;
     }
 
     if (event.GetId() == wxID_RIG_TOGGLE) {
@@ -2274,6 +2309,13 @@ int AppFrame::OnGlobalKeyDown(wxKeyEvent &event) {
     if (!this->IsActive()) {
         return -1;
     }
+    
+#ifdef USE_HAMLIB
+    if (rigPortDialog != nullptr) {
+        return -1;
+    }
+#endif
+    
     if (modemProps && (modemProps->HasFocus() || modemProps->isMouseInView())) {
         return -1;
     }
@@ -2388,6 +2430,13 @@ int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) {
     if (!this->IsActive()) {
         return -1;
     }
+    
+#ifdef USE_HAMLIB
+    if (rigPortDialog != nullptr) {
+        return -1;
+    }
+#endif
+    
     if (modemProps && (modemProps->HasFocus() || modemProps->isMouseInView())) {
         return -1;
     }
diff --git a/src/AppFrame.h b/src/AppFrame.h
index eb9cc48..2f656f3 100644
--- a/src/AppFrame.h
+++ b/src/AppFrame.h
@@ -81,6 +81,10 @@
 #define wxID_RIG_MODEL_BASE 12000
 #endif
 
+#ifdef USE_HAMLIB
+class PortSelectorDialog;
+#endif
+
 // Define a new frame type
 class AppFrame: public wxFrame {
 public:
@@ -133,6 +137,11 @@ public:
     void setStatusText(wxWindow* window, std::string statusText);
     void setStatusText(std::string statusText, int value);
     
+#ifdef USE_HAMLIB
+    void setRigControlPort(std::string portName);
+    void dismissRigControlPortDialog();
+#endif
+    
 private:
     void OnMenu(wxCommandEvent& event);
     void OnClose(wxCloseEvent& event);
@@ -231,7 +240,6 @@ private:
     wxMenuItem *rigFollowMenuItem;
     wxMenuItem *rigCenterLockMenuItem;
     wxMenuItem *rigFollowModemMenuItem;
-    wxMenuItem *sdrIFMenuItem;
     
     std::map<int, wxMenuItem *> rigSerialMenuItems;
     std::map<int, wxMenuItem *> rigModelMenuItems;
@@ -241,7 +249,7 @@ private:
     std::vector<int> rigSerialRates;
     std::string rigPort;
     int numRigs;
-    bool rigInit;
+    PortSelectorDialog *rigPortDialog;
 #endif
 
     wxDECLARE_EVENT_TABLE();
diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp
index 3c7d6ae..7f0770e 100644
--- a/src/BookmarkMgr.cpp
+++ b/src/BookmarkMgr.cpp
@@ -7,10 +7,17 @@
 
 #define BOOKMARK_RECENTS_MAX 25
 
+BookmarkEntry::~BookmarkEntry() {
+    delete node;
+}
+
 BookmarkMgr::BookmarkMgr() {
     rangesSorted = false;
 }
 
+//represents an empty BookMarkList that is returned by reference by some functions.
+const BookmarkList BookmarkMgr::emptyResults;
+
 void BookmarkMgr::saveToFile(std::string bookmarkFn, bool backup) {
     DataTree s("cubicsdr_bookmarks");
     DataNode *header = s.rootNode()->newChild("header");
@@ -199,19 +206,18 @@ bool BookmarkMgr::hasBackup(std::string bookmarkFn) {
 }
 
 void BookmarkMgr::addBookmark(std::string group, DemodulatorInstance *demod) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
+	//Create a BookmarkEntry from demod data, saving its
+	//characteristics in be->node.
     BookmarkEntryPtr be = demodToBookmarkEntry(demod);
-    
-    //copy settings of demod into be->node
-    wxGetApp().getDemodMgr().saveInstance(be->node, demod);
-    
+     
     bmData[group].push_back(be);
     bmDataSorted[group] = false;
 }
 
 void BookmarkMgr::addBookmark(std::string group, BookmarkEntryPtr be) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
     bmData[group].push_back(be);
     bmDataSorted[group] = false;
@@ -219,7 +225,7 @@ void BookmarkMgr::addBookmark(std::string group, BookmarkEntryPtr be) {
 
 
 void BookmarkMgr::removeBookmark(std::string group, BookmarkEntryPtr be) {
-    std::lock_guard < std::mutex > lockData(busy_lock);
+    std::lock_guard < std::recursive_mutex > lockData(busy_lock);
     std::lock_guard < std::mutex > lockEnt(be->busy_lock);
 
     if (bmData.find(group) == bmData.end()) {
@@ -235,7 +241,7 @@ void BookmarkMgr::removeBookmark(std::string group, BookmarkEntryPtr be) {
 }
 
 void BookmarkMgr::removeBookmark(BookmarkEntryPtr be) {
-    std::lock_guard < std::mutex > lockData(busy_lock);
+    std::lock_guard < std::recursive_mutex > lockData(busy_lock);
     std::lock_guard < std::mutex > lockEnt(be->busy_lock);
     
     for (auto &bmd_i : bmData) {
@@ -247,7 +253,7 @@ void BookmarkMgr::removeBookmark(BookmarkEntryPtr be) {
 }
 
 void BookmarkMgr::moveBookmark(BookmarkEntryPtr be, std::string group) {
-    std::lock_guard < std::mutex > lockData(busy_lock);
+    std::lock_guard < std::recursive_mutex > lockData(busy_lock);
     std::lock_guard < std::mutex > lockEnt(be->busy_lock);
     
     for (auto &bmd_i : bmData) {
@@ -267,7 +273,7 @@ void BookmarkMgr::moveBookmark(BookmarkEntryPtr be, std::string group) {
 
 
 void BookmarkMgr::addGroup(std::string group) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
     if (bmData.find(group) == bmData.end()) {
         BookmarkList dummy = bmData[group];
@@ -275,7 +281,7 @@ void BookmarkMgr::addGroup(std::string group) {
 }
 
 void BookmarkMgr::removeGroup(std::string group) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
     BookmarkMap::iterator i = bmData.find(group);
     
@@ -290,7 +296,7 @@ void BookmarkMgr::renameGroup(std::string group, std::string ngroup) {
         return;
     }
     
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
     BookmarkMap::iterator i = bmData.find(group);
     BookmarkMap::iterator it = bmData.find(ngroup);
@@ -306,12 +312,11 @@ void BookmarkMgr::renameGroup(std::string group, std::string ngroup) {
     }
 }
 
-BookmarkList BookmarkMgr::getBookmarks(std::string group) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+const BookmarkList& BookmarkMgr::getBookmarks(std::string group) {
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
     if (bmData.find(group) == bmData.end()) {
-        BookmarkList results;
-        return results;
+        return emptyResults;
     }
     
     if (!bmDataSorted[group]) {
@@ -324,7 +329,7 @@ BookmarkList BookmarkMgr::getBookmarks(std::string group) {
 
 
 void BookmarkMgr::getGroups(BookmarkNames &arr) {
-    std::lock_guard < std::mutex > lockData(busy_lock);
+    std::lock_guard < std::recursive_mutex > lockData(busy_lock);
 
     for (BookmarkMap::iterator i = bmData.begin(); i!= bmData.end(); ++i) {
         arr.push_back(i->first);
@@ -332,7 +337,7 @@ void BookmarkMgr::getGroups(BookmarkNames &arr) {
 }
 
 void BookmarkMgr::getGroups(wxArrayString &arr) {
-    std::lock_guard < std::mutex > lockData(busy_lock);
+    std::lock_guard < std::recursive_mutex > lockData(busy_lock);
 
     for (BookmarkMap::iterator i = bmData.begin(); i!= bmData.end(); ++i) {
         arr.push_back(i->first);
@@ -355,7 +360,9 @@ bool BookmarkMgr::getExpandState(std::string groupName) {
 
 void BookmarkMgr::updateActiveList() {
 
-  BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView();
+	std::lock_guard < std::recursive_mutex > lockData(busy_lock);
+	
+	BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView();
     
     if (bmv) {
         bmv->updateActiveList();
@@ -364,7 +371,7 @@ void BookmarkMgr::updateActiveList() {
 
 void BookmarkMgr::updateBookmarks() {
 
-    std::lock_guard < std::mutex > lockData(busy_lock);
+    std::lock_guard < std::recursive_mutex > lockData(busy_lock);
 
     BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView();
     
@@ -375,7 +382,7 @@ void BookmarkMgr::updateBookmarks() {
 
 void BookmarkMgr::updateBookmarks(std::string group) {
 
-    std::lock_guard < std::mutex > lockData(busy_lock);
+    std::lock_guard < std::recursive_mutex > lockData(busy_lock);
 
     BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView();
     
@@ -386,7 +393,7 @@ void BookmarkMgr::updateBookmarks(std::string group) {
 
 
 void BookmarkMgr::addRecent(DemodulatorInstance *demod) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
 
     recents.push_back(demodToBookmarkEntry(demod));
 
@@ -394,7 +401,7 @@ void BookmarkMgr::addRecent(DemodulatorInstance *demod) {
 }
 
 void BookmarkMgr::addRecent(BookmarkEntryPtr be) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
 
     recents.push_back(be);
 
@@ -404,7 +411,7 @@ void BookmarkMgr::addRecent(BookmarkEntryPtr be) {
 
 
 void BookmarkMgr::removeRecent(BookmarkEntryPtr be) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
     BookmarkList::iterator bm_i = std::find(recents.begin(),recents.end(), be);
  
@@ -414,14 +421,14 @@ void BookmarkMgr::removeRecent(BookmarkEntryPtr be) {
 }
 
 
-BookmarkList BookmarkMgr::getRecents() {
-    std::lock_guard < std::mutex > lockData(busy_lock);
-    return BookmarkList(recents.rbegin(), recents.rend());
+const BookmarkList& BookmarkMgr::getRecents() {
+    std::lock_guard < std::recursive_mutex > lockData(busy_lock);
+    return recents;
 }
 
 
 void BookmarkMgr::clearRecents() {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
 
     recents.clear();
 }
@@ -436,7 +443,7 @@ void BookmarkMgr::trimRecents() {
 
 
 void BookmarkMgr::addRange(BookmarkRangeEntryPtr re) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
     ranges.push_back(re);
     rangesSorted = false;
@@ -445,7 +452,7 @@ void BookmarkMgr::addRange(BookmarkRangeEntryPtr re) {
 
 
 void BookmarkMgr::removeRange(BookmarkRangeEntryPtr re) {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
     
     BookmarkRangeList::iterator re_i = std::find(ranges.begin(), ranges.end(), re);
     
@@ -456,8 +463,8 @@ void BookmarkMgr::removeRange(BookmarkRangeEntryPtr re) {
 }
 
 
-BookmarkRangeList BookmarkMgr::getRanges() {
-    std::lock_guard < std::mutex > lock(busy_lock);
+const BookmarkRangeList& BookmarkMgr::getRanges() {
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
 
     if (!rangesSorted) {
         std::sort(ranges.begin(), ranges.end(), BookmarkRangeEntryCompare());
@@ -469,7 +476,7 @@ BookmarkRangeList BookmarkMgr::getRanges() {
 
 
 void BookmarkMgr::clearRanges() {
-    std::lock_guard < std::mutex > lock(busy_lock);
+    std::lock_guard < std::recursive_mutex > lock(busy_lock);
 
     ranges.clear();
 }
@@ -540,3 +547,18 @@ std::wstring BookmarkMgr::getActiveDisplayName(DemodulatorInstance *demod) {
     return activeName;
 }
 
+void BookmarkMgr::removeActive(DemodulatorInstance *demod) {
+	
+	std::lock_guard < std::recursive_mutex > lock(busy_lock);
+
+	if (demod == nullptr) {
+		return;
+	}
+
+	//Delete demodulator
+	wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true);
+	wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false);
+	wxGetApp().removeDemodulator(demod);
+	wxGetApp().getDemodMgr().deleteThread(demod);
+}
+
diff --git a/src/BookmarkMgr.h b/src/BookmarkMgr.h
index fa1e64b..5f18b69 100644
--- a/src/BookmarkMgr.h
+++ b/src/BookmarkMgr.h
@@ -8,28 +8,26 @@
 #include <vector>
 #include <set>
 #include <memory>
-#include "DataTree.h"
 
 #include "DemodulatorInstance.h"
 
 
+class DataNode;
+
 class BookmarkEntry {
 public:
     std::mutex busy_lock;
 
     std::string type;
-    std::wstring label;
-    std::wstring userLabel;
+	//maps on the Demod user label.
+    std::wstring label; 
     
     long long frequency;
     int bandwidth;
     
     DataNode *node;
     
-    virtual ~BookmarkEntry() {
-        //free node
-        delete node;
-    }
+    virtual ~BookmarkEntry();
 };
 
 
@@ -96,7 +94,7 @@ public:
     void addGroup(std::string group);
     void removeGroup(std::string group);
     void renameGroup(std::string group, std::string ngroup);
-    BookmarkList getBookmarks(std::string group);
+    const BookmarkList& getBookmarks(std::string group);
     void getGroups(BookmarkNames &arr);
     void getGroups(wxArrayString &arr);
 
@@ -110,14 +108,16 @@ public:
     void addRecent(DemodulatorInstance *demod);
     void addRecent(BookmarkEntryPtr be);
     void removeRecent(BookmarkEntryPtr be);
-    BookmarkList getRecents();
+    const BookmarkList& getRecents();
     void clearRecents();
 
+	void removeActive(DemodulatorInstance *demod);
+
     void addRange(BookmarkRangeEntryPtr re);
     void removeRange(BookmarkRangeEntryPtr re);
-    BookmarkRangeList getRanges();
+    const BookmarkRangeList& getRanges();
     void clearRanges();
- 
+	
     static std::wstring getBookmarkEntryDisplayName(BookmarkEntryPtr bmEnt);
     static std::wstring getActiveDisplayName(DemodulatorInstance *demod);
 
@@ -133,7 +133,10 @@ protected:
     BookmarkList recents;
     BookmarkRangeList ranges;
     bool rangesSorted;
-    std::mutex busy_lock;
+    std::recursive_mutex busy_lock;
     
     BookmarkExpandState expandState;
+
+	//represents an empty BookMarkList that is returned by reference by some functions.
+	static const BookmarkList emptyResults;
 };
diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp
index a2aa0e8..4e4931c 100644
--- a/src/CubicSDR.cpp
+++ b/src/CubicSDR.cpp
@@ -247,7 +247,7 @@ bool CubicSDR::OnInit() {
 #endif
         
     
-    wxApp::SetAppName("CubicSDR");
+    wxApp::SetAppName(CUBICSDR_INSTALL_NAME);
 
 #ifdef USE_HAMLIB
     t_Rig = nullptr;
diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp
index e8661ac..355daa6 100644
--- a/src/demod/DemodulatorInstance.cpp
+++ b/src/demod/DemodulatorInstance.cpp
@@ -442,19 +442,19 @@ float DemodulatorInstance::getGain() {
 }
 
 bool DemodulatorInstance::isFollow()  {
-    return follow;
+    return follow.load();
 }
 
 void DemodulatorInstance::setFollow(bool follow) {
-    this->follow = follow;
+    this->follow.store(follow);
 }
 
 bool DemodulatorInstance::isTracking()  {
-    return tracking;
+    return tracking.load();
 }
 
 void DemodulatorInstance::setTracking(bool tracking) {
-    this->tracking = tracking;
+    this->tracking.store(tracking);
 }
 
 bool DemodulatorInstance::isDeltaLock() {
diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp
index a2b02d1..4fa9e85 100644
--- a/src/demod/DemodulatorMgr.cpp
+++ b/src/demod/DemodulatorMgr.cpp
@@ -260,6 +260,27 @@ DemodulatorInstance *DemodulatorMgr::getLastActiveDemodulator() {
     return lastActiveDemodulator;
 }
 
+DemodulatorInstance *DemodulatorMgr::getLastDemodulatorWith(const std::string& type,
+															const std::wstring& userLabel,
+															long long frequency,
+															int bandwidth) {
+	std::lock_guard < std::recursive_mutex > lock(demods_busy);
+
+	//backwards search: 
+	for (std::vector<DemodulatorInstance *>::reverse_iterator it = demods.rbegin(); it != demods.rend(); it++) {
+
+		if ((*it)->getDemodulatorType() == type &&
+			(*it)->getDemodulatorUserLabel() == userLabel &&
+			(*it)->getFrequency() == frequency &&
+			(*it)->getBandwidth() == bandwidth) {
+
+			return (*it);
+		}
+	}
+
+	return nullptr;
+}
+
 //Private internal method, no need to protect it with demods_busy
 void DemodulatorMgr::garbageCollect() {
     if (demods_deleted.size()) {
@@ -414,8 +435,11 @@ void DemodulatorMgr::saveInstance(DataNode *node, DemodulatorInstance *inst) {
 }
 
 DemodulatorInstance *DemodulatorMgr::loadInstance(DataNode *node) {
+
+	std::lock_guard < std::recursive_mutex > lock(demods_busy);
+
     DemodulatorInstance *newDemod = nullptr;
-    
+	 
     node->rewindAll();
     
     long bandwidth = *node->getNext("bandwidth");
@@ -482,7 +506,7 @@ DemodulatorInstance *DemodulatorMgr::loadInstance(DataNode *node) {
         }
     }
     
-    newDemod = wxGetApp().getDemodMgr().newThread();
+    newDemod = newThread();
 
     newDemod->setDemodulatorType(type);
     newDemod->setDemodulatorUserLabel(user_label);
@@ -501,12 +525,14 @@ DemodulatorInstance *DemodulatorMgr::loadInstance(DataNode *node) {
         newDemod->setSquelchLevel(squelch_level);
     }
     
+	//Attach to sound output:
     bool found_device = false;
     std::map<int, RtAudio::DeviceInfo>::iterator i;
     for (i = outputDevices.begin(); i != outputDevices.end(); i++) {
         if (i->second.name == output_device) {
             newDemod->setOutputDevice(i->first);
             found_device = true;
+			break;
         }
     }
     
diff --git a/src/demod/DemodulatorMgr.h b/src/demod/DemodulatorMgr.h
index 41b0945..ca65c22 100644
--- a/src/demod/DemodulatorMgr.h
+++ b/src/demod/DemodulatorMgr.h
@@ -32,6 +32,10 @@ public:
     void setActiveDemodulator(DemodulatorInstance *demod, bool temporary = true);
     DemodulatorInstance *getActiveDemodulator();
     DemodulatorInstance *getLastActiveDemodulator();
+	DemodulatorInstance *getLastDemodulatorWith(const std::string& type,
+												const std::wstring& userLabel,
+												long long frequency,
+												int bandwidth);
 
     int getLastBandwidth() const;
     void setLastBandwidth(int lastBandwidth);
@@ -61,6 +65,7 @@ public:
     
     void setOutputDevices(std::map<int,RtAudio::DeviceInfo> devs);
     void saveInstance(DataNode *node, DemodulatorInstance *inst);
+	
     DemodulatorInstance *loadInstance(DataNode *node);
     
 private:
diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp
index 259e76c..cb3efd4 100644
--- a/src/forms/Bookmark/BookmarkPanel.cpp
+++ b/src/forms/Bookmark/BookmarkPanel.cpp
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Aug 23 2015)
+// C++ code generated with wxFormBuilder (version Jun 17 2015)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO "NOT" EDIT THIS FILE!
@@ -20,7 +20,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po
 	m_clearSearchButton = new wxButton( this, wxID_ANY, wxT("Clear Search"), wxDefaultPosition, wxDefaultSize, 0 );
 	bSizer1->Add( m_clearSearchButton, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
 	
-	m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE );
+	m_treeView = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE );
 	bSizer1->Add( m_treeView, 1, wxEXPAND, 5 );
 	
 	m_propPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
@@ -89,16 +89,11 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po
 	m_searchText->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( BookmarkPanel::onSearchTextFocus ), NULL, this );
 	m_searchText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onSearchText ), NULL, this );
 	m_clearSearchButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onClearSearch ), NULL, this );
-    
-    //VSO: Added m_treeView wxEVT_ENTER_WINDOW/wxEVT_LEAVE_WINDOW that was missing.
-    m_treeView->Connect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(BookmarkPanel::onEnterWindow), NULL, this);
-    m_treeView->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(BookmarkPanel::onLeaveWindow), NULL, this);
-	
-    m_treeView->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this );
+	m_treeView->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ), NULL, this );
+	m_treeView->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ), NULL, this );
+	m_treeView->Connect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this );
 	m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this );
-	m_treeView->Connect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this );
 	m_treeView->Connect( wxEVT_COMMAND_TREE_END_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeEndDrag ), NULL, this );
-	m_treeView->Connect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this );
 	m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this );
 	m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this );
 	m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this );
@@ -121,16 +116,11 @@ BookmarkPanel::~BookmarkPanel()
 	m_searchText->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( BookmarkPanel::onSearchTextFocus ), NULL, this );
 	m_searchText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onSearchText ), NULL, this );
 	m_clearSearchButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BookmarkPanel::onClearSearch ), NULL, this );
-
-    //VSO: Added m_treeView wxEVT_ENTER_WINDOW/wxEVT_LEAVE_WINDOW that was missing.
-    m_treeView->Disconnect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(BookmarkPanel::onEnterWindow), NULL, this);
-    m_treeView->Disconnect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(BookmarkPanel::onLeaveWindow), NULL, this);
-
+	m_treeView->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( BookmarkPanel::onEnterWindow ), NULL, this );
+	m_treeView->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BookmarkPanel::onLeaveWindow ), NULL, this );
 	m_treeView->Disconnect( wxEVT_MOTION, wxMouseEventHandler( BookmarkPanel::onMotion ), NULL, this );
 	m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeBeginDrag ), NULL, this );
-	m_treeView->Disconnect( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeBeginLabelEdit ), NULL, this );
 	m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_DRAG, wxTreeEventHandler( BookmarkPanel::onTreeEndDrag ), NULL, this );
-	m_treeView->Disconnect( wxEVT_COMMAND_TREE_END_LABEL_EDIT, wxTreeEventHandler( BookmarkPanel::onTreeEndLabelEdit ), NULL, this );
 	m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this );
 	m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this );
 	m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this );
diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp
index 8214f9d..5faf349 100644
--- a/src/forms/Bookmark/BookmarkPanel.fbp
+++ b/src/forms/Bookmark/BookmarkPanel.fbp
@@ -311,7 +311,7 @@
                         <property name="resize">Resizable</property>
                         <property name="show">1</property>
                         <property name="size"></property>
-                        <property name="style">wxTR_DEFAULT_STYLE|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE</property>
+                        <property name="style">wxTR_DEFAULT_STYLE|wxTR_HAS_VARIABLE_ROW_HEIGHT|wxTR_HIDE_ROOT|wxTR_SINGLE</property>
                         <property name="subclass"></property>
                         <property name="toolbar_pane">0</property>
                         <property name="tooltip"></property>
@@ -319,12 +319,12 @@
                         <property name="window_name"></property>
                         <property name="window_style"></property>
                         <event name="OnChar"></event>
-                        <event name="OnEnterWindow"></event>
+                        <event name="OnEnterWindow">onEnterWindow</event>
                         <event name="OnEraseBackground"></event>
                         <event name="OnKeyDown"></event>
                         <event name="OnKeyUp"></event>
                         <event name="OnKillFocus"></event>
-                        <event name="OnLeaveWindow"></event>
+                        <event name="OnLeaveWindow">onLeaveWindow</event>
                         <event name="OnLeftDClick"></event>
                         <event name="OnLeftDown"></event>
                         <event name="OnLeftUp"></event>
@@ -341,11 +341,11 @@
                         <event name="OnSetFocus"></event>
                         <event name="OnSize"></event>
                         <event name="OnTreeBeginDrag">onTreeBeginDrag</event>
-                        <event name="OnTreeBeginLabelEdit">onTreeBeginLabelEdit</event>
+                        <event name="OnTreeBeginLabelEdit"></event>
                         <event name="OnTreeBeginRDrag"></event>
                         <event name="OnTreeDeleteItem"></event>
                         <event name="OnTreeEndDrag">onTreeEndDrag</event>
-                        <event name="OnTreeEndLabelEdit">onTreeEndLabelEdit</event>
+                        <event name="OnTreeEndLabelEdit"></event>
                         <event name="OnTreeGetInfo"></event>
                         <event name="OnTreeItemActivated">onTreeActivate</event>
                         <event name="OnTreeItemCollapsed">onTreeCollapse</event>
diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h
index ecb09cb..f6fd49f 100644
--- a/src/forms/Bookmark/BookmarkPanel.h
+++ b/src/forms/Bookmark/BookmarkPanel.h
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Aug 23 2015)
+// C++ code generated with wxFormBuilder (version Jun 17 2015)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO "NOT" EDIT THIS FILE!
@@ -57,9 +57,7 @@ class BookmarkPanel : public wxPanel
 		virtual void onSearchText( wxCommandEvent& event ) { event.Skip(); }
 		virtual void onClearSearch( wxCommandEvent& event ) { event.Skip(); }
 		virtual void onTreeBeginDrag( wxTreeEvent& event ) { event.Skip(); }
-		virtual void onTreeBeginLabelEdit( wxTreeEvent& event ) { event.Skip(); }
 		virtual void onTreeEndDrag( wxTreeEvent& event ) { event.Skip(); }
-		virtual void onTreeEndLabelEdit( wxTreeEvent& event ) { event.Skip(); }
 		virtual void onTreeActivate( wxTreeEvent& event ) { event.Skip(); }
 		virtual void onTreeCollapse( wxTreeEvent& event ) { event.Skip(); }
 		virtual void onTreeExpanded( wxTreeEvent& event ) { event.Skip(); }
diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp
index 1800cc0..883b813 100644
--- a/src/forms/Bookmark/BookmarkView.cpp
+++ b/src/forms/Bookmark/BookmarkView.cpp
@@ -154,6 +154,7 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos,
     visualDragItem = nullptr;
     nextEnt = nullptr;
     nextDemod = nullptr;
+    nextGroup = "";
 
     mouseTracker.setTarget(this);
 }
@@ -281,6 +282,9 @@ wxTreeItemId BookmarkView::refreshBookmarks() {
         groups[gn_i] = group_itm;
         if (prevSelCopy != nullptr && prevSelCopy->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP && gn_i == prevSelCopy->groupName) {
             bmSelFound = group_itm;
+        } else if (nextGroup != "" && gn_i == nextGroup) {
+            bmSelFound = group_itm;
+            nextGroup = "";
         }
     }
 
@@ -295,7 +299,8 @@ wxTreeItemId BookmarkView::refreshBookmarks() {
 
         bool groupExpanded = searchState || wxGetApp().getBookmarkMgr().getExpandState(gn_i);
 
-        BookmarkList bmList = wxGetApp().getBookmarkMgr().getBookmarks(gn_i);
+        const BookmarkList& bmList = wxGetApp().getBookmarkMgr().getBookmarks(gn_i);
+
         for (auto &bmEnt : bmList) {
             std::wstring labelVal = BookmarkMgr::getBookmarkEntryDisplayName(bmEnt);
 
@@ -304,7 +309,7 @@ wxTreeItemId BookmarkView::refreshBookmarks() {
                 std::string bwStr = frequencyToStr(bmEnt->bandwidth);
 
                 std::wstring fullText = labelVal +
-                    L" " + bmEnt->userLabel +
+                    L" " + bmEnt->label +
                     L" " + std::to_wstring(bmEnt->frequency) +
                     L" " + std::wstring(freqStr.begin(),freqStr.end()) +
                     L" " + std::wstring(bwStr.begin(),bwStr.end()) +
@@ -393,6 +398,7 @@ void BookmarkView::doUpdateActiveList() {
         
         if (nextDemod != nullptr && nextDemod == demod_i) {
             selItem = itm;
+            wxGetApp().getDemodMgr().setActiveDemodulator(nextDemod, false);
             nextDemod = nullptr;
         } else if (!selItem && activeExpandState && lastActiveDemodulator && lastActiveDemodulator == demod_i) {
             selItem = itm;
@@ -401,7 +407,9 @@ void BookmarkView::doUpdateActiveList() {
 
     bool rangeExpandState = searchState?false:expandState["range"];
     
-    BookmarkRangeList bmRanges = wxGetApp().getBookmarkMgr().getRanges();
+	//Ranges
+    const BookmarkRangeList& bmRanges = wxGetApp().getBookmarkMgr().getRanges();
+
     m_treeView->DeleteChildren(rangeBranch);
     
     for (auto &re_i: bmRanges) {
@@ -430,7 +438,7 @@ void BookmarkView::doUpdateActiveList() {
     bool recentExpandState = searchState || expandState["recent"];
     
     // Recents
-    BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents();
+    const BookmarkList& bmRecents = wxGetApp().getBookmarkMgr().getRecents();
     m_treeView->DeleteChildren(recentBranch);
     
     for (auto &bmr_i: bmRecents) {
@@ -452,7 +460,6 @@ void BookmarkView::doUpdateActiveList() {
             std::string bwStr = frequencyToStr(bmr_i->bandwidth);
             
             std::wstring fullText = labelVal +
-                L" " + bmr_i->userLabel +
                 L" " + std::to_wstring(bmr_i->frequency) +
                 L" " + std::wstring(freqStr.begin(),freqStr.end()) +
                 L" " + std::wstring(bwStr.begin(),bwStr.end()) +
@@ -499,72 +506,6 @@ void BookmarkView::doUpdateActiveList() {
 }
 
 
-void BookmarkView::onTreeBeginLabelEdit( wxTreeEvent& event ) {
-    TreeViewItem* tvi = dynamic_cast<TreeViewItem*>(m_treeView->GetItemData(event.GetItem()));
-
-    //if edition do not work, m_treeView->GetEditControl() may be null...
-    if (!tvi || (m_treeView->GetEditControl() == NULL)) {
-        event.Veto();
-        return;
-    }
-    
-    if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE ||
-        tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT ||
-        tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK ||
-        tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP ||
-        tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE)
-    {
-        event.Allow();
-        editingLabel = true;
-    } else {
-        event.Veto();
-    }
-}
-
-
-void BookmarkView::onTreeEndLabelEdit( wxTreeEvent& event ) {
-    wxTreeItemId itm = event.GetItem();
-    TreeViewItem* tvi = dynamic_cast<TreeViewItem*>(m_treeView->GetItemData(itm));
-    
-    //if edition do not work, m_treeView->GetEditControl() may be null...
-    if (m_treeView->GetEditControl() == NULL) {
-        event.Veto();
-        return;
-    }
-
-    std::wstring newText = m_treeView->GetEditControl()->GetValue().ToStdWstring();
-    
-    editingLabel = false;
-    
-    if (!tvi) {
-        return;
-    }
-    
-    if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) {
-        tvi->demod->setDemodulatorUserLabel(newText);
-        wxGetApp().getBookmarkMgr().updateActiveList();
-    } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) {
-        tvi->bookmarkEnt->label = newText;
-        tvi->bookmarkEnt->node->child("user_label")->element()->set(newText);
-        wxGetApp().getBookmarkMgr().updateActiveList();
-    } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_BOOKMARK) {
-        tvi->bookmarkEnt->label = newText;
-        tvi->bookmarkEnt->node->child("user_label")->element()->set(newText);
-        wxGetApp().getBookmarkMgr().updateBookmarks();
-    } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) {
-        std::string newGroup = m_treeView->GetEditControl()->GetValue().ToStdString();
-        wxGetApp().getBookmarkMgr().renameGroup(tvi->groupName, newGroup);
-        wxGetApp().getBookmarkMgr().updateBookmarks();
-    } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) {
-        std::wstring newName = m_treeView->GetEditControl()->GetValue().ToStdWstring();
-        if (newName.length() != 0) {
-            tvi->rangeEnt->label = newName;
-            wxGetApp().getBookmarkMgr().updateActiveList();
-        }
-    }
-}
-
-
 void BookmarkView::onTreeActivate( wxTreeEvent& event ) {
 
     wxTreeItemId itm = event.GetItem();
@@ -572,10 +513,7 @@ void BookmarkView::onTreeActivate( wxTreeEvent& event ) {
 
     if (tvi) {
         if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_ACTIVE) {
-            if (!tvi->demod->isActive()) {
-                
-                wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,true);
-                wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod,false);
+            if (!tvi->demod->isActive()) {                
                 wxGetApp().setFrequency(tvi->demod->getFrequency());
                 nextDemod = tvi->demod;
             }
@@ -780,10 +718,9 @@ void BookmarkView::doMoveBookmark(BookmarkEntryPtr be, std::string group) {
 
 
 void BookmarkView::doRemoveActive(DemodulatorInstance *demod) {
-    wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true);
-    wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, false);
-    wxGetApp().removeDemodulator(demod);
-    wxGetApp().getDemodMgr().deleteThread(demod);
+
+	wxGetApp().getBookmarkMgr().removeActive(demod);
+	wxGetApp().getBookmarkMgr().updateActiveList();
 }
 
 
@@ -811,7 +748,8 @@ void BookmarkView::updateBookmarkChoices() {
 
 void BookmarkView::addBookmarkChoice(wxWindow *parent) {
     updateBookmarkChoices();
-    bookmarkChoice = new wxChoice(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, bookmarkChoices, wxALL|wxEXPAND, wxDefaultValidator, "Bookmark");
+    bookmarkChoice = new wxChoice(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, bookmarkChoices, wxEXPAND, wxDefaultValidator, "Bookmark");
+    bookmarkChoice->Select(0);
     bookmarkChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, (wxObjectEventFunction)&BookmarkView::onBookmarkChoice, nullptr, this);
     parent->GetSizer()->Add(bookmarkChoice, 0, wxALL | wxEXPAND);
 }
@@ -887,29 +825,42 @@ void BookmarkView::activeSelection(DemodulatorInstance *dsel) {
 
 
 void BookmarkView::activateBookmark(BookmarkEntryPtr bmEnt) {
-    DemodulatorInstance *newDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node);
-    
-    nextDemod = newDemod;
-    
-    wxTreeItemId selItem = m_treeView->GetSelection();
-    if (selItem) {
-        m_treeView->SelectItem(selItem, false);
-    }
-    
-    long long freq = newDemod->getFrequency();
-    long long currentFreq = wxGetApp().getFrequency();
-    long long currentRate = wxGetApp().getSampleRate();
-    
-    if ( ( abs(freq - currentFreq) > currentRate / 2 ) || ( abs( currentFreq - freq) > currentRate / 2 ) ) {
-        wxGetApp().setFrequency(freq);
-    }
-    
-    newDemod->run();
-    newDemod->setActive(true);
-    wxGetApp().bindDemodulator(newDemod);
-    
-    //order immediate refresh of the whole tree.
-    doUpdateActiveList();
+
+	wxTreeItemId selItem = m_treeView->GetSelection();
+	if (selItem) {
+		m_treeView->SelectItem(selItem, false);
+	}
+
+	//if a matching DemodulatorInstance do not exist yet, create it and activate it, else use
+	//the already existing one:
+	// we search among the list of existing demodulators the one matching 
+	//bmEnt and activate it. The search is made backwards, to select the most recently created one.
+	DemodulatorInstance *matchingDemod = wxGetApp().getDemodMgr().getLastDemodulatorWith(
+																		bmEnt->type,
+																		bmEnt->label, 
+																		bmEnt->frequency, 
+																		bmEnt->bandwidth);
+	//not found, create a new demod instance: 
+	if (matchingDemod == nullptr) {
+
+		matchingDemod = wxGetApp().getDemodMgr().loadInstance(bmEnt->node);
+		matchingDemod->run();
+		wxGetApp().bindDemodulator(matchingDemod);
+	}
+
+	matchingDemod->setActive(true);
+
+	long long freq = matchingDemod->getFrequency();
+	long long currentFreq = wxGetApp().getFrequency();
+	long long currentRate = wxGetApp().getSampleRate();
+
+	if ((abs(freq - currentFreq) > currentRate / 2) || (abs(currentFreq - freq) > currentRate / 2)) {
+		wxGetApp().setFrequency(freq);
+	}
+
+	nextDemod = matchingDemod;
+  
+	wxGetApp().getBookmarkMgr().updateActiveList();
 }
 
 
@@ -990,15 +941,14 @@ void BookmarkView::groupSelection(std::string groupName) {
     
     hideProps();
     
-    //    m_labelText->SetValue(groupSel);
+    m_labelText->SetValue(groupName);
     
-    //    m_labelText->Show();
-    //    m_labelLabel->Show();
+    m_labelText->Show();
+    m_labelLabel->Show();
     
     addButton(m_buttonPanel, "Remove Group", wxCommandEventHandler( BookmarkView::onRemoveGroup ));
-    addButton(m_buttonPanel, BOOKMARK_VIEW_STR_RENAME_GROUP, wxCommandEventHandler( BookmarkView::onRenameGroup ));
     
-    //    showProps();
+    showProps();
     
     showButtons();
     refreshLayout();
@@ -1111,6 +1061,7 @@ void BookmarkView::onTreeSelect( wxTreeEvent& event ) {
         if (tvi->demod->isActive()) {
             wxGetApp().getDemodMgr().setActiveDemodulator(nullptr, true);
             wxGetApp().getDemodMgr().setActiveDemodulator(tvi->demod, false);
+            tvi->demod->setTracking(true);
         }
     } else if (tvi->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RECENT) {
         recentSelection(tvi->bookmarkEnt);
@@ -1151,15 +1102,16 @@ void BookmarkView::onLabelText( wxCommandEvent& /* event */ ) {
         } else if (curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_RANGE) {
             curSel->rangeEnt->label = m_labelText->GetValue().ToStdWstring();
             wxGetApp().getBookmarkMgr().updateActiveList();
+        } else if (curSel->type == TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) {
+            std::string newGroupName = m_labelText->GetValue().ToStdString();
+
+            if (newGroupName != "" && newGroupName != curSel->groupName) {
+                wxGetApp().getBookmarkMgr().renameGroup(curSel->groupName, newGroupName);
+                nextGroup = newGroupName;
+                wxGetApp().getBookmarkMgr().updateBookmarks();
+            }
         }
     }
-
-    //    else if (groupSel != "") {
-//        std::string newGroupName = m_labelText->GetValue().ToStdString();
-//        wxGetApp().getBookmarkMgr().renameGroup(groupSel, newGroupName);
-//        groupSel = newGroupName;
-//        wxGetApp().getBookmarkMgr().updateBookmarks();
-//    }
 }
 
 
@@ -1194,7 +1146,6 @@ void BookmarkView::onRemoveActive( wxCommandEvent& /* event */ ) {
             return;
         }
         doRemoveActive(curSel->demod);
-        m_treeView->Delete(m_treeView->GetSelection());
     }
 }
 
@@ -1283,25 +1234,6 @@ void BookmarkView::onRemoveGroup( wxCommandEvent& /* event */ ) {
 }
 
 
-void BookmarkView::onRenameGroup( wxCommandEvent& /* event */ ) {
-    TreeViewItem *curSel = itemToTVI(m_treeView->GetSelection());
-    
-    if (!curSel || curSel->type != TreeViewItem::TREEVIEW_ITEM_TYPE_GROUP) {
-        return;
-    }
-    
-    wxString stringVal = "";
-    stringVal = wxGetTextFromUser(BOOKMARK_VIEW_STR_RENAME_GROUP, "New Group Name", curSel->groupName);
-    
-    std::string newGroupName = stringVal.Trim().ToStdString();
-    
-    if (newGroupName != "") {
-        wxGetApp().getBookmarkMgr().renameGroup(curSel->groupName, newGroupName);
-        wxGetApp().getBookmarkMgr().updateBookmarks();
-    }
-}
-
-
 void BookmarkView::onAddRange( wxCommandEvent& /* event */ ) {
     
     BookmarkRangeEntryPtr re = BookmarkView::makeActiveRangeEntry();
diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h
index 04d8e2b..6470bd5 100644
--- a/src/forms/Bookmark/BookmarkView.h
+++ b/src/forms/Bookmark/BookmarkView.h
@@ -106,8 +106,6 @@ protected:
     //refresh / rebuild the whole tree item immediatly
     void doUpdateActiveList();
 
-    void onTreeBeginLabelEdit( wxTreeEvent& event );
-    void onTreeEndLabelEdit( wxTreeEvent& event );
     void onTreeActivate( wxTreeEvent& event );
     void onTreeCollapse( wxTreeEvent& event );
     void onTreeExpanded( wxTreeEvent& event );
@@ -156,7 +154,6 @@ protected:
     
     void onAddGroup( wxCommandEvent& event );
     void onRemoveGroup( wxCommandEvent& event );
-    void onRenameGroup( wxCommandEvent& event );
 
     void onAddRange( wxCommandEvent& event );
     void onRemoveRange( wxCommandEvent& event );
@@ -195,6 +192,7 @@ protected:
     BookmarkEntryPtr nextEnt;
     BookmarkRangeEntryPtr nextRange;
     DemodulatorInstance *nextDemod;
+    std::string nextGroup;
     
     // Search
     std::vector<std::wstring> searchKeywords;
diff --git a/src/forms/Dialog/AboutDialog.fbp b/src/forms/Dialog/AboutDialog.fbp
index 596724b..9f9cb8a 100644
--- a/src/forms/Dialog/AboutDialog.fbp
+++ b/src/forms/Dialog/AboutDialog.fbp
@@ -2879,7 +2879,7 @@
                                         <property name="border">5</property>
                                         <property name="flag">wxALL|wxEXPAND</property>
                                         <property name="proportion">1</property>
-                                        <object class="wxBoxSizer" expanded="0">
+                                        <object class="wxBoxSizer" expanded="1">
                                             <property name="minimum_size"></property>
                                             <property name="name">m_dSizer</property>
                                             <property name="orient">wxVERTICAL</property>
@@ -6036,6 +6036,504 @@
                                                     <event name="OnUpdateUI"></event>
                                                 </object>
                                             </object>
+                                            <object class="sizeritem" expanded="1">
+                                                <property name="border">5</property>
+                                                <property name="flag">wxALL</property>
+                                                <property name="proportion">0</property>
+                                                <object class="wxStaticText" 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="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">Bob Schatzman</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_dBobSchatzman</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="1">
+                                                <property name="border">5</property>
+                                                <property name="flag">wxALL</property>
+                                                <property name="proportion">0</property>
+                                                <object class="wxStaticText" 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="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">Robert Ross</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_dRobertRoss</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="1">
+                                                <property name="border">5</property>
+                                                <property name="flag">wxALL</property>
+                                                <property name="proportion">0</property>
+                                                <object class="wxStaticText" 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="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">Roberto Bellotti</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_dRobertoBellotti</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="1">
+                                                <property name="border">5</property>
+                                                <property name="flag">wxALL</property>
+                                                <property name="proportion">0</property>
+                                                <object class="wxStaticText" 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="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">Serge Van der Torre</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_dSergeVanderTorre</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="1">
+                                                <property name="border">5</property>
+                                                <property name="flag">wxALL</property>
+                                                <property name="proportion">0</property>
+                                                <object class="wxStaticText" 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="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">Dieter Schneider</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_dDieterSchneider</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="1">
+                                                <property name="border">5</property>
+                                                <property name="flag">wxALL</property>
+                                                <property name="proportion">0</property>
+                                                <object class="wxStaticText" 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="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">Petrika Janeku</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_dPetrikaJaneku</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>
                                     </object>
                                 </object>
diff --git a/src/forms/Dialog/AboutDialogBase.cpp b/src/forms/Dialog/AboutDialogBase.cpp
index 4d0e350..12ac933 100644
--- a/src/forms/Dialog/AboutDialogBase.cpp
+++ b/src/forms/Dialog/AboutDialogBase.cpp
@@ -341,6 +341,30 @@ AboutDialogBase::AboutDialogBase( wxWindow* parent, wxWindowID id, const wxStrin
 	m_dKeshavlalPatel->Wrap( -1 );
 	m_dSizer->Add( m_dKeshavlalPatel, 0, wxALL, 5 );
 	
+	m_dBobSchatzman = new wxStaticText( m_dScroll, wxID_ANY, wxT("Bob Schatzman"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_dBobSchatzman->Wrap( -1 );
+	m_dSizer->Add( m_dBobSchatzman, 0, wxALL, 5 );
+	
+	m_dRobertRoss = new wxStaticText( m_dScroll, wxID_ANY, wxT("Robert Ross"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_dRobertRoss->Wrap( -1 );
+	m_dSizer->Add( m_dRobertRoss, 0, wxALL, 5 );
+	
+	m_dRobertoBellotti = new wxStaticText( m_dScroll, wxID_ANY, wxT("Roberto Bellotti"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_dRobertoBellotti->Wrap( -1 );
+	m_dSizer->Add( m_dRobertoBellotti, 0, wxALL, 5 );
+	
+	m_dSergeVanderTorre = new wxStaticText( m_dScroll, wxID_ANY, wxT("Serge Van der Torre"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_dSergeVanderTorre->Wrap( -1 );
+	m_dSizer->Add( m_dSergeVanderTorre, 0, wxALL, 5 );
+	
+	m_dDieterSchneider = new wxStaticText( m_dScroll, wxID_ANY, wxT("Dieter Schneider"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_dDieterSchneider->Wrap( -1 );
+	m_dSizer->Add( m_dDieterSchneider, 0, wxALL, 5 );
+	
+	m_dPetrikaJaneku = new wxStaticText( m_dScroll, wxID_ANY, wxT("Petrika Janeku"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_dPetrikaJaneku->Wrap( -1 );
+	m_dSizer->Add( m_dPetrikaJaneku, 0, wxALL, 5 );
+	
 	
 	m_dBSizer->Add( m_dSizer, 1, wxALL|wxEXPAND, 5 );
 	
diff --git a/src/forms/Dialog/AboutDialogBase.h b/src/forms/Dialog/AboutDialogBase.h
index 7dd8487..6029b1b 100644
--- a/src/forms/Dialog/AboutDialogBase.h
+++ b/src/forms/Dialog/AboutDialogBase.h
@@ -108,6 +108,12 @@ class AboutDialogBase : public wxDialog
 		wxStaticText* m_dTimothyGatton;
 		wxStaticText* m_dStephenCuccio;
 		wxStaticText* m_dKeshavlalPatel;
+		wxStaticText* m_dBobSchatzman;
+		wxStaticText* m_dRobertRoss;
+		wxStaticText* m_dRobertoBellotti;
+		wxStaticText* m_dSergeVanderTorre;
+		wxStaticText* m_dDieterSchneider;
+		wxStaticText* m_dPetrikaJaneku;
 		wxScrolledWindow* m_stScroll;
 		wxStaticText* m_stHeader;
 		wxStaticLine* m_stDivider1;
diff --git a/src/forms/Dialog/PortSelectorDialog.cpp b/src/forms/Dialog/PortSelectorDialog.cpp
new file mode 100644
index 0000000..74d31ab
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialog.cpp
@@ -0,0 +1,39 @@
+#include "PortSelectorDialog.h"
+
+#include "rs232.h"
+#include "CubicSDR.h"
+
+PortSelectorDialog::PortSelectorDialog( wxWindow* parent, wxWindowID id, std::string defaultPort ) : PortSelectorDialogBase(parent, id) {
+    comEnumerate();
+    
+    int nPorts = comGetNoPorts();
+    
+    for (int i = 0; i < nPorts; i++) {
+#ifdef WIN32
+        m_portList->Append(comGetPortName(i));
+#else
+        m_portList->Append(comGetInternalName(i));
+#endif
+    }
+    
+    comTerminate();
+    
+    m_portSelection->SetValue(defaultPort);
+}
+
+void PortSelectorDialog::onListSelect( wxCommandEvent& event ) {
+    int pSelect = m_portList->GetSelection();
+    if (pSelect != -1) {
+        m_portSelection->SetValue(m_portList->GetString(pSelect));
+    }
+}
+
+
+void PortSelectorDialog::onCancelButton( wxCommandEvent& event ) {
+    wxGetApp().getAppFrame()->dismissRigControlPortDialog();
+}
+
+
+void PortSelectorDialog::onOKButton( wxCommandEvent& event ) {
+    wxGetApp().getAppFrame()->setRigControlPort(m_portSelection->GetValue().ToStdString());
+}
diff --git a/src/forms/Dialog/PortSelectorDialog.fbp b/src/forms/Dialog/PortSelectorDialog.fbp
new file mode 100644
index 0000000..13b6b3c
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialog.fbp
@@ -0,0 +1,727 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<wxFormBuilder_Project>
+    <FileVersion major="1" minor="13" />
+    <object class="Project" expanded="1">
+        <property name="class_decoration"></property>
+        <property name="code_generation">C++</property>
+        <property name="disconnect_events">1</property>
+        <property name="disconnect_mode">source_name</property>
+        <property name="disconnect_php_events">0</property>
+        <property name="disconnect_python_events">0</property>
+        <property name="embedded_files_path">res</property>
+        <property name="encoding">UTF-8</property>
+        <property name="event_generation">connect</property>
+        <property name="file">PortSelectorDialogBase</property>
+        <property name="first_id">1000</property>
+        <property name="help_provider">none</property>
+        <property name="internationalize">0</property>
+        <property name="name">PortSelectorDialog</property>
+        <property name="namespace"></property>
+        <property name="path">.</property>
+        <property name="precompiled_header"></property>
+        <property name="relative_path">1</property>
+        <property name="skip_lua_events">1</property>
+        <property name="skip_php_events">1</property>
+        <property name="skip_python_events">1</property>
+        <property name="ui_table">UI</property>
+        <property name="use_enum">0</property>
+        <property name="use_microsoft_bom">0</property>
+        <object class="Dialog" expanded="1">
+            <property name="aui_managed">0</property>
+            <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+            <property name="bg"></property>
+            <property name="center">wxBOTH</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="enabled">1</property>
+            <property name="event_handler">impl_virtual</property>
+            <property name="extra_style"></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">PortSelectorDialogBase</property>
+            <property name="pos"></property>
+            <property name="size">304,197</property>
+            <property name="style">wxDEFAULT_DIALOG_STYLE</property>
+            <property name="subclass"></property>
+            <property name="title">Select Port</property>
+            <property name="tooltip"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+            <event name="OnActivate"></event>
+            <event name="OnActivateApp"></event>
+            <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="OnClose"></event>
+            <event name="OnEnterWindow"></event>
+            <event name="OnEraseBackground"></event>
+            <event name="OnHibernate"></event>
+            <event name="OnIconize"></event>
+            <event name="OnIdle"></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="wxBoxSizer" expanded="1">
+                <property name="minimum_size"></property>
+                <property name="name">dlgSizer</property>
+                <property name="orient">wxVERTICAL</property>
+                <property name="permission">none</property>
+                <object class="sizeritem" expanded="1">
+                    <property name="border">5</property>
+                    <property name="flag">wxEXPAND|wxALL</property>
+                    <property name="proportion">0</property>
+                    <object class="wxStaticText" 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="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">Select a detected port or enter your own</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_staticText1</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="1">
+                    <property name="border">5</property>
+                    <property name="flag">wxALL|wxEXPAND</property>
+                    <property name="proportion">1</property>
+                    <object class="wxListBox" 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">m_portList</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="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="OnListBox">onListSelect</event>
+                        <event name="OnListBoxDClick"></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="1">
+                    <property name="border">5</property>
+                    <property name="flag">wxEXPAND</property>
+                    <property name="proportion">1</property>
+                    <object class="wxBoxSizer" expanded="1">
+                        <property name="minimum_size">-1,30</property>
+                        <property name="name">bSizer3</property>
+                        <property name="orient">wxHORIZONTAL</property>
+                        <property name="permission">none</property>
+                        <object class="sizeritem" expanded="1">
+                            <property name="border">5</property>
+                            <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
+                            <property name="proportion">0</property>
+                            <object class="wxStaticText" 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="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">Port</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_staticText2</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="1">
+                            <property name="border">5</property>
+                            <property name="flag">wxEXPAND|wxRIGHT</property>
+                            <property name="proportion">1</property>
+                            <object class="wxTextCtrl" 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="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="maxlength"></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_portSelection</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="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="OnText"></event>
+                                <event name="OnTextEnter"></event>
+                                <event name="OnTextMaxLen"></event>
+                                <event name="OnTextURL"></event>
+                                <event name="OnUpdateUI"></event>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+                <object class="sizeritem" expanded="1">
+                    <property name="border">5</property>
+                    <property name="flag">wxEXPAND | wxALL</property>
+                    <property name="proportion">0</property>
+                    <object class="wxPanel" 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="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_buttonPanel</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="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">wxTAB_TRAVERSAL</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 class="wxBoxSizer" expanded="1">
+                            <property name="minimum_size"></property>
+                            <property name="name">bSizer2</property>
+                            <property name="orient">wxHORIZONTAL</property>
+                            <property name="permission">none</property>
+                            <object class="sizeritem" expanded="1">
+                                <property name="border">5</property>
+                                <property name="flag">wxALL|wxALIGN_BOTTOM</property>
+                                <property name="proportion">0</property>
+                                <object class="wxButton" 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="close_button">1</property>
+                                    <property name="context_help"></property>
+                                    <property name="context_menu">1</property>
+                                    <property name="default">0</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">Cancel</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_cancelButton</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="OnButtonClick">onCancelButton</event>
+                                    <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="1">
+                                <property name="border">5</property>
+                                <property name="flag">wxEXPAND</property>
+                                <property name="proportion">1</property>
+                                <object class="spacer" expanded="1">
+                                    <property name="height">0</property>
+                                    <property name="permission">protected</property>
+                                    <property name="width">0</property>
+                                </object>
+                            </object>
+                            <object class="sizeritem" expanded="1">
+                                <property name="border">5</property>
+                                <property name="flag">wxALL|wxALIGN_BOTTOM</property>
+                                <property name="proportion">0</property>
+                                <object class="wxButton" 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="close_button">1</property>
+                                    <property name="context_help"></property>
+                                    <property name="context_menu">1</property>
+                                    <property name="default">0</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">OK</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_okButton</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="OnButtonClick">onOKButton</event>
+                                    <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>
+                    </object>
+                </object>
+            </object>
+        </object>
+    </object>
+</wxFormBuilder_Project>
diff --git a/src/forms/Dialog/PortSelectorDialog.h b/src/forms/Dialog/PortSelectorDialog.h
new file mode 100644
index 0000000..92687d1
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialog.h
@@ -0,0 +1,11 @@
+#include "PortSelectorDialogBase.h"
+
+class PortSelectorDialog : public PortSelectorDialogBase {
+public:
+    PortSelectorDialog( wxWindow* parent, wxWindowID id = wxID_ANY, std::string defaultPort = "" );
+
+protected:
+    void onListSelect( wxCommandEvent& event );
+    void onCancelButton( wxCommandEvent& event );
+    void onOKButton( wxCommandEvent& event );
+};
diff --git a/src/forms/Dialog/PortSelectorDialogBase.cpp b/src/forms/Dialog/PortSelectorDialogBase.cpp
new file mode 100644
index 0000000..a8d5bf2
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialogBase.cpp
@@ -0,0 +1,78 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version Aug 23 2015)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO "NOT" EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "PortSelectorDialogBase.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+PortSelectorDialogBase::PortSelectorDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+	
+	wxBoxSizer* dlgSizer;
+	dlgSizer = new wxBoxSizer( wxVERTICAL );
+	
+	m_staticText1 = new wxStaticText( this, wxID_ANY, wxT("Select a detected port or enter your own"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText1->Wrap( -1 );
+	dlgSizer->Add( m_staticText1, 0, wxEXPAND|wxALL, 5 );
+	
+	m_portList = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); 
+	dlgSizer->Add( m_portList, 1, wxALL|wxEXPAND, 5 );
+	
+	wxBoxSizer* bSizer3;
+	bSizer3 = new wxBoxSizer( wxHORIZONTAL );
+	
+	bSizer3->SetMinSize( wxSize( -1,30 ) ); 
+	m_staticText2 = new wxStaticText( this, wxID_ANY, wxT("Port"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText2->Wrap( -1 );
+	bSizer3->Add( m_staticText2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_portSelection = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	bSizer3->Add( m_portSelection, 1, wxEXPAND|wxRIGHT, 5 );
+	
+	
+	dlgSizer->Add( bSizer3, 1, wxEXPAND, 5 );
+	
+	m_buttonPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+	wxBoxSizer* bSizer2;
+	bSizer2 = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_cancelButton = new wxButton( m_buttonPanel, wxID_ANY, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizer2->Add( m_cancelButton, 0, wxALL|wxALIGN_BOTTOM, 5 );
+	
+	
+	bSizer2->Add( 0, 0, 1, wxEXPAND, 5 );
+	
+	m_okButton = new wxButton( m_buttonPanel, wxID_ANY, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizer2->Add( m_okButton, 0, wxALL|wxALIGN_BOTTOM, 5 );
+	
+	
+	m_buttonPanel->SetSizer( bSizer2 );
+	m_buttonPanel->Layout();
+	bSizer2->Fit( m_buttonPanel );
+	dlgSizer->Add( m_buttonPanel, 0, wxEXPAND | wxALL, 5 );
+	
+	
+	this->SetSizer( dlgSizer );
+	this->Layout();
+	
+	this->Centre( wxBOTH );
+	
+	// Connect Events
+	m_portList->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( PortSelectorDialogBase::onListSelect ), NULL, this );
+	m_cancelButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PortSelectorDialogBase::onCancelButton ), NULL, this );
+	m_okButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PortSelectorDialogBase::onOKButton ), NULL, this );
+}
+
+PortSelectorDialogBase::~PortSelectorDialogBase()
+{
+	// Disconnect Events
+	m_portList->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( PortSelectorDialogBase::onListSelect ), NULL, this );
+	m_cancelButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PortSelectorDialogBase::onCancelButton ), NULL, this );
+	m_okButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PortSelectorDialogBase::onOKButton ), NULL, this );
+	
+}
diff --git a/src/forms/Dialog/PortSelectorDialogBase.h b/src/forms/Dialog/PortSelectorDialogBase.h
new file mode 100644
index 0000000..8e8c2af
--- /dev/null
+++ b/src/forms/Dialog/PortSelectorDialogBase.h
@@ -0,0 +1,58 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version Aug 23 2015)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO "NOT" EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#ifndef __PORTSELECTORDIALOGBASE_H__
+#define __PORTSELECTORDIALOGBASE_H__
+
+#include <wx/artprov.h>
+#include <wx/xrc/xmlres.h>
+#include <wx/string.h>
+#include <wx/stattext.h>
+#include <wx/gdicmn.h>
+#include <wx/font.h>
+#include <wx/colour.h>
+#include <wx/settings.h>
+#include <wx/listbox.h>
+#include <wx/textctrl.h>
+#include <wx/sizer.h>
+#include <wx/button.h>
+#include <wx/panel.h>
+#include <wx/dialog.h>
+
+///////////////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PortSelectorDialogBase
+///////////////////////////////////////////////////////////////////////////////
+class PortSelectorDialogBase : public wxDialog 
+{
+	private:
+	
+	protected:
+		wxStaticText* m_staticText1;
+		wxListBox* m_portList;
+		wxStaticText* m_staticText2;
+		wxTextCtrl* m_portSelection;
+		wxPanel* m_buttonPanel;
+		wxButton* m_cancelButton;
+		wxButton* m_okButton;
+		
+		// Virtual event handlers, overide them in your derived class
+		virtual void onListSelect( wxCommandEvent& event ) { event.Skip(); }
+		virtual void onCancelButton( wxCommandEvent& event ) { event.Skip(); }
+		virtual void onOKButton( wxCommandEvent& event ) { event.Skip(); }
+		
+	
+	public:
+		
+		PortSelectorDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Select Port"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 304,197 ), long style = wxDEFAULT_DIALOG_STYLE ); 
+		~PortSelectorDialogBase();
+	
+};
+
+#endif //__PORTSELECTORDIALOGBASE_H__
diff --git a/src/modules/modem/analog/ModemLSB.cpp b/src/modules/modem/analog/ModemLSB.cpp
index 140a90a..295a9c4 100644
--- a/src/modules/modem/analog/ModemLSB.cpp
+++ b/src/modules/modem/analog/ModemLSB.cpp
@@ -5,12 +5,7 @@
 
 ModemLSB::ModemLSB() : ModemAnalog() {
     // half band filter used for side-band elimination
-    //    demodAM_LSB = ampmodem_create(0.25, 0.25, LIQUID_AMPMODEM_LSB, 1);
-#ifdef WIN32
-	ssbFilt = firfilt_crcf_create_kaiser(23, 0.25, 90.0, 0.01f);
-#else
     ssbFilt = iirfilt_crcf_create_lowpass(6, 0.25);
-#endif
 	ssbShift = nco_crcf_create(LIQUID_NCO);
     nco_crcf_set_frequency(ssbShift,  (float)((2.0 * M_PI) * 0.25));
     c2rFilt = firhilbf_create(5, 90.0);
@@ -26,14 +21,9 @@ std::string ModemLSB::getName() {
 }
 
 ModemLSB::~ModemLSB() {
-#ifdef WIN32
-    firfilt_crcf_destroy(ssbFilt);
-#else
 	iirfilt_crcf_destroy(ssbFilt);
-#endif
 	nco_crcf_destroy(ssbShift);
     firhilbf_destroy(c2rFilt);
-    //    ampmodem_destroy(demodAM_LSB);
 }
 
 int ModemLSB::checkSampleRate(long long sampleRate, int /* audioSampleRate */) {
@@ -64,15 +54,8 @@ void ModemLSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *a
     for (size_t i = 0; i < bufSize; i++) { // Reject upper band
         nco_crcf_step(ssbShift);
         nco_crcf_mix_up(ssbShift, input->data[i], &x);
-#ifdef WIN32
-		firfilt_crcf_push(ssbFilt, x);
-		firfilt_crcf_execute(ssbFilt, &y);
-#else
 		iirfilt_crcf_execute(ssbFilt, x, &y);
-#endif
         nco_crcf_mix_down(ssbShift, y, &x);
-        // Liquid-DSP AMPModem SSB drifts with strong signals near baseband (like a carrier?)
-        // ampmodem_demodulate(demodAM_LSB, y, &demodOutputData[i]);
         firhilbf_c2r_execute(c2rFilt, x, &demodOutputData[i]);
     }
     
diff --git a/src/modules/modem/analog/ModemLSB.h b/src/modules/modem/analog/ModemLSB.h
index 8834313..9804edf 100644
--- a/src/modules/modem/analog/ModemLSB.h
+++ b/src/modules/modem/analog/ModemLSB.h
@@ -19,13 +19,7 @@ public:
     void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut);
     
 private:
-#ifdef WIN32
-	firfilt_crcf ssbFilt;
-#else
 	iirfilt_crcf ssbFilt;
-#endif
     firhilbf c2rFilt;
     nco_crcf ssbShift;
-    //    firfilt_crcf ssbFilt;
-    //    ampmodem demodAM_LSB;
 };
\ No newline at end of file
diff --git a/src/modules/modem/analog/ModemUSB.cpp b/src/modules/modem/analog/ModemUSB.cpp
index f221f2c..775fadc 100644
--- a/src/modules/modem/analog/ModemUSB.cpp
+++ b/src/modules/modem/analog/ModemUSB.cpp
@@ -5,12 +5,7 @@
 
 ModemUSB::ModemUSB() : ModemAnalog() {
     // half band filter used for side-band elimination
-    //    demodAM_USB = ampmodem_create(0.25, -0.25, LIQUID_AMPMODEM_USB, 1);
-#ifdef WIN32
-	ssbFilt = firfilt_crcf_create_kaiser(23, 0.25, 90.0, 0.01f);
-#else
 	ssbFilt = iirfilt_crcf_create_lowpass(6, 0.25);
-#endif
 	ssbShift = nco_crcf_create(LIQUID_NCO);
     nco_crcf_set_frequency(ssbShift,  (float)((2.0 * M_PI) * 0.25));
     c2rFilt = firhilbf_create(5, 90.0);
@@ -26,14 +21,9 @@ std::string ModemUSB::getName() {
 }
 
 ModemUSB::~ModemUSB() {
-#ifdef WIN32
-	firfilt_crcf_destroy(ssbFilt);
-#else
 	iirfilt_crcf_destroy(ssbFilt);
-#endif
 	nco_crcf_destroy(ssbShift);
     firhilbf_destroy(c2rFilt);
-    //    ampmodem_destroy(demodAM_USB);
 }
 
 int ModemUSB::checkSampleRate(long long sampleRate, int /* audioSampleRate */) {
@@ -64,15 +54,8 @@ void ModemUSB::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *a
     for (size_t i = 0; i < bufSize; i++) { // Reject lower band
         nco_crcf_step(ssbShift);
         nco_crcf_mix_down(ssbShift, input->data[i], &x);
-#ifdef WIN32
-		firfilt_crcf_push(ssbFilt, x);
-		firfilt_crcf_execute(ssbFilt, &y);
-#else
 		iirfilt_crcf_execute(ssbFilt, x, &y);
-#endif
 		nco_crcf_mix_up(ssbShift, y, &x);
-        // Liquid-DSP AMPModem SSB drifts with strong signals near baseband (like a carrier?)
-        // ampmodem_demodulate(demodAM_USB, y, &demodOutputData[i]);
         firhilbf_c2r_execute(c2rFilt, x, &demodOutputData[i]);
     }
     
diff --git a/src/modules/modem/analog/ModemUSB.h b/src/modules/modem/analog/ModemUSB.h
index e7ae61d..7c86ed3 100644
--- a/src/modules/modem/analog/ModemUSB.h
+++ b/src/modules/modem/analog/ModemUSB.h
@@ -19,12 +19,7 @@ public:
     void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut);
     
 private:
-#ifdef WIN32
-	firfilt_crcf ssbFilt;
-#else
 	iirfilt_crcf ssbFilt;
-#endif
 	firhilbf c2rFilt;
     nco_crcf ssbShift;
-//    ampmodem demodAM_USB;
 };
\ No newline at end of file
diff --git a/src/util/GLFont.cpp b/src/util/GLFont.cpp
index e3e7e5f..5acf124 100644
--- a/src/util/GLFont.cpp
+++ b/src/util/GLFont.cpp
@@ -633,12 +633,7 @@ void GLFont::drawString(const std::wstring& str, int pxHeight, float xpos, float
 void GLFont::drawString(const std::string& str, int pxHeight, float xpos, float ypos, Align hAlign, Align vAlign, int vpx, int vpy, bool cacheable) {
 
     //Displayed string is wstring, so use wxString to do the heavy lifting of converting  str...
-#ifdef WIN32
-    //try to reuse the memory with thread_local, unsupported on OSX ? 
-    static thread_local wxString wsTmp;
-#else
     wxString wsTmp;
-#endif
     
     wsTmp.assign(str);
 
diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp
index 510aa79..72f0be5 100644
--- a/src/visual/PrimaryGLContext.cpp
+++ b/src/visual/PrimaryGLContext.cpp
@@ -359,12 +359,8 @@ void PrimaryGLContext::DrawDemod(DemodulatorInstance *demod, RGBA4f color, long
     GLFont::Align demodAlign = GLFont::GLFONT_ALIGN_CENTER;
 
     //Displayed string is wstring, so use wxString to do the heavy lifting of converting  getDemodulatorType()...
-#ifdef WIN32
-    //try to reuse the memory with thread_local, unsupported on OSX ? 
-    static thread_local wxString demodStr;
-#else
     wxString demodStr;
-#endif
+
     demodStr.assign(demod->getDemodulatorType());
 
     demodAlign = GLFont::GLFONT_ALIGN_CENTER;
diff --git a/src/visual/ScopeContext.cpp b/src/visual/ScopeContext.cpp
index 1a5f1f2..f0b0a76 100644
--- a/src/visual/ScopeContext.cpp
+++ b/src/visual/ScopeContext.cpp
@@ -41,7 +41,7 @@ void ScopeContext::DrawTunerTitles(bool ppmMode) {
     GLFont::Drawer refDrawingFont = GLFont::getFont(12, GLFont::getScaleFactor());
 
     //better position frequency/bandwith labels according to font scale
-    double shiftFactor = GLFont::getScaleFactor();
+    double shiftFactor = GLFont::getScaleFactor()+0.5;
    
     refDrawingFont.drawString(ppmMode?"Device PPM":"Frequency", -0.66f, -1.0 +hPos*shiftFactor, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true);
     refDrawingFont.drawString("Bandwidth", 0.0, -1.0 +hPos*shiftFactor, GLFont::GLFONT_ALIGN_CENTER, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true);

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



More information about the pkg-hamradio-commits mailing list