diff --git a/bcmhotproxy/Makefile b/bcmhotproxy/Makefile
index 64911cf88e5142d4738f5f78e73035a6f2a538e4..6bfbe8fb4e4dd3c70a1bfdcfc86c37a5cf7853f1 100644
--- a/bcmhotproxy/Makefile
+++ b/bcmhotproxy/Makefile
@@ -9,41 +9,45 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=bcmhotproxy
+PKG_VERSION:=1.0.0
 PKG_RELEASE:=13
 
-PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
-STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
+PKG_SOURCE_VERSION:=63a265031b870a0aa6b45352cf28224518a31638
+PKG_SOURCE_PROTO:=git
+ifeq ($(CONFIG_BCM_OPEN),y)
+PKG_SOURCE_URL:=http://public.inteno.se/bcmhotproxy
+else
+PKG_SOURCE_URL:=git@public.inteno.se:bcmhotproxy
+endif
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
+STAMP_PREPARED:=$(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
 
 include $(INCLUDE_DIR)/package.mk
 
 define Package/bcmhotproxy
-  SECTION:=utils
-  CATEGORY:=Base system
-  TITLE:=Daemon That feeds broadcom driver calls to hotplug2
+	SECTION:=utils
+	CATEGORY:=Base system
+	TITLE:=Daemon That feeds broadcom driver calls to hotplug2
 endef
 
 define Package/bcmhotproxy/description
  This package contains a Daemon that will listen to link events from broadcoms adsl driver and etherent driver and proxy them to hotplug
 endef
 
-define Build/Prepare
-	mkdir -p $(PKG_BUILD_DIR)
-	$(CP) ./src/* $(PKG_BUILD_DIR)/
-	$(CP) ./files/* $(PKG_BUILD_DIR)/
-endef
-
 target=$(firstword $(subst -, ,$(BOARD)))
 
 MAKE_FLAGS += TARGET="$(target)"
 TARGET_CFLAGS += -Dtarget_$(target)=1 -Wall
 
-
 define Package/bcmhotproxy/install
 	$(INSTALL_DIR) $(1)/sbin
 	$(INSTALL_DIR) $(1)/etc/
 	$(INSTALL_DIR) $(1)/etc/init.d/
 
-	$(INSTALL_BIN)  $(PKG_BUILD_DIR)/etc/init.d/* $(1)/etc/init.d/
 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/bcmhotproxy $(1)/sbin/
 endef
 
diff --git a/bcmhotproxy/src/Makefile b/bcmhotproxy/src/Makefile
deleted file mode 100644
index e1378c6520560575bbde48cbfaa94a2bf3449828..0000000000000000000000000000000000000000
--- a/bcmhotproxy/src/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-CC = gcc
-CFLAGS += -Wall
-
-obj = bcmhotproxy.o brcmdaemon.o
-
-bcmhotproxy: $(obj) $(obj.$(TARGET))
-clean:
-	rm -f *.o 
diff --git a/bcmhotproxy/src/bcmhotproxy.c b/bcmhotproxy/src/bcmhotproxy.c
deleted file mode 100644
index b09fd37018a39f71aa36125ff5584c945465a7be..0000000000000000000000000000000000000000
--- a/bcmhotproxy/src/bcmhotproxy.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * bcmhotproxy  -- a proxy to send messages from broadcom drivers to userspace
- *
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * Author: Strhuan Blomquist
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-#include "bcmhotproxy.h"
-
-int netlink_init() {
-	int sock_fd;
-	sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_BRCM_MONITOR);
-	if(sock_fd<0)
-	    return -1;
-	return sock_fd;
-}
-int hotplug_call(struct hotplug_arg arg)
-{
-  char str[512];
-  int ret;
-  memset(str, '\0', sizeof(512));
-  syslog(LOG_INFO, "ACTION=%s INTERFACE=%s /sbin/hotplug-call %s", arg.action,arg.inteface,arg.subsystem);
-  sprintf(str, "ACTION=%s INTERFACE=%s /sbin/hotplug-call %s",arg.action,arg.inteface,arg.subsystem);
-  ret=system(str);
-  return ret;
-}
-hotplug_arg createargumetstruct(char *hotplugmsg)
-{ 
-  hotplug_arg arg;
-  char argumets[3][20];
-  char * pch;
-  int x=0;
-  pch = strtok (hotplugmsg," ");
-  while (pch != NULL){
-    strcpy(argumets[x],pch);
-    pch = strtok (NULL, " ");
-    x++;
-  }
-  strncpy(arg.action,argumets[0],sizeof(arg.action));
-  strncpy(arg.inteface,argumets[1],sizeof(arg.action));
-  strncpy(arg.subsystem,argumets[2],sizeof(arg.action));
-  
-  return arg;
-
-}
-
-int netlink_bind(int sock_fd) {
-  
-  struct sockaddr_nl src_addr;
-  memset(&src_addr, 0, sizeof(src_addr));
-  src_addr.nl_family = AF_NETLINK;
-  src_addr.nl_pid = getpid();  /* self pid */
-  src_addr.nl_groups = 1; //multicast Group
-  
-  bind(sock_fd, (struct sockaddr*)&src_addr,sizeof(src_addr));    
-  
-  if (bind(sock_fd, (struct sockaddr*)&src_addr,sizeof(src_addr))) {
-    close(sock_fd);
-    return -1;
-    }
-
-  return sock_fd;
-}
-
-int dispatcher() {
-    struct sockaddr_nl dest_addr;
-    struct nlmsghdr *nlh = NULL;
-    struct iovec iov;
-    struct msghdr msg;
-    hotplug_arg arg;
-    int sock_fd;
-    /* Initlize the netlink socket */
-    sock_fd=netlink_init();
-    if (sock_fd == -1) {
-		fprintf(stderr, "Unable to Intitlize netlink socket.\n");
-		exit(1);
-	}
-     /* Bind the netlink socket */
-    sock_fd=netlink_bind(sock_fd);
-    if (sock_fd == -1) {
-		fprintf(stderr, "Unable to Listen to netlink socket.\n");
-		exit(1);
-	}
-    /* destination address to listen to */
-    nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));
-    memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
-    nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);
-    nlh->nlmsg_pid = getpid();
-    nlh->nlmsg_flags = 0;
-    
-    /* Fill the netlink message header */
-    iov.iov_base = (void *)nlh;
-    iov.iov_len = nlh->nlmsg_len;
-    msg.msg_name = (void *)&dest_addr;
-    msg.msg_namelen = sizeof(dest_addr);
-    msg.msg_iov = &iov;
-    msg.msg_iovlen = 1;
-
-
-    /* Read message from kernel */
-    while(1){
-      recvmsg(sock_fd, &msg, 0);
-      switch (nlh->nlmsg_type)
-      {
-         case MSG_NETLINK_BRCM_WAKEUP_MONITOR_TASK:
-         case MSG_NETLINK_BRCM_LINK_STATUS_CHANGED:
-            /*process the message */
-            fprintf(stderr, "No Handle\n");
-            break;
-	 case MSG_NETLINK_BRCM_LINK_HOTPLUG:
-	    arg=createargumetstruct((char *)NLMSG_DATA(nlh));
-	    if(hotplug_call(arg)){
-	    fprintf(stderr, "Unable to call hotplug.\n");
-	    }
-	    break;  
-         default:
-	    fprintf(stderr, "Unknown type\n");
-            break;
-      }
-      
-    }
-    close(sock_fd);
-    return 0;
-    
-}
diff --git a/bcmhotproxy/src/bcmhotproxy.h b/bcmhotproxy/src/bcmhotproxy.h
deleted file mode 100644
index 6cb2a3ad42ee55b37c8b61f6711dda91512f3da8..0000000000000000000000000000000000000000
--- a/bcmhotproxy/src/bcmhotproxy.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef BCMHOTPROXY_H
-#define BCMHOTPROXY_H 1
-#include <sys/socket.h>
-#include <linux/netlink.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <syslog.h>
-#define MSG_NETLINK_BRCM_WAKEUP_MONITOR_TASK 0X1000
-
-#define MSG_NETLINK_BRCM_LINK_STATUS_CHANGED 0X2000
-
-#define MSG_NETLINK_BRCM_LINK_HOTPLUG 0X3000
-#define MAX_PAYLOAD 1024  /* maximum payload size*/
-#ifndef NETLINK_BRCM_MONITOR
-#define NETLINK_BRCM_MONITOR 25
-#endif
-typedef struct hotplug_arg hotplug_arg;
-
-struct hotplug_arg
-{
-	char action[20];
-	char inteface[20];
-	char subsystem[20];
-  
-}; 
-#endif
diff --git a/bcmhotproxy/src/brcmdaemon.c b/bcmhotproxy/src/brcmdaemon.c
deleted file mode 100644
index a104ef6c485b9c8f4c9caf2bac54ccf5331dbf1d..0000000000000000000000000000000000000000
--- a/bcmhotproxy/src/brcmdaemon.c
+++ /dev/null
@@ -1,153 +0,0 @@
-#include "brcmdaemon.h"
- 
-/**************************************************************************
-    Function: Print Usage
- 
-    Description:
-        Output the command-line options for this daemon.
- 
-    Params:
-        @argc - Standard argument count
-        @argv - Standard argument array
- 
-    Returns:
-        returns void always
-**************************************************************************/
-void PrintUsage(int argc, char *argv[]) {
-    if (argc >=1) {
-        printf("Usage: %s -h -n\n", argv[0]);
-        printf("  Options: \n");
-        printf("      -ntDon't fork off as a daemon.\n");
-        printf("      -htShow this help screen.\n");
-        printf("\n");
-    }
-}
- 
-/**************************************************************************
-    Function: signal_handler
- 
-    Description:
-        This function handles select signals that the daemon may
-        receive.  This gives the daemon a chance to properly shut
-        down in emergency situations.  This function is installed
-        as a signal handler in the 'main()' function.
- 
-    Params:
-        @sig - The signal received
- 
-    Returns:
-        returns void always
-**************************************************************************/
-void signal_handler(int sig) {
- 
-    switch(sig) {
-        case SIGHUP:
-            syslog(LOG_WARNING, "Received SIGHUP signal.");
-            break;
-        case SIGTERM:
-            syslog(LOG_WARNING, "Received SIGTERM signal.");
-            break;
-        default:
-            syslog(LOG_WARNING, "Unhandled signal (%d) %s", strsignal(sig));
-            break;
-    }
-}
- 
-/**************************************************************************
-    Function: main
- 
-    Description:
-        The c standard 'main' entry point function.
- 
-    Params:
-        @argc - count of command line arguments given on command line
-        @argv - array of arguments given on command line
- 
-    Returns:
-        returns integer which is passed back to the parent process
-**************************************************************************/
-int main(int argc, char *argv[]) {
- 
-#if defined(DEBUG)
-    int daemonize = 0;
-#else
-    int daemonize = 0;
-#endif
- 
-    // Setup signal handling before we start
-    signal(SIGHUP, signal_handler);
-    signal(SIGTERM, signal_handler);
-    signal(SIGINT, signal_handler);
-    signal(SIGQUIT, signal_handler);
- 
-    int c;
-    while( (c = getopt(argc, argv, "nh|help")) != -1) {
-        switch(c){
-            case 'h':
-                PrintUsage(argc, argv);
-                exit(0);
-                break;
-            case 'n':
-                daemonize = 0;
-                break;
-            default:
-                PrintUsage(argc, argv);
-                exit(0);
-                break;
-        }
-    }
- 
-    syslog(LOG_INFO, "%s daemon starting up", DAEMON_NAME);
- 
-    // Setup syslog logging - see SETLOGMASK(3)
-#if defined(DEBUG)
-    setlogmask(LOG_UPTO(LOG_DEBUG));
-    openlog(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
-#else
-    setlogmask(LOG_UPTO(LOG_INFO));
-    openlog(DAEMON_NAME, LOG_CONS, LOG_USER);
-#endif
- 
-    /* Our process ID and Session ID */
-    pid_t pid, sid;
- 
-    if (daemonize) {
-        syslog(LOG_INFO, "starting the daemonizing process");
- 
-        /* Fork off the parent process */
-        pid = fork();
-        if (pid < 0) {
-            exit(EXIT_FAILURE);
-        }
-        /* If we got a good PID, then
-           we can exit the parent process. */
-        if (pid > 0) {
-            exit(EXIT_SUCCESS);
-        }
- 
-        /* Change the file mode mask */
-        umask(0);
- 
-        /* Create a new SID for the child process */
-        sid = setsid();
-        if (sid < 0) {
-            /* Log the failure */
-            exit(EXIT_FAILURE);
-        }
- 
-        /* Change the current working directory */
-        if ((chdir("/")) < 0) {
-            /* Log the failure */
-            exit(EXIT_FAILURE);
-        }
- 
-        /* Close out the standard file descriptors */
-        close(STDIN_FILENO);
-        close(STDOUT_FILENO);
-        close(STDERR_FILENO);
-    }
- 
-    dispatcher(); 
-    syslog(LOG_INFO, "%s daemon exiting", DAEMON_NAME);
-    exit(0);
-}
diff --git a/bcmhotproxy/src/brcmdaemon.h b/bcmhotproxy/src/brcmdaemon.h
deleted file mode 100644
index eaed43108888019d13baf25f6ebe27dcf09996b1..0000000000000000000000000000000000000000
--- a/bcmhotproxy/src/brcmdaemon.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef BRCMDAEMON_H
-#define BRCMDAEMON_H 1
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <string.h>
-#include <assert.h>
-#include <signal.h>
- 
-#define DAEMON_NAME "brcmnetlink"
-#define PID_FILE "/var/run/brcmnetlink.pid"
-#endif
\ No newline at end of file
diff --git a/broadcom-nvram/Makefile b/broadcom-nvram/Makefile
index c4b24af559e479c780f725011bf701b98947638d..98b172ed01f4998819cc87986185e1bb7cd36726 100644
--- a/broadcom-nvram/Makefile
+++ b/broadcom-nvram/Makefile
@@ -9,35 +9,42 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=broadcom-nvram
+PKG_VERSION:=1.0.0
 PKG_RELEASE:=1
 
-PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
-STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
+PKG_SOURCE_VERSION:=8b6018d9ce5e292f0a4a3e86f8fa7d8bc003c3fb
+PKG_SOURCE_PROTO:=git
+ifeq ($(CONFIG_BCM_OPEN),y)
+PKG_SOURCE_URL:=http://public.inteno.se/broadcom-nvram
+else
+PKG_SOURCE_URL:=git@public.inteno.se:broadcom-nvram
+endif
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
+STAMP_PREPARED:=$(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)
 
 include $(INCLUDE_DIR)/package.mk
 
 LDFLAGS+= \
-        -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
-		-Wl,-rpath-link=$(STAGING_DIR)/lib
+	-Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
+	-Wl,-rpath-link=$(STAGING_DIR)/lib
 
 RSTRIP:=true
 
 define Package/bcmnvram
-  CATEGORY:=Libraries
-  TITLE:=Broadcom nvram emulator library
-  URL:=
-  DEPENDS:=PACKAGE_libuci:libuci
+	CATEGORY:=Libraries
+	TITLE:=Broadcom nvram emulator library
+	URL:=
+	DEPENDS:=PACKAGE_libuci:libuci
 endef
 
 define Package/bcmnvram/description
 	Broadcom nvram to uci wrapper
 endef
 
-define Build/Prepare
-	mkdir -p $(PKG_BUILD_DIR)
-	$(CP) ./src/* $(PKG_BUILD_DIR)/
-endef
-
 target=$(firstword $(subst -, ,$(BOARD)))
 
 MAKE_FLAGS += TARGET="$(target)"
diff --git a/broadcom-nvram/src/Makefile b/broadcom-nvram/src/Makefile
deleted file mode 100644
index c16fbacf71f1d625a43a4c295f300e8e5d25dc2c..0000000000000000000000000000000000000000
--- a/broadcom-nvram/src/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-# Makefile for broadcom nvram to uci wrapper
-
-
-%.o: %.c
-	$(CC) -c $(CFLAGS) -o $@ $<
-
-OBJS = nvram_emu_lib.o ucix.o main.o
-
-all:  libnvram main
-
-dynamic: all
-
-libnvram: nvram_emu_lib.o
-	$(CC) -c $(CFLAGS) $(LDFLAGS) -fPIC -o ucix_shared.o ucix.c -luci
-	$(CC) -c $(CFLAGS) $(LDFLAGS) -fPIC -o nvram_emu_lib.o nvram_emu_lib.c -luci
-	$(CC) $(LDFLAGS) -shared -Wl,-soname,libnvram.so -o libnvram.so   nvram_emu_lib.o ucix_shared.o -luci
-
-main: main.o ucix.o
-	$(CC) $(LDFLAGS) -o uci_test main.o ucix.o -luci
-
-clean:
-	rm -f libnvram.so ucix_shared.o uci_test ${OBJS}
-
diff --git a/broadcom-nvram/src/main.c b/broadcom-nvram/src/main.c
deleted file mode 100644
index a252315ef44ff9a1973c0ebc6129ec76989d6d83..0000000000000000000000000000000000000000
--- a/broadcom-nvram/src/main.c
+++ /dev/null
@@ -1,30 +0,0 @@
-// uci test program Copyright Benjamin Larsson 2012 <benjamin@southpole.se>
-
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <uci.h>
-#include "ucix.h"
-
-
-int main(int argc, char **argv)
-{
-	struct uci_context *ctx;
-	const char *ucitmp;
-	
-	ctx = ucix_init("broadcom");
-	if(!ctx)
-		printf("Failed to load config file");
-	
-	ucitmp = ucix_get_option(ctx, "broadcom", "nvram", "test");
-	printf("test = %s\n",ucitmp);
-	ucix_add_section(ctx, "broadcom", "nvram", "broadcom");
-	ucix_add_option(ctx, "broadcom", "nvram", "test", "tomte");
-	ucix_add_option(ctx, "broadcom", "nvram", "test2", "tomte2");
-	printf("Hello world\n");
-	ucix_commit(ctx, "broadcom");
-	ucitmp = ucix_get_option(ctx, "broadcom", "nvram", "test");
-	printf("test = %s\n",ucitmp);
-	ucix_cleanup(ctx);
-}
\ No newline at end of file
diff --git a/broadcom-nvram/src/nvram_emu_lib.c b/broadcom-nvram/src/nvram_emu_lib.c
deleted file mode 100644
index a1b11a5643000738ed9ffa59bd312f59d152eba4..0000000000000000000000000000000000000000
--- a/broadcom-nvram/src/nvram_emu_lib.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/**  Broadcom libnvram.so compatible wrapper
- *
- * Copyright 2012 Benjamin Larsson <benjamin@southpole.se>
- *
- */
-
-/*
-
-Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,
-provided that the above copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
-AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-OF THIS SOFTWARE.
-
-*/
-
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "uci.h"
-
-
-struct uci_context *ctx = NULL;
-struct uci_ptr ptr;
-int nvram_inited = 0;
-int nvram_debug = 0;
-
-/** Function prototypes are taken from bcmnvram.h Copyright Broadcom Corporation.
- *  Only some of the nvram_* functions exposed from libnvram.so are implemented.
- *  get, getall, unset, set, commit
- */
-
-
-/* uci does not support . in the key part, replace it with _ */
-
-static const char * filter_dots_in_string(char *key) {
-	int length = 0;
-	int i;
-	length = strlen(key);
-	for (i=0 ; i<length ; i++) {
-		if (key[i] == '.')
-			key[i] = '_';
-	}
-	return key;
-}
-
-static void nvram_display_section(struct uci_section *s)
-{
-	struct uci_element *e;
-	struct uci_option *o;
-
-	printf("%s.%s=%s\n", s->package->e.name, s->e.name, s->type);
-	uci_foreach_element(&s->options, e) {
-		o = uci_to_option(e);
-		printf("%s.%s.%s=%s\n", o->section->package->e.name, o->section->e.name, o->e.name, o->v.string);
-	}
-}
-
-void nvram_init() {
-	if (!nvram_inited) {
-		ctx = ucix_init("broadcom");
-		if(!ctx) {
-			printf("Failed to load config file \"broadcom\"\n");
-			return;
-		}
-		ucix_add_section(ctx, "broadcom", "nvram", "broadcom");
-		ucix_add_option(ctx, "broadcom", "nvram", "init", "1");
-		ucix_commit(ctx, "broadcom");
-		nvram_debug = ucix_get_option_int(ctx, "broadcom", "nvram", "debug");
-		nvram_inited = 1;
-		if (nvram_debug)
-			printf("nvram_init()\n");
-	}
-}
-
-
-/*
- * Get the value of an NVRAM variable. The pointer returned may be
- * invalid after a set.
- * @param	name	name of variable to get
- * @return	value of variable or NULL if undefined
- */
-const char * nvram_get(const char *name) {
-	const char *ucitmp;
-	nvram_init();
-	ucitmp = ucix_get_option(ctx, "broadcom", "nvram", filter_dots_in_string(name));
-	if (nvram_debug)
-		printf("%s=nvram_get(%s)\n", ucitmp, name);
-
-	return ucitmp;
-}
-
-
-/*
- * Set the value of an NVRAM variable. The name and value strings are
- * copied into private storage. Pointers to previously set values
- * may become invalid. The new value may be immediately
- * retrieved but will not be permanently stored until a commit.
- * @param	name	name of variable to set
- * @param	value	value of variable
- * @return	0 on success and errno on failure
- */
-int nvram_set(const char *name, const char *value) {
-	nvram_init();
-	ucix_add_option(ctx, "broadcom", "nvram", filter_dots_in_string(name), value);
-	ucix_commit(ctx, "broadcom");
-	if (nvram_debug)
-		printf("nvram_set(%s, %s)\n", filter_dots_in_string(name), value);
-	return 0;
-}
-
-
-/*
- * Unset an NVRAM variable. Pointers to previously set values
- * remain valid until a set.
- * @param	name	name of variable to unset
- * @return	0 on success and errno on failure
- * NOTE: use nvram_commit to commit this change to flash.
- */
-int nvram_unset(const char *name){
-	nvram_init();
-	ucix_del(ctx, "broadcom", "nvram", filter_dots_in_string(name));
-	ucix_commit(ctx, "broadcom");
-	if (nvram_debug)
-		printf("nvram_unset(%s)\n", filter_dots_in_string(name));
-	return 0;
-}
-
-
-/*
- * Commit NVRAM variables to permanent storage. All pointers to values
- * may be invalid after a commit.
- * NVRAM values are undefined after a commit.
- * @return	0 on success and errno on failure
- */
-int nvram_commit(void){
-	nvram_init();
-	ucix_commit(ctx, "broadcom");
-	if (nvram_debug)
-		printf("nvram_commit()\n");
-
-	return 0;
-}
-
-
-/*
- * Get all NVRAM variables (format name=value\0 ... \0\0).
- * @param	buf	buffer to store variables
- * @param	count	size of buffer in bytes
- * @return	0 on success and errno on failure
- */
-int nvram_getall(char *nvram_buf, int count) {
-	nvram_init();
-
-	ptr.package = "broadcom";
-	ptr.section = "nvram";
-
-	if (uci_lookup_ptr(ctx, &ptr, NULL, true) != UCI_OK)
-		return 1;
-
-	if (!(ptr.flags & UCI_LOOKUP_COMPLETE))
-		return 1;
-
-	nvram_display_section(ptr.s);
-
-	return 0;
-}
-
diff --git a/broadcom-nvram/src/ucix.c b/broadcom-nvram/src/ucix.c
deleted file mode 100644
index d702429fb99ff88ee1768e45ab8b0d49a082b32a..0000000000000000000000000000000000000000
--- a/broadcom-nvram/src/ucix.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- *
- *   Copyright (C) 2008 John Crispin <blogic@openwrt.org> 
- */
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <uci_config.h>
-#include <uci.h>
-#include "ucix.h"
-
-static struct uci_ptr ptr;
-
-static inline int ucix_get_ptr(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t)
-{
-	memset(&ptr, 0, sizeof(ptr));
-	ptr.package = p;
-	ptr.section = s;
-	ptr.option = o;
-	ptr.value = t;
-	return uci_lookup_ptr(ctx, &ptr, NULL, true);
-}
-
-struct uci_context* ucix_init(const char *config_file)
-{
-	struct uci_context *ctx = uci_alloc_context();
-	uci_add_delta_path(ctx, "/var/state");
-	if(uci_load(ctx, config_file, NULL) != UCI_OK)
-	{
-		printf("%s/%s is missing or corrupt\n", ctx->savedir, config_file);
-		return NULL;
-	}
-	return ctx;
-}
-
-struct uci_context* ucix_init_path(const char *path, const char *config_file)
-{
-	struct uci_context *ctx = uci_alloc_context();
-	if(path)
-		uci_set_confdir(ctx, path);
-	if(uci_load(ctx, config_file, NULL) != UCI_OK)
-	{
-		printf("%s/%s is missing or corrupt\n", ctx->savedir, config_file);
-		return NULL;
-	}
-	return ctx;
-}
-
-void ucix_cleanup(struct uci_context *ctx)
-{
-	uci_free_context(ctx);
-}
-
-void ucix_save(struct uci_context *ctx)
-{
-	uci_set_savedir(ctx, "/tmp/.uci/");
-	uci_save(ctx, NULL);
-}
-
-void ucix_save_state(struct uci_context *ctx)
-{
-	uci_set_savedir(ctx, "/var/state/");
-	uci_save(ctx, NULL);
-}
-
-const char* ucix_get_option(struct uci_context *ctx, const char *p, const char *s, const char *o)
-{
-	struct uci_element *e = NULL;
-	const char *value = NULL;
-	if(ucix_get_ptr(ctx, p, s, o, NULL))
-		return NULL;
-	if (!(ptr.flags & UCI_LOOKUP_COMPLETE))
-		return NULL;
-	e = ptr.last;
-	switch (e->type)
-	{
-	case UCI_TYPE_SECTION:
-		value = uci_to_section(e)->type;
-		break;
-	case UCI_TYPE_OPTION:
-		switch(ptr.o->type) {
-			case UCI_TYPE_STRING:
-				value = ptr.o->v.string;
-				break;
-			default:
-				value = NULL;
-				break;
-		}
-		break;
-	default:
-		return 0;
-	}
-
-	return value;
-}
-
-int ucix_get_option_int(struct uci_context *ctx, const char *p, const char *s, const char *o, int def)
-{
-	const char *tmp = ucix_get_option(ctx, p, s, o);
-	int ret = def;
-
-	if (tmp)
-		ret = atoi(tmp);
-	return ret;
-}
-
-void ucix_add_section(struct uci_context *ctx, const char *p, const char *s, const char *t)
-{
-	if(ucix_get_ptr(ctx, p, s, NULL, t))
-		return;
-	uci_set(ctx, &ptr);
-}
-
-void ucix_add_option(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t)
-{
-	if(ucix_get_ptr(ctx, p, s, o, (t)?(t):("")))
-		return;
-	uci_set(ctx, &ptr);
-}
-
-void ucix_add_option_int(struct uci_context *ctx, const char *p, const char *s, const char *o, int t)
-{
-	char tmp[64];
-	snprintf(tmp, 64, "%d", t);
-	ucix_add_option(ctx, p, s, o, tmp);
-}
-
-void ucix_del(struct uci_context *ctx, const char *p, const char *s, const char *o)
-{
-	if(!ucix_get_ptr(ctx, p, s, o, NULL))
-		uci_delete(ctx, &ptr);
-}
-
-void ucix_revert(struct uci_context *ctx, const char *p, const char *s, const char *o)
-{
-	if(!ucix_get_ptr(ctx, p, s, o, NULL))
-		uci_revert(ctx, &ptr);
-}
-
-void ucix_for_each_section_type(struct uci_context *ctx,
-	const char *p, const char *t,
-	void (*cb)(const char*, void*), void *priv)
-{
-	struct uci_element *e;
-	if(ucix_get_ptr(ctx, p, NULL, NULL, NULL))
-		return;
-	uci_foreach_element(&ptr.p->sections, e)
-		if (!strcmp(t, uci_to_section(e)->type))
-			cb(e->name, priv);
-}
-
-int ucix_commit(struct uci_context *ctx, const char *p)
-{
-	if(ucix_get_ptr(ctx, p, NULL, NULL, NULL))
-		return 1;
-	return uci_commit(ctx, &ptr.p, false);
-}
-
diff --git a/broadcom-nvram/src/ucix.h b/broadcom-nvram/src/ucix.h
deleted file mode 100644
index ea9af20020775713cb38f3dbece3634b96794c2b..0000000000000000000000000000000000000000
--- a/broadcom-nvram/src/ucix.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- *
- *   Copyright (C) 2008 John Crispin <blogic@openwrt.org> 
- */
-
-#ifndef _UCI_H__
-#define _UCI_H__
-struct uci_context* ucix_init(const char *config_file);
-struct uci_context* ucix_init_path(const char *path, const char *config_file);
-void ucix_cleanup(struct uci_context *ctx);
-void ucix_save(struct uci_context *ctx);
-void ucix_save_state(struct uci_context *ctx);
-const char* ucix_get_option(struct uci_context *ctx,
-	const char *p, const char *s, const char *o);
-int ucix_get_option_int(struct uci_context *ctx,
-	const char *p, const char *s, const char *o, int def);
-void ucix_add_section(struct uci_context *ctx,
-	const char *p, const char *s, const char *t);
-void ucix_add_option(struct uci_context *ctx,
-	const char *p, const char *s, const char *o, const char *t);
-void ucix_add_option_int(struct uci_context *ctx,
-	const char *p, const char *s, const char *o, int t);
-int ucix_commit(struct uci_context *ctx, const char *p);
-void ucix_revert(struct uci_context *ctx,
-	const char *p, const char *s, const char *o);
-void ucix_del(struct uci_context *ctx, const char *p,
-	const char *s, const char *o);
-#endif
diff --git a/peripheral_manager/Makefile b/peripheral_manager/Makefile
index ffaf522e8e99591088717562915f43bd9494f11d..40df63749797e3af5007500558bf7f6923226ade 100644
--- a/peripheral_manager/Makefile
+++ b/peripheral_manager/Makefile
@@ -9,8 +9,21 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=peripheral_manager
+PKG_VERSION:=1.0.0
 PKG_RELEASE:=1
 
+PKG_SOURCE_VERSION:=33e6a0266eb3459de56b31858e4eb797623cfd5c
+PKG_SOURCE_PROTO:=git
+ifeq ($(CONFIG_BCM_OPEN),y)
+PKG_SOURCE_URL:=http://public.inteno.se/peripheral_manager
+else
+PKG_SOURCE_URL:=git@public.inteno.se:peripheral_manager
+endif
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
 # support parallel build
 PKG_BUILD_PARALLEL:=1
 
@@ -24,10 +37,10 @@ PKG_INSTALL:=1
 include $(INCLUDE_DIR)/package.mk
 
 define Package/peripheral_manager
-  CATEGORY:=Utilities
-  TITLE:=Application deamon for handling of peripheral
-  URL:=
-  DEPENDS:=+libuci +libubus +libblobmsg-json +bcmkernel
+	CATEGORY:=Utilities
+	TITLE:=Application deamon for handling of peripheral
+	URL:=
+	DEPENDS:=+libuci +libubus +libblobmsg-json bcmkernel
 endef
 
 define Package/peripheral_manager/description
@@ -36,26 +49,16 @@ endef
 
 TARGET_CPPFLAGS := \
 	-I$(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx \
-        -I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
-        $(TARGET_CPPFLAGS)
-
-# In future get the git. unpack it in src.
-define Build/Prepare
-	mkdir -p $(PKG_BUILD_DIR)
-	$(CP) ./src/* $(PKG_BUILD_DIR)/
-	$(CP) ./files/* $(PKG_BUILD_DIR)/
-endef
+	-I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
+	$(TARGET_CPPFLAGS)
 
 define Package/peripheral_manager/install
-
 	$(INSTALL_DIR) $(1)/etc/
 	$(INSTALL_DIR) $(1)/etc/init.d/
 
 	$(INSTALL_DIR) $(1)/sbin
 	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/peripheral_manager $(1)/sbin/
 	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gpio_test $(1)/sbin/
-
-	$(INSTALL_BIN)  $(PKG_BUILD_DIR)/etc/init.d/* $(1)/etc/init.d/
 endef
 
 $(eval $(call BuildPackage,peripheral_manager))
diff --git a/peripheral_manager/src/Makefile.am b/peripheral_manager/src/Makefile.am
deleted file mode 100644
index 3e76e9a56cd8015042c8f4fa78460c6c56d85442..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/Makefile.am
+++ /dev/null
@@ -1,73 +0,0 @@
-#PRG_VERSION := $(shell cd @top_srcdir@; if ! git describe --tags ;then echo version-$(PACKAGE_VERSION) ;fi )
-
-AM_CFLAGS = $(OUR_CFLAGS)
-
-bin_PROGRAMS = peripheral_manager
-dist_data_DATA = configs/hw
-
-peripheral_manager_SOURCES = \
-	src/peripheral_manager.c \
-	src/ucix.c \
-	src/ucix.h \
-	src/server.c \
-	src/server.h \
-	src/led.c \
-	src/led.h \
-	src/sim_led.c \
-	src/button.h \
-	src/button.c \
-	src/sim_button.c \
-	src/catv.c \
-	src/catv_monitor.c \
-	src/catv.h \
-	src/smbus.c \
-	src/smbus.h \
-	src/i2c.c \
-	src/i2c.h \
-	src/sfp.c \
-	src/sfp.h
-
-if BRCM_BOARD
-
-bin_PROGRAMS += vox_test gpio_test
-
-peripheral_manager_SOURCES += \
-	src/gpio_led.c \
-	src/gpio_led.h \
-	src/gpio_button.c \
-	src/gpio_button.h \
-	src/gpio.c \
-	src/gpio.h \
-	src/gpio_shift_register.c \
-	src/gpio_shift_register.h \
-	src/touch_sx9512.c \
-	src/touch_sx9512.h \
-	src/sx9512.c \
-	src/sx9512.h \
-	src/vox.h \
-	src/vox.c \
-	src/prox_px3220.c
-
-vox_test_SOURCES = \
-	src/vox_test.c \
-	src/gpio.c \
-	src/gpio.h
-
-gpio_test_SOURCES = \
-	src/gpio_test.c \
-	src/gpio.c \
-	src/gpio.h \
-	src/gpio_shift_register.c \
-	src/gpio_shift_register.h \
-	src/smbus.c \
-	src/smbus.h \
-	src/i2c.c \
-	src/i2c.h \
-	src/sx9512.c \
-	src/sx9512.h
-
-endif
-
-peripheral_manager_LDADD = $(UCI_LIB) $(UBOX_LIB) $(UBUS_LIB) -lm
-
-peripheral_manager_CFLAGS =  $(AM_CFLAGS) -DPRG_VERSION=\"$(PRG_VERSION)\" 
diff --git a/peripheral_manager/src/configs/hw b/peripheral_manager/src/configs/hw
deleted file mode 100644
index 7066c326ff1cd4d9f78c93fb6361c939de55c3b4..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/configs/hw
+++ /dev/null
@@ -1,247 +0,0 @@
-# test config for peripheral_manager
-# only contain options that peripheral_manager needs and that can be used
-# when compiling to host (not target hardware)
-
-config board 'board'
-	option hardware 'CG300'
-
-#	for CATV parsing we need this hardware
-#	option hardware 'EG300'	
-
-###############################################################################
-#
-# example for low level button.
-#
-#
-
-config sim_button sim_buttons
-       list buttons sim_button_A
-       list buttons sim_button_B
-       list buttons sim_button_c
-       list buttons sim_button_d
-       list buttons sim_button_e
-
-config sim_button sim_button_A
-       option addr 10
-       option active hi
-
-config sim_button sim_button_B
-       option addr 11
-       option active low
-
-config sim_button sim_button_c
-       option addr 12
-       option active hi
-
-config sim_button sim_button_d
-       option addr 13
-       option active hi
-
-config sim_button sim_button_e
-       option addr 14
-       option active hi
-
-###############################################################################
-#
-# example for mapping system button to driver button.
-# 
-# mapping serveral "functions" buttons to one physical can be done with the long press option
-# if 
-#
-# this is a list of all button names. perifmanger will read this list then read out the specific button config
-
-config button_map button_map
-	list buttonnames RESET
-	list buttonnames Wireless
-	list buttonnames WPS
-	list buttonnames DECTS
-	list buttonnames DECTL
-	list buttonnames TOUCH_NEAR
-	list buttonnames TOUCH_FAR
-	option minpress 100	# default minimum time a button nedes to be pressed. 
-
-config button_map RESET
-#       list button gpio_reset
-       list button sim_button_A # driver that is used for this button
-       option minpress 5000	# don't allow button unless pressed for 5 seconds.
-       option hotplug resetbutton
-
-config button_map Wireless
-       list button sim_button_B # driver that is used for this button
-       list button sim_button_c # we support user having to press two at the same time to register a button event.
-       option minpress 1000
-       option hotplug ecobutton
-
-# long press example one or the other of touch_near or touch_far will trigger not booth.
-
-config button_map TOUCH_NEAR
-       list button gpio_reset
-#       list button sim_button_d # driver that is used for this button
-       option hotplug touch_near
-
-config button_map TOUCH_FAR
-       list button sim_button_d # driver that is used for this button
-       option longpress	3000    # this button has a long press option. 
-       option hotplug touch_far
-
-
-
-###############################################################################
-#
-# example for low level led driver.
-# here we list what the led can do and any info the driver needs to know to controll the led.
-#
-# would proably be smarter to name the leds as the color and not just A B C.
-# but this is an example to show there is no connection with the name and what it
-# does. 
-#
-config sim_led sim_leds
-        list leds sim_led_A
-	list leds sim_led_B
-	list leds sim_led_C
-
-config sim_led sim_led_A
-       option addr     1
-       option color    green
-       option breading no
-
-config sim_led sim_led_B
-       option addr	7
-       option color	red
-       option breading	no
-
-config sim_led sim_led_C
-       option addr	3
-       option color	blue
-       option breading	yes
-       option fadein    yes
-       option fadeout   yes
-
-###############################################################################
-#
-#   gpio leds
-#
-config gpio_led gpio_leds
-        list leds Status_green
-	list leds Status_red
-	list leds Wireless_green
-	list leds Wireless_blue
-	list leds WAN_green
-	list leds WAN_yellow
-
-config gpio_led Status_green
-       option addr     39
-       option active   low
-       option mode     direct
-
-config gpio_led Status_red
-       option addr     38
-       option active   low
-       option mode     direct
-
-config gpio_led Wireless_green
-       option addr     37
-       option active   low
-       option mode     direct
-
-config gpio_led Wireless_blue
-       option addr     36
-       option active   low
-       option mode     direct
-
-config gpio_led WAN_green
-       option addr     9
-       option active   low
-       option mode     direct
-
-config gpio_led WAN_yellow
-       option addr     10
-       option active   low
-       option mode     direct
-
-###############################################################################
-#
-#   gpio buttons
-#
-
-config gpio_button gpio_buttons
-       list buttons gpio_reset
-
-config gpio_button gpio_reset
-       option addr 32
-       option active low
-#       option feedback
-
-
-###############################################################################
-#
-# example mapping sim leds to system leds. 
-#
-# the led_action list can be from one entry and up.
-# 
-# led_action, list of leds to set. 
-# button_action. list of button events to send out 
-# effect_action, list of special effects to activate. (dim display.....)
-# 
-
-config led_map led_map
-       list functions status
-       list functions wifi
-       list functions wps
-
-config led_map led_status
-       list led_action_ok       'sim_led_A = ON'    
-       list led_action_ok       'sim_led_B = OFF'
-       list led_action_off      'sim_led_A = OFF'
-       list led_action_off      'sim_led_B = OFF'
-       list led_action_notice   'sim_led_A = FLASH_SLOW'
-       list led_action_notice   'sim_led_B = OFF'
-       list led_action_alert    'sim_led_A = OFF'
-       list led_action_alert    'sim_led_B = FLASH_SLOW'
-       list led_action_error    'sim_led_A = OFF'
-       list led_action_error    'sim_led_B = FLASH_FAST'
-
-config led_map led_wps
-#       list led_action_ok       'WPS_green=ON'
-#       list led_action_off      'WPS_green=OFF'
-#       list led_action_notice   'WPS_green=FLASH_SLOW'
-#       list led_action_alert    'WPS_green=FLASH_FAST'
-#       list led_action_error    'WPS_green=OFF'  
-
-config led_map led_wifi
-#       list led_action_ok     'Wireless_green = ON'
-#       list led_action_ok     'Wireless_blue  = OFF'
-#       list led_action_eok    'Wireless_green = OFF'
-#       list led_action_eok    'Wireless_blue  = ON'
-#       list led_action_off    'Wireless_green = OFF'
-#       list led_action_off    'Wireless_blue  = OFF'
-#       list led_action_notice 'Wireless_green = FLASH_SLOW'
-#       list led_action_notice 'Wireless_blue  = OFF'
-#       list led_action_alert  'Wireless_green = OFF'
-#       list led_action_alert  'Wireless_blue  = FLASH_SLOW'
-#       list led_action_error  'Wireless_green = OFF'
-#       list led_action_error  'Wireless_blue  = FLASH_FAST'
-
-###############################################################################
-#
-# function superfunctions
-# 
-# Used when one led is controlled by seferal different functions
-# here we map in what state the underlying normal functions should have
-# to set a state, and what action to take in that state.
-
-
-# list available super functions.
-config led_map led_map
-       list functions super_a
-
-config led_map led_super_a
-       list led_action_ok	sim_led_C=ON
-       list super_ok		'wifi_ok, wps_ok'
-
-       list led_action_off      sim_led_C=OFF
-       list super_off		'wifi_off, wps_off'
-
-       list led_action_notice	 sim_led_C=FLASH_SLOW
-       list super_notice	 'wifi_notice'
-       list super_notice  	 'wps_notice'
diff --git a/peripheral_manager/src/configure.ac b/peripheral_manager/src/configure.ac
deleted file mode 100644
index 67bace2a019db4c2ee344f0446e576ecc17588c9..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/configure.ac
+++ /dev/null
@@ -1,78 +0,0 @@
-dnl init stuff needs to be first in file
-AC_INIT([peripheral_manager], [0.1], [Kenneth Johansson <kenneth@southpole.se>])
-AC_CONFIG_MACRO_DIR([m4])
-AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
-AM_SILENT_RULES([yes])
-
-AC_PROG_CC
-AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_FILES([Makefile])
-
-CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
-        -std=gnu11 \
-	-pipe \
-        -Wall \
-        -Wextra \
-        -Wno-inline \
-        -Wundef \
-        "-Wformat=2 -Wformat-security -Wformat-nonliteral" \
-        -Wlogical-op \
-        -Wsign-compare \
-        -Wmissing-include-dirs \
-        -Wold-style-definition \
-        -Wpointer-arith \
-        -Winit-self \
-        -Wdeclaration-after-statement \
-        -Wfloat-equal \
-        -Wsuggest-attribute=noreturn \
-        -Wmissing-prototypes \
-        -Wstrict-prototypes \
-        -Wredundant-decls \
-        -Wmissing-declarations \
-        -Wmissing-noreturn \
-        -Wshadow \
-        -Wendif-labels \
-        -Wstrict-aliasing=2 \
-        -Wwrite-strings \
-        -Wno-long-long \
-        -Wno-overlength-strings \
-        -Wno-unused-parameter \
-        -Wno-missing-field-initializers \
-        -Wno-unused-result \
-        -Werror=overflow \
-        -Wdate-time \
-        -Wnested-externs \
-        -ffast-math \
-        -fno-common \
-        -fdiagnostics-show-option \
-        -fno-strict-aliasing \
-        -fvisibility=hidden \
-        -ffunction-sections \
-        -fdata-sections \
-        -fstack-protector \
-        -fstack-protector-strong \
-        -fPIE \
-        --param=ssp-buffer-size=4])
-
-AC_SUBST([OUR_CFLAGS], "$with_cflags")
-
-dnl check for uci , its manadatory
-AC_SEARCH_LIBS([uci_load], [uci], [], [AC_MSG_ERROR([*** UCI library not found])])
-
-dnl check ubox , its manadatory
-AC_SEARCH_LIBS([uloop_init], [ubox], [], [AC_MSG_ERROR([*** UBOX library not found])])
-
-dnl chek ubus  , its manadatory
-AC_SEARCH_LIBS([ubus_connect], [ubus], [], [AC_MSG_ERROR([*** UBUS library not found])])
-
-dnl check for board.h file 
-AC_CHECK_HEADERS(board.h, AM_CONDITIONAL(BRCM_BOARD, true), AM_CONDITIONAL(BRCM_BOARD, false))
-
-AC_OUTPUT
-
-AC_MSG_RESULT([
-        $PACKAGE_NAME $VERSION
-        CFLAGS:                  ${OUR_CFLAGS} ${CFLAGS}
-        CPPFLAGS:                ${OUR_CPPFLAGS} ${CPPFLAGS}
-        LDFLAGS:                 ${OUR_LDFLAGS} ${LDFLAGS}
-])
diff --git a/peripheral_manager/src/m4/attributes.m4 b/peripheral_manager/src/m4/attributes.m4
deleted file mode 100644
index ac3c6624cde45ff8ecacd6a093390bc70570a6ee..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/m4/attributes.m4
+++ /dev/null
@@ -1,288 +0,0 @@
-dnl Macros to check the presence of generic (non-typed) symbols.
-dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
-dnl Copyright (c) 2006-2008 xine project
-dnl Copyright (c) 2012 Lucas De Marchi <lucas.de.marchi@gmail.com>
-dnl
-dnl This program is free software; you can redistribute it and/or modify
-dnl it under the terms of the GNU General Public License as published by
-dnl the Free Software Foundation; either version 2, or (at your option)
-dnl any later version.
-dnl
-dnl This program is distributed in the hope that it will be useful,
-dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
-dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-dnl GNU General Public License for more details.
-dnl
-dnl You should have received a copy of the GNU General Public License
-dnl along with this program; if not, write to the Free Software
-dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-dnl 02110-1301, USA.
-dnl
-dnl As a special exception, the copyright owners of the
-dnl macro gives unlimited permission to copy, distribute and modify the
-dnl configure scripts that are the output of Autoconf when processing the
-dnl Macro. You need not follow the terms of the GNU General Public
-dnl License when using or distributing such scripts, even though portions
-dnl of the text of the Macro appear in them. The GNU General Public
-dnl License (GPL) does govern all other use of the material that
-dnl constitutes the Autoconf Macro.
-dnl
-dnl This special exception to the GPL applies to versions of the
-dnl Autoconf Macro released by this project. When you make and
-dnl distribute a modified version of the Autoconf Macro, you may extend
-dnl this special exception to the GPL to apply to your modified version as
-dnl well.
-
-dnl Check if FLAG in ENV-VAR is supported by compiler and append it
-dnl to WHERE-TO-APPEND variable
-dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
-
-AC_DEFUN([CC_CHECK_FLAG_APPEND], [
-  AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
-                 AS_TR_SH([cc_cv_$2_$3]),
-          [eval "AS_TR_SH([cc_save_$2])='${$2}'"
-           eval "AS_TR_SH([$2])='-Werror $3'"
-           AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void) { return 0; } ])],
-                          [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
-                          [eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
-           eval "AS_TR_SH([$2])='$cc_save_$2'"])
-
-  AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
-        [eval "$1='${$1} $3'"])
-])
-
-dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
-AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
-  for flag in $3; do
-    CC_CHECK_FLAG_APPEND($1, $2, $flag)
-  done
-])
-
-dnl Check if the flag is supported by linker (cacheable)
-dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
-
-AC_DEFUN([CC_CHECK_LDFLAGS], [
-  AC_CACHE_CHECK([if $CC supports $1 flag],
-    AS_TR_SH([cc_cv_ldflags_$1]),
-    [ac_save_LDFLAGS="$LDFLAGS"
-     LDFLAGS="$LDFLAGS $1"
-     AC_LINK_IFELSE([int main() { return 1; }],
-       [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
-       [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
-     LDFLAGS="$ac_save_LDFLAGS"
-    ])
-
-  AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
-    [$2], [$3])
-])
-
-dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
-dnl the current linker to avoid undefined references in a shared object.
-AC_DEFUN([CC_NOUNDEFINED], [
-  dnl We check $host for which systems to enable this for.
-  AC_REQUIRE([AC_CANONICAL_HOST])
-
-  case $host in
-     dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
-     dnl are requested, as different implementations are present; to avoid problems
-     dnl use -Wl,-z,defs only for those platform not behaving this way.
-     *-freebsd* | *-openbsd*) ;;
-     *)
-        dnl First of all check for the --no-undefined variant of GNU ld. This allows
-        dnl for a much more readable command line, so that people can understand what
-        dnl it does without going to look for what the heck -z defs does.
-        for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
-           CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
-           break
-        done
-     ;;
-  esac
-
-  AC_SUBST([LDFLAGS_NOUNDEFINED])
-])
-
-dnl Check for a -Werror flag or equivalent. -Werror is the GCC
-dnl and ICC flag that tells the compiler to treat all the warnings
-dnl as fatal. We usually need this option to make sure that some
-dnl constructs (like attributes) are not simply ignored.
-dnl
-dnl Other compilers don't support -Werror per se, but they support
-dnl an equivalent flag:
-dnl  - Sun Studio compiler supports -errwarn=%all
-AC_DEFUN([CC_CHECK_WERROR], [
-  AC_CACHE_CHECK(
-    [for $CC way to treat warnings as errors],
-    [cc_cv_werror],
-    [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
-      [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
-    ])
-])
-
-AC_DEFUN([CC_CHECK_ATTRIBUTE], [
-  AC_REQUIRE([CC_CHECK_WERROR])
-  AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
-    AS_TR_SH([cc_cv_attribute_$1]),
-    [ac_save_CFLAGS="$CFLAGS"
-     CFLAGS="$CFLAGS $cc_cv_werror"
-     AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
-       [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
-       [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
-     CFLAGS="$ac_save_CFLAGS"
-    ])
-
-  AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
-    [AC_DEFINE(
-       AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
-         [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
-         )
-     $4],
-    [$5])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
-  CC_CHECK_ATTRIBUTE(
-    [constructor],,
-    [void __attribute__((constructor)) ctor() { int a; }],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
-  CC_CHECK_ATTRIBUTE(
-    [format], [format(printf, n, n)],
-    [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
-  CC_CHECK_ATTRIBUTE(
-    [format_arg], [format_arg(printf)],
-    [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
-  CC_CHECK_ATTRIBUTE(
-    [visibility_$1], [visibility("$1")],
-    [void __attribute__((visibility("$1"))) $1_function() { }],
-    [$2], [$3])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
-  CC_CHECK_ATTRIBUTE(
-    [nonnull], [nonnull()],
-    [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
-  CC_CHECK_ATTRIBUTE(
-    [unused], ,
-    [void some_function(void *foo, __attribute__((unused)) void *bar);],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
-  CC_CHECK_ATTRIBUTE(
-    [sentinel], ,
-    [void some_function(void *foo, ...) __attribute__((sentinel));],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
-  CC_CHECK_ATTRIBUTE(
-    [deprecated], ,
-    [void some_function(void *foo, ...) __attribute__((deprecated));],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
-  CC_CHECK_ATTRIBUTE(
-    [alias], [weak, alias],
-    [void other_function(void *foo) { }
-     void some_function(void *foo) __attribute__((weak, alias("other_function")));],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
-  CC_CHECK_ATTRIBUTE(
-    [malloc], ,
-    [void * __attribute__((malloc)) my_alloc(int n);],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_PACKED], [
-  CC_CHECK_ATTRIBUTE(
-    [packed], ,
-    [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_CONST], [
-  CC_CHECK_ATTRIBUTE(
-    [const], ,
-    [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
-    [$1], [$2])
-])
-
-AC_DEFUN([CC_FLAG_VISIBILITY], [
-  AC_REQUIRE([CC_CHECK_WERROR])
-  AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
-    [cc_cv_flag_visibility],
-    [cc_flag_visibility_save_CFLAGS="$CFLAGS"
-     CFLAGS="$CFLAGS $cc_cv_werror"
-     CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
-     cc_cv_flag_visibility='yes',
-     cc_cv_flag_visibility='no')
-     CFLAGS="$cc_flag_visibility_save_CFLAGS"])
-
-  AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
-    [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
-       [Define this if the compiler supports the -fvisibility flag])
-     $1],
-    [$2])
-])
-
-AC_DEFUN([CC_FUNC_EXPECT], [
-  AC_REQUIRE([CC_CHECK_WERROR])
-  AC_CACHE_CHECK([if compiler has __builtin_expect function],
-    [cc_cv_func_expect],
-    [ac_save_CFLAGS="$CFLAGS"
-     CFLAGS="$CFLAGS $cc_cv_werror"
-     AC_COMPILE_IFELSE([AC_LANG_SOURCE(
-       [int some_function() {
-        int a = 3;
-        return (int)__builtin_expect(a, 3);
-     }])],
-       [cc_cv_func_expect=yes],
-       [cc_cv_func_expect=no])
-     CFLAGS="$ac_save_CFLAGS"
-    ])
-
-  AS_IF([test "x$cc_cv_func_expect" = "xyes"],
-    [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
-     [Define this if the compiler supports __builtin_expect() function])
-     $1],
-    [$2])
-])
-
-AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
-  AC_REQUIRE([CC_CHECK_WERROR])
-  AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
-    [cc_cv_attribute_aligned],
-    [ac_save_CFLAGS="$CFLAGS"
-     CFLAGS="$CFLAGS $cc_cv_werror"
-     for cc_attribute_align_try in 64 32 16 8 4 2; do
-        AC_COMPILE_IFELSE([AC_LANG_SOURCE([
-          int main() {
-            static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
-            return c;
-          }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
-     done
-     CFLAGS="$ac_save_CFLAGS"
-  ])
-
-  if test "x$cc_cv_attribute_aligned" != "x"; then
-     AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
-       [Define the highest alignment supported])
-  fi
-])
diff --git a/peripheral_manager/src/src/button.c b/peripheral_manager/src/src/button.c
deleted file mode 100644
index a0357bdde781111aba11042ec606ee3b70db1bd3..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/button.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-#include "config.h"
-#include <syslog.h>
-#include <time.h>
-#include "log.h"
-#include "button.h"
-#include "led.h"
-#include "touch_sx9512.h"
-#include "prox_px3220.h"
-
-
-static struct ubus_context *global_ubus_ctx;
-static struct blob_buf bblob;
-
-static void button_ubus_interface_event(struct ubus_context *ubus_ctx, char *button, button_state_t pressed);
-
-static void button_ubus_interface_event(struct ubus_context *ubus_ctx, char *button, button_state_t pressed)
-{
-	char s[UBUS_BUTTON_NAME_PREPEND_LEN+BUTTON_MAX_NAME_LEN];
-	s[0]=0;
-	strcat(s, UBUS_BUTTON_NAME_PREPEND);
-	strcat(s, button);
-	blob_buf_init(&bblob, 0);
-	blobmsg_add_string(&bblob, "action", pressed ? "pressed" : "released");
-	ubus_send_event(ubus_ctx, s, bblob.head);
-}
-
-
-/* used to map in the driver buttons to a function button */
-struct button_drv_list {
-        struct list_head list;
-        struct timespec pressed_time;
-        struct button_drv *drv;
-};
-
-/**/
-struct function_button {
-	struct list_head list;
-        char *name;
-        int dimming;
-        char *hotplug;
-	char *hotplug_long;
-        int minpress;
-        int longpress;                          /* negative value means valid if  mintime < time < abs(longpress ) */
-                                                /* positive value means valid if time > longpreass */
-                                                /* zero value means valid if time > mintime */
-	struct list_head drv_list;              /* list of all driver button that is needed to activate this button function */
-};
-
-/* PUT every button from drivers into a list */
-struct drv_button_list{
-	struct list_head list;
-	struct button_drv *drv;
-};
-
-/* list of all driver buttons added by drivers. */
-static LIST_HEAD(drv_buttons_list);
-
-/* list containing all function buttons read from config file */
-static LIST_HEAD(buttons);
-
-
-void button_add( struct button_drv *drv)
-{
-	struct drv_button_list *drv_node = malloc(sizeof(struct drv_button_list));
-
-	DBG(1,"called with button name [%s]", drv->name);
-	drv_node->drv = drv;
-
-	list_add(&drv_node->list, &drv_buttons_list);
-}
-
-static struct button_drv *get_drv_button(const char *name)
-{
-	struct list_head *i;
-	list_for_each(i, &drv_buttons_list) {
-		struct drv_button_list *node = list_entry(i, struct drv_button_list, list);
-                if (! strcmp(node->drv->name, name))
-                        return node->drv;
-	}
-        return NULL;
-}
-
-#if 0
-static struct function_button *get_button(const char *name)
-{
-	struct list_head *i;
-	list_for_each(i, &buttons) {
-		struct function_button *node = list_entry(i, struct function_button, list);
-                if (! strcmp(node->name, name))
-                        return node;
-	}
-        return NULL;
-}
-#endif
-
-
-//! Read state for single button
-static button_state_t read_button_state(const char *name)
-{
-	struct list_head *i;
-#ifdef HAVE_BOARD_H
-	/* sx9512 driver needs to read out all buttons at once */
-	/* so call it once at beginning of scanning inputs  */
-	sx9512_check();
-	/* same for px3220 */
-	px3220_check();
-#endif
-	list_for_each(i, &buttons) {
-		struct list_head *j;
-		struct function_button *node = list_entry(i, struct function_button, list);
-		if(!strcmp(node->name, name)) {
-			button_state_t state=BUTTON_ERROR;
-			list_for_each(j, &node->drv_list) {
-				struct button_drv_list *drv_node = list_entry(j, struct button_drv_list, list);
-				if(drv_node->drv) {
-					if(drv_node->drv->func->get_state(drv_node->drv))
-						return BUTTON_PRESSED;
-					else
-						state=BUTTON_RELEASED;
-				}
-			}
-			return state;
-		}
-	}
-	return BUTTON_ERROR;
-}
-
-struct button_status {
-	char name[BUTTON_MAX_NAME_LEN];
-	button_state_t state;
-};
-
-struct button_status_all {
-	int n;
-	struct button_status status[BUTTON_MAX];
-};
-
-
-//! Read states for all buttons
-static struct button_status_all * read_button_states(void)
-{
-	static struct button_status_all p;
-	struct list_head *i;
-        p.n=0;
-#ifdef HAVE_BOARD_H
-	/* sx9512 driver needs to read out all buttons at once */
-	/* so call it once at beginning of scanning inputs  */
-	sx9512_check();
-	/* same for px3220 */
-	px3220_check();
-#endif
-	list_for_each(i, &buttons) {
-		struct list_head *j;
-		button_state_t state=BUTTON_ERROR;
-		struct function_button *node = list_entry(i, struct function_button, list);
-		strcpy(p.status[p.n].name, node->name);
-		list_for_each(j, &node->drv_list) {
-			struct button_drv_list *drv_node = list_entry(j, struct button_drv_list, list);
-			if(drv_node->drv) {
-				if(drv_node->drv->func->get_state(drv_node->drv))
-					state=BUTTON_PRESSED;
-				else
-					state=BUTTON_RELEASED;
-			}
-		}
-		p.status[p.n].state = state;
-		p.n++;
-	}
-	return &p;
-}
-
-static void dump_drv_list(void)
-{
-	struct list_head *i;
-	list_for_each(i, &drv_buttons_list) {
-		struct drv_button_list *node = list_entry(i, struct drv_button_list, list);
-		DBG(1,"button name = [%s]",node->drv->name);
-	}
-}
-
-static void dump_buttons_list(void)
-{
-	struct list_head *i;
-	list_for_each(i, &buttons) {
-		struct function_button *node = list_entry(i, struct function_button, list);
-		DBG(1,"button name = [%s]",node->name);
-                {
-                        struct list_head *j;
-                        list_for_each(j, &node->drv_list) {
-                                struct button_drv_list *drv_node = list_entry(j, struct button_drv_list, list);
-                                if(drv_node->drv != NULL)
-                                        DBG(1,"%13s drv button name = [%s]","",drv_node->drv->name);
-                        }
-                        DBG(1,"%13s minpress = %d","",node->minpress);
-                        DBG(1,"%13s longpress = %d","",node->longpress);
-                }
-	}
-}
-
-
-//! Run the hotplug command associated with function button
-//! @retval 0 ok
-static int button_hotplug_cmd(const char *name, bool longpress)
-{
-	struct list_head *i;
-	list_for_each(i, &buttons) {
-		struct function_button *node = list_entry(i, struct function_button, list);
-		if(!strcmp(node->name, name)) {
-			char str[512];
-			char *hotplug = node->hotplug;
-			if(longpress && node->hotplug_long)
-				hotplug = node->hotplug_long;
-			if(!hotplug)
-				return 1;
-			DBG(1, "send key %s [%s] to system %s", node->name, hotplug, longpress ? "(longpress)" : "");
-			snprintf(str, 512, "ACTION=register INTERFACE=%s /sbin/hotplug-call button &", hotplug);
-			system(str);
-			syslog(LOG_INFO, "%s",str);
-			return 0;
-		}
-	}
-	return 1;
-}
-
-
-static int timer_started(struct button_drv_list *button_drv)
-{
-        if (button_drv->pressed_time.tv_sec == 0 )
-                if (button_drv->pressed_time.tv_nsec == 0 )
-                        return 0;
-        return 1;
-}
-
-static void timer_start(struct button_drv_list *button_drv)
-{
-        clock_gettime(CLOCK_MONOTONIC, &button_drv->pressed_time);
-}
-
-static void timer_stop(struct button_drv_list *button_drv)
-{
-        button_drv->pressed_time.tv_sec = 0;
-        button_drv->pressed_time.tv_nsec = 0;
-}
-
-
-static button_press_type_t timer_valid(struct button_drv_list *button_drv, int mtimeout, int longpress)
-{
-        struct timespec now;
-        int sec;
-        int nsec;
-	int time_elapsed;
-
-        if (timer_started(button_drv)) {
-                clock_gettime(CLOCK_MONOTONIC, &now);
-                sec =  now.tv_sec  - button_drv->pressed_time.tv_sec;
-                nsec = now.tv_nsec - button_drv->pressed_time.tv_nsec;
-		time_elapsed = sec*1000 + nsec/1000000;
-                if ( mtimeout < time_elapsed) {
-			if (longpress && (longpress < time_elapsed))
-				return BUTTON_PRESS_LONG;
-			return BUTTON_PRESS_SHORT;
-                }
-        }
-	return BUTTON_PRESS_NONE;
-}
-
-#define BUTTON_TIMEOUT 100
-static void button_handler(struct uloop_timeout *timeout);
-static struct uloop_timeout button_inform_timer = { .cb = button_handler };
-
-static void button_handler(struct uloop_timeout *timeout)
-{
- 	struct list_head *i;
-	int r;
-//        DBG(1, "");
-
-#ifdef HAVE_BOARD_H
-
-        /* sx9512 driver needs to read out all buttons at once */
-        /* so call it once at beginning of scanning inputs  */
-        sx9512_check();
-        /* same for px3220 */
-        px3220_check();
-#endif
-
-        /* clean out indicator status, set by any valid press again if we find it */
-        led_pressindicator_set(PRESS_NONE);
-
-	list_for_each(i, &buttons) {
-                struct list_head *j;
-		struct function_button *node = list_entry(i, struct function_button, list);
-
-                list_for_each(j, &node->drv_list) {
-                        struct button_drv_list *drv_node = list_entry(j, struct button_drv_list, list);
-                        if (drv_node->drv) {
-                                button_press_type_t time_type;
-                                button_state_t st = drv_node->drv->func->get_state(drv_node->drv);
-
-                                if (st == BUTTON_PRESSED ) {
-                                        if (! timer_started(drv_node)) {
-                                                timer_start(drv_node);
-                                                DBG(1, " %s pressed", drv_node->drv->name);
-//						button_ubus_interface_event(global_ubus_ctx, node->name, BUTTON_PRESSED);
-                                        }
-
-                                        time_type = timer_valid(drv_node, node->minpress, node->longpress);
-					if( time_type == BUTTON_PRESS_LONG )
-						led_pressindicator_set(PRESS_LONG);
-					if( time_type == BUTTON_PRESS_SHORT )
-						led_pressindicator_set(PRESS_SHORT);
-                                }
-
-                                if (st == BUTTON_RELEASED ) {
-                                        if (timer_started(drv_node)) {
-                                                DBG(1, " %s released", drv_node->drv->name);
-                                                if((r=timer_valid(drv_node, node->minpress, node->longpress))) {
-							button_ubus_interface_event(global_ubus_ctx, node->name, BUTTON_RELEASED);
-							if(node->dimming)
-								led_dimming();
-                                                        DBG(1, " %s released timer_valid=%d", drv_node->drv->name,r);
-							button_hotplug_cmd(node->name, r==BUTTON_PRESS_LONG);
-						}
-                                        }
-                                        timer_stop(drv_node);
-                                }
-//                                DBG(1, " %s state = %d", drv_node->drv->name,st);
-                        }
-                }
-        }
-	uloop_timeout_set(&button_inform_timer, BUTTON_TIMEOUT);
-}
-
-
-static int button_state_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-	struct ubus_request_data *req, const char *method, struct blob_attr *msg)
-{
-//	button_state_t state = read_button_state(obj->name+UBUS_BUTTON_NAME_PREPEND_LEN);
-	blob_buf_init(&bblob, 0);
-
-	switch(read_button_state(obj->name+UBUS_BUTTON_NAME_PREPEND_LEN)) {
-	case BUTTON_RELEASED:
-		blobmsg_add_string(&bblob, "state", "released");
-		break;
-	case BUTTON_PRESSED:
-		blobmsg_add_string(&bblob, "state", "pressed");
-		break;
-	default:
-		blobmsg_add_string(&bblob, "state", "error");
-	}
-	ubus_send_reply(ubus_ctx, req, bblob.head);
-	return 0;
-}
-
-
-static int button_press_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-				struct ubus_request_data *req, const char *method, struct blob_attr *msg)
-{
-	button_hotplug_cmd(obj->name+UBUS_BUTTON_NAME_PREPEND_LEN, 0);
-	blob_buf_init(&bblob, 0);
-	ubus_send_reply(ubus_ctx, req, bblob.head);
-	return 0;
-}
-
-
-static int button_press_long_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-			       struct ubus_request_data *req, const char *method, struct blob_attr *msg)
-{
-	button_hotplug_cmd(obj->name+UBUS_BUTTON_NAME_PREPEND_LEN, 1);
-	blob_buf_init(&bblob, 0);
-	ubus_send_reply(ubus_ctx, req, bblob.head);
-	return 0;
-}
-
-
-static int buttons_state_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-	struct ubus_request_data *req, const char *method, struct blob_attr *msg)
-{
-	int i;
-	static struct button_status_all *p;
-	p = read_button_states();
-	blob_buf_init(&bblob, 0);
-	for(i=0;i < p->n; i++) {
-		switch(p->status[i].state) {
-		case BUTTON_RELEASED:
-			blobmsg_add_string(&bblob, p->status[i].name, "released");
-			break;
-		case BUTTON_PRESSED:
-			blobmsg_add_string(&bblob, p->status[i].name, "pressed");
-			break;
-		default:
-			blobmsg_add_string(&bblob, p->status[i].name, "error");
-		}
-	}
-	ubus_send_reply(ubus_ctx, req, bblob.head);
-	return 0;
-}
-
-
-static const struct ubus_method button_methods[] = {
-//	{ .name = "status", .handler = button_status_method },
-	{ .name = "state", .handler = button_state_method },
-	{ .name = "press", .handler = button_press_method },
-	{ .name = "press_long", .handler = button_press_long_method },
-};
-
-static struct ubus_object_type button_object_type = UBUS_OBJECT_TYPE("button", button_methods);
-
-
-static const struct ubus_method buttons_methods[] = {
-	{ .name = "state", .handler = buttons_state_method },
-};
-
-static struct ubus_object_type buttons_object_type = UBUS_OBJECT_TYPE("buttons", buttons_methods);
-
-static struct ubus_object buttons_object = { .name = "buttons", .type = &buttons_object_type, .methods = buttons_methods, .n_methods = ARRAY_SIZE(buttons_methods), };
-
-
-void button_init( struct server_ctx *s_ctx)
-{
-	struct ucilist *node;
-	LIST_HEAD(buttonnames);
-	int default_minpress = 100;
-        char *s;
-	int   r;
-
-	global_ubus_ctx=s_ctx->ubus_ctx;
-
-	/* register buttons object with ubus */
-	if((r=ubus_add_object(s_ctx->ubus_ctx, &buttons_object)))
-		DBG(1,"Failed to add object: %s", ubus_strerror(r));
-
-        /* read out default global options */
-        s = ucix_get_option(s_ctx->uci_ctx, "hw" , "button_map", "minpress");
-        DBG(1, "default minpress = [%s]", s);
-        if (s){
-                default_minpress =  strtol(s,0,0);
-        }
-
-        /* read function buttons from section button_map */
-	ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"button_map", "buttonnames", &buttonnames);
-	list_for_each_entry(node, &buttonnames, list) {
-                struct function_button *function;
-
-//                DBG(1, "value = [%s]",node->val);
-
-		function = malloc(sizeof(struct function_button));
-		memset(function,0,sizeof(struct function_button));
-                function->name = node->val;
-
-                /* read out dimming */
-                s = ucix_get_option(s_ctx->uci_ctx, "hw" , function->name, "dimming");
-                DBG(1, "dimming = [%s]", s);
-                if (s){
-                        function->dimming = 1;
-                }else
-                        function->dimming = 0;
-
-                /* read out minpress */
-                s = ucix_get_option(s_ctx->uci_ctx, "hw" , function->name, "minpress");
-                DBG(1, "minpress = [%s]", s);
-                if (s){
-                        function->minpress =  strtol(s,0,0);
-                }else
-                        function->minpress =  default_minpress;
-
-                /* read out long_press */
-                s = ucix_get_option(s_ctx->uci_ctx, "hw" , function->name, "longpress");
-                DBG(1, "longpress = [%s]", s);
-                if (s){
-                        function->longpress =  strtol(s,0,0);
-                }
-
-                /* read out hotplug option */
-                s = ucix_get_option(s_ctx->uci_ctx, "hw" , function->name, "hotplug");
-                DBG(1, "hotplug = [%s]", s);
-                if (s){
-                        function->hotplug = s;
-                }
-
-		/* read out hotplug option for longpress */
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , function->name, "hotplug_long");
-		DBG(1, "hotplug_long = [%s]", s);
-		if (s){
-			function->hotplug_long = s;
-		}
-
-                INIT_LIST_HEAD(&function->drv_list);
-
-                {
-                        struct ucilist *drv_node;
-                        LIST_HEAD(head);
-                        int num = 0;
-
-                        /* read out all driver buttons that needs to be pressed for this button function. */
-                        ucix_get_option_list(s_ctx->uci_ctx, "hw" ,function->name, "button", &head);
-
-                        list_for_each_entry(drv_node, &head, list) {
-                                struct button_drv_list *new_button;
-
-                                num++;
-                                DBG(1,"function %s -> drv button %s", function->name, drv_node->val);
-
-                                new_button = malloc(sizeof(struct button_drv_list));
-                                memset(new_button,0,sizeof(struct button_drv_list));
-
-                                new_button->drv = get_drv_button(drv_node->val);
-
-                                if(new_button->drv == NULL){
-                                        syslog(LOG_WARNING, "%s wanted drv button [%s] but it can't be found. check spelling.",
-                                               function->name,
-                                               drv_node->val);
-                                }
-
-                                list_add( &new_button->list, &function->drv_list);
-                        }
-                        if (num == 0 )
-                                syslog(LOG_WARNING, "Function  %s did not have any mapping to a driver button", function->name);
-                }
-
-                list_add(&function->list, &buttons);
-
-		/* register each button with ubus */
-                {
-                        struct ubus_object *ubo;
-                        char name[UBUS_BUTTON_NAME_PREPEND_LEN+BUTTON_MAX_NAME_LEN];
-                        ubo = malloc(sizeof(struct ubus_object));
-                        memset(ubo, 0, sizeof(struct ubus_object));
-
-                        snprintf(name, UBUS_BUTTON_NAME_PREPEND_LEN+BUTTON_MAX_NAME_LEN, "%s%s", UBUS_BUTTON_NAME_PREPEND, node->val);
-                        ubo->name      = strdup(name);
-                        ubo->methods   = button_methods;
-                        ubo->n_methods = ARRAY_SIZE(button_methods);
-                        ubo->type      = &button_object_type;
-                        if((r=ubus_add_object(s_ctx->ubus_ctx, ubo)))
-                                DBG(1,"Failed to add object: %s", ubus_strerror(r));
-                }
-        }
-
-	uloop_timeout_set(&button_inform_timer, BUTTON_TIMEOUT);
-
-	dump_drv_list();
-        dump_buttons_list();
-}
-
diff --git a/peripheral_manager/src/src/button.h b/peripheral_manager/src/src/button.h
deleted file mode 100644
index 242d90ca95195eb608311ec07dad4daee3866044..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/button.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef BUTTON_H
-#define BUTTON_H
-#include "server.h"
-
-#define BUTTON_MAX 32
-#define BUTTON_MAX_NAME_LEN 16
-#define UBUS_BUTTON_NAME_PREPEND "button."
-#define UBUS_BUTTON_NAME_PREPEND_LEN sizeof(UBUS_BUTTON_NAME_PREPEND)
-
-typedef enum {
-	BUTTON_RELEASED,
-	BUTTON_PRESSED,
-	BUTTON_ERROR,
-} button_state_t;
-
-typedef enum {
-	BUTTON_PRESS_NONE,
-	BUTTON_PRESS_SHORT,
-	BUTTON_PRESS_LONG,
-} button_press_type_t;
-
-struct button_drv;
-
-struct button_drv_func {
-	button_state_t (*get_state)(struct button_drv *);		/* Get button state, on,off ...	*/
-};
-
-struct button_drv {
-	const char *name;		/* name, set in the confg file,has to be uniq	*/
-	void *priv;			/* for use by the driver			*/
-	struct button_drv_func *func;	/* function pointers for reading the button	*/
-};
-
-void button_add( struct button_drv *drv);
-void button_init( struct server_ctx *s_ctx);
-
-#endif /* BUTTON_H */
diff --git a/peripheral_manager/src/src/catv.c b/peripheral_manager/src/src/catv.c
deleted file mode 100644
index e64eb211a88c11b87e861487a2ac0f6c66d10ce1..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/catv.c
+++ /dev/null
@@ -1,1411 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <math.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-
-#include "smbus.h"
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-
-#include "libubus.h"
-#include <uci_config.h>
-#include <uci.h>
-#include "ucix.h"
-
-
-#include "i2c.h"
-#include "catv.h"
-#include "log.h"
-
-
-struct catv_handler
-{
-    int i2c_a0;
-    int i2c_a2;
-    struct uci_context *ctx;
-};
-
-static struct catv_handler *pcatv;
-
-static int catv_get_type(struct blob_buf *b)
-{
-    int type;
-    const char *s;
-
-    type = i2c_smbus_read_byte_data(pcatv->i2c_a0,32);
-
-    if (type < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    switch (type) {
-    case 0:
-        s = "CATV Receiver";
-        break;
-    case 1:
-        s = "RFoG";
-        break;
-    case 2:
-        s = "Satelite Fiber";
-        break;
-    case 3:
-        s = "Fiber Node";
-        break;
-    default:
-        s="Error reading data";
-    }
-
-    blobmsg_add_string(b, "Type", s);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_type_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                   struct ubus_request_data *req, const char *method,
-                                   struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_type(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_partnum(struct blob_buf *b)
-{
-    char buf[12+1];
-    int ret;
-    memset(buf, 0, sizeof(buf));
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a0, 0, 12, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    blobmsg_add_string(b, "Part number",buf );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_partnum_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                   struct ubus_request_data *req, const char *method,
-                                   struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_partnum(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vendor(struct blob_buf *b)
-{
-    char buf[20+1];
-    int ret;
-    memset(buf, 0, sizeof(buf));
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a0, 12, 20, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    blobmsg_add_string(b, "Vendor",buf );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vendor_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                   struct ubus_request_data *req, const char *method,
-                                   struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_vendor(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vendor_partnum(struct blob_buf *b)
-{
-    char buf[20+1];
-    int ret;
-    memset(buf, 0, sizeof(buf));
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a0, 33, 20, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    blobmsg_add_string(b, "Vendor part number",buf );
-
-    return UBUS_STATUS_OK;
-}
-static int catv_get_vendor_partnum_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                   struct ubus_request_data *req, const char *method,
-                                   struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_vendor_partnum(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_date(struct blob_buf *b)
-{
-    char buf[8+1];
-    int ret;
-    memset(buf, 0, sizeof(buf));
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a0, 73, 8, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    blobmsg_add_string(b, "Date",buf );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_date_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                   struct ubus_request_data *req, const char *method,
-                                   struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_date(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-
-
-static int catv_get_revision(struct blob_buf *b)
-{
-    char buf[4+1];
-    int ret;
-    memset(buf, 0, sizeof(buf));
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a0, 53, 4, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    blobmsg_add_string(b, "Revision",buf );
-
-    return UBUS_STATUS_OK;
-}
-static int catv_get_revision_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                  struct ubus_request_data *req, const char *method,
-                                  struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_revision(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_serial(struct blob_buf *b)
-{
-    char buf[16+1];
-    int ret;
-    memset(buf, 0, sizeof(buf));
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a0, 57, 16, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    blobmsg_add_string(b, "Serial",buf );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_serial_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                  struct ubus_request_data *req, const char *method,
-                                  struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_serial(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_interface(struct blob_buf *b)
-{
-    int type;
-    const char *s;
-
-    type = i2c_smbus_read_byte_data(pcatv->i2c_a0,81);
-
-    if(type < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    switch (type) {
-    case 0:
-        s = "GPIO";
-        break;
-    case 1:
-        s = "I2C";
-        break;
-    case 2:
-        s = "SPI";
-        break;
-    default:
-        s="Error reading data";
-    }
-
-    blobmsg_add_string(b, "Interface",s );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_interface_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_interface(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_bandwidth(struct blob_buf *b)
-{
-    int type;
-    const char *s;
-
-    type = i2c_smbus_read_byte_data(pcatv->i2c_a0,82);
-
-    if(type < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    switch (type) {
-    case 0:
-        s = "47MHz~870MHz";
-        break;
-    case 1:
-        s = "47MHz~1000MHz";
-        break;
-    case 2:
-        s = "54MHz~1000MHz";
-        break;
-    case 3:
-        s = "85MHz~1000MHz";
-        break;
-    default:
-        s="Error reading data";
-    }
-
-    blobmsg_add_string(b, "RF bandwidth",s );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_bandwidth_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_bandwidth(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_wavelength(struct blob_buf *b)
-{
-    int num;
-    char buf[10];
-    num = i2c_smbus_read_byte_data(pcatv->i2c_a0,83);
-
-    if(num < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    snprintf(buf, 10, "%d nm",num*10 );
-    blobmsg_add_string(b, "Receiver wavelength",buf );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_wavelength_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_wavelength(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_responsivity(struct blob_buf *b)
-{
-    int num;
-    char buf[15];
-    num = i2c_smbus_read_byte_data(pcatv->i2c_a0,84);
-    if(num < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    snprintf(buf, 15, "%1.2f",num*0.01 );
-    blobmsg_add_string(b, "Responsivity",buf );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_responsivity_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_responsivity(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_minoutput(struct blob_buf *b)
-{
-    int num;
-    char buf[15];
-    num = i2c_smbus_read_byte_data(pcatv->i2c_a0,85);
-    if(num < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    snprintf(buf, 15, "%d dBmV",num );
-    blobmsg_add_string(b, "Minimum RF output",buf );
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_minoutput_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_minoutput(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_maxoptical(struct blob_buf *b)
-{
-    int num;
-    char buf[15];
-    signed char value;
-    num = i2c_smbus_read_byte_data(pcatv->i2c_a0,86);
-    if(num < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    value = (signed char)(num & 0xff);
-
-    snprintf(buf, 15, "%2.1f dBmV",value * 0.1 );
-    blobmsg_add_string(b, "Maximum Optical Input Power", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_maxoptical_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_maxoptical(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_minoptical(struct blob_buf *b)
-{
-    int num;
-    char buf[15];
-    signed char value;
-    num = i2c_smbus_read_byte_data(pcatv->i2c_a0,87);
-
-    if(num < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    value = (signed char)(num & 0xff);
-
-    snprintf(buf, 15, "%2.1f dBmV",value * 0.1 );
-    blobmsg_add_string(b, "Minimum Optical Input Power", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_minoptical_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_minoptical(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_templimit(struct blob_buf *b)
-{
-    char buf[15];
-    float temp;
-    int ret;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 0, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    temp = ((signed short)(buf[0]<<8 | (buf[1] &0xff) ))/256.0;
-    snprintf(buf, 15, "%3.4f", temp );
-    blobmsg_add_string(b, "Temp Hi Alarm", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 2, 2, (__u8*)buf);
-    temp = ((signed short)(buf[0]<<8 | (buf[1] &0xff) ))/256.0;
-    snprintf(buf, 15, "%3.4f", temp );
-    blobmsg_add_string(b, "Temp Lo Alarm", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 4, 2, (__u8*)buf);
-    temp = ((signed short)(buf[0]<<8 | (buf[1] &0xff) ))/256.0;
-    snprintf(buf, 15, "%3.4f", temp );
-    blobmsg_add_string(b, "Temp Hi Warning", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 6, 2, (__u8*)buf);
-    temp = ((signed short)(buf[0]<<8 | (buf[1] &0xff) ))/256.0;
-    snprintf(buf, 15, "%3.4f", temp );
-    blobmsg_add_string(b, "Temp Lo Warning", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_templimit_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_templimit(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-
-static int catv_get_vcclimit(struct blob_buf *b)
-{
-    char buf[15];
-    float vcc;
-    int ret;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 8, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    vcc = 2.44 * (1 + (((unsigned short)(buf[0]<<8 | (buf[1] & 0xff) ))/512.0) );
-
-    snprintf(buf, 15, "%2.1f", vcc);
-    blobmsg_add_string(b, "VCC Hi Alarm", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 10, 2, (__u8*)buf);
-    vcc = 2.44 * (1 + (((unsigned short)(buf[0]<<8 | (buf[1] & 0xff) ))/512.0) );
-    snprintf(buf, 15, "%2.1f", vcc );
-    blobmsg_add_string(b, "VCC Lo Alarm", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 12, 2, (__u8*)buf);
-    vcc = 2.44 * (1 + (((unsigned short)(buf[0]<<8 | (buf[1] & 0xff) ))/512.0) );
-    snprintf(buf, 15, "%2.1f", vcc );
-    blobmsg_add_string(b, "VCC Hi Warning", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 14, 2, (__u8*)buf);
-    vcc = 2.44 * (1 + (((unsigned short)(buf[0]<<8 | (buf[1] & 0xff) ))/512.0) );
-    snprintf(buf, 15, "%2.1f", vcc );
-    blobmsg_add_string(b, "VCC Lo Warning", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vcclimit_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_vcclimit(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vpdlimit(struct blob_buf *b)
-{
-    char buf[15];
-    float vpd;
-    float resp;
-    int ret;
-
-    resp = i2c_smbus_read_byte_data(pcatv->i2c_a0,84);
-    resp = resp * 0.01;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 16, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    vpd = 2.44/1024 * (short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = 10*log(vpd/(0.47*4.9)/resp)/log(10);
-    snprintf(buf, 15, "%2.1f", vpd);
-    blobmsg_add_string(b, "VPD Hi Alarm", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 18, 2, (__u8*)buf);
-    vpd = 2.44/1024 * (short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = 10*log(vpd/(0.47*4.9)/resp)/log(10);
-    snprintf(buf, 15, "%2.1f", vpd );
-    blobmsg_add_string(b, "VPD Lo Alarm", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 20, 2, (__u8*)buf);
-    vpd = 2.44/1024 * (short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = 10*log(vpd/(0.47*4.9)/resp)/log(10);
-    snprintf(buf, 15, "%2.1f", vpd );
-    blobmsg_add_string(b, "VPD Hi Warning", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 22, 2, (__u8*)buf);
-    vpd = 2.44/1024 * (short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = 10*log(vpd/(0.47*4.9)/resp)/log(10);
-    snprintf(buf, 15, "%2.1f", vpd );
-    blobmsg_add_string(b, "VPD Lo Warning", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vpdlimit_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_vpdlimit(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-
-static int catv_get_rflimit(struct blob_buf *b)
-{
-    char buf[15];
-    float vpd;
-    int ret;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 24, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    vpd = 2.44/1024.0 * (unsigned short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = (vpd + 0.9148)/ 0.0582;
-    snprintf(buf, 15, "%2.1f", vpd);
-    blobmsg_add_string(b, "RF Hi Alarm", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 26, 2, (__u8*)buf);
-    vpd = 2.44/1024.0 * (unsigned short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = (vpd + 0.9148)/ 0.0582;
-    snprintf(buf, 15, "%2.1f", vpd );
-    blobmsg_add_string(b, "RF Lo Alarm", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 28, 2, (__u8*)buf);
-    vpd = 2.44/1024.0 * (unsigned short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = (vpd + 0.9148)/ 0.0582;
-    snprintf(buf, 15, "%2.1f", vpd );
-    blobmsg_add_string(b, "RF Hi Warning", buf);
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 30, 2, (__u8*)buf);
-    vpd = 2.44/1024.0 * (unsigned short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = (vpd + 0.9148)/ 0.0582;
-    snprintf(buf, 15, "%2.1f", vpd );
-    blobmsg_add_string(b, "RF Lo Warning", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_rflimit_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_rflimit(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_firmware(struct blob_buf *b)
-{
-    char buf[15];
-    unsigned short version;
-    int ret;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 56, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    version = (unsigned short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    snprintf(buf, 15, "0x%04x", version);
-    blobmsg_add_string(b, "Firmware version", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_firmware_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_firmware(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_temp(struct blob_buf *b)
-{
-    char buf[15];
-    float temp;
-    int ret;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 58, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    temp = ((signed short)(buf[0]<<8 | (buf[1] &0xff) ))/256.0;
-
-    snprintf(buf, 15, "%3.4f", temp);
-    blobmsg_add_string(b, "Temperature", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_temp_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_temp(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vcc(struct blob_buf *b)
-{
-    char buf[15];
-    float vcc;
-    int ret;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 60, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    vcc = 2.44 * (1 + (((unsigned short)(buf[0]<<8 | (buf[1] & 0xff) ))/512.0) );
-
-    snprintf(buf, 15, "%2.2f", vcc);
-    blobmsg_add_string(b, "VCC", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vcc_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_vcc(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vpd(struct blob_buf *b)
-{
-    char buf[15];
-    float vpd;
-    float resp;
-    int ret;
-
-    resp = i2c_smbus_read_byte_data(pcatv->i2c_a0,84);
-    resp = resp * 0.01;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 62, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    vpd = 2.44/1024 * (short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    vpd = 10*log(vpd/(0.47*4.9)/resp)/log(10);
-    snprintf(buf, 15, "%2.1f", vpd);
-    blobmsg_add_string(b, "VPD", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_vpd_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_vpd(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_rf(struct blob_buf *b)
-{
-    char buf[15];
-    float rf;
-    int ret;
-
-    ret = i2c_smbus_read_i2c_block_data(pcatv->i2c_a2, 64, 2, (__u8*)buf);
-    if(ret < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    rf = 2.44/1024.0 * (unsigned short)(buf[0]<<8 | (buf[1] & 0xff)) ;
-    rf = (rf + 0.9148)/ 0.0582;
-    snprintf(buf, 15, "%2.1f", rf);
-    blobmsg_add_string(b, "RF", buf);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_rf_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_rf(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_status(struct blob_buf *b)
-{
-    int status;
-
-    status = i2c_smbus_read_byte_data(pcatv->i2c_a2,73);
-
-    if(status < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    if (status & 0x01)
-        blobmsg_add_string(b, "Signal detect","ON" );
-    else
-        blobmsg_add_string(b, "Signal detect","OFF" );
-
-    if (status & 0x02)
-        blobmsg_add_string(b, "Interrupt","ON" );
-    else
-        blobmsg_add_string(b, "Interrupt","OFF" );
-
-    if (status & 0x04)
-        blobmsg_add_string(b, "RF enable","ON" );
-    else
-        blobmsg_add_string(b, "RF enable","OFF" );
-
-    if (status & 0x08)
-        blobmsg_add_string(b, "hold AGC","ON" );
-    else
-        blobmsg_add_string(b, "hold AGC","OFF" );
-
-    if (status & 0x10)
-        blobmsg_add_string(b, "47MHz ~ 1000MHz","ON" );
-    else
-        blobmsg_add_string(b, "47MHz ~ 1000MHz","OFF" );
-
-    if (status & 0x20)
-        blobmsg_add_string(b, "47MHz ~ 591MHz","ON" );
-    else
-        blobmsg_add_string(b, "47MHz ~ 591MHz","OFF" );
-
-    if (status & 0x40)
-        blobmsg_add_string(b, "47MHz ~ 431MHz","ON" );
-    else
-        blobmsg_add_string(b, "47MHz ~ 431MHz","OFF" );
-
-    return UBUS_STATUS_OK;
-}
-
-
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-#endif
-
-enum {
-    FILTER_FILTER
-};
-
-static const struct blobmsg_policy filter_policy[] = {
-    [FILTER_FILTER] = { .name = "filter", .type = BLOBMSG_TYPE_STRING },
-};
-
-static void catv_filter(struct catv_handler *h,int num)
-{
-    int status;
-    status = i2c_smbus_read_byte_data(h->i2c_a2,73);
-    status = status &  ~(0x10 | 0x20 | 0x40);
-    status = status | (1 <<(3 + num));
-    i2c_smbus_write_byte_data(h->i2c_a2, 73, status);
-}
-
-static int catv_set_filter_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-    struct blob_attr *tb[ARRAY_SIZE(filter_policy)];
-
-    blobmsg_parse(filter_policy, ARRAY_SIZE(filter_policy) , tb, blob_data(msg), blob_len(msg));
-
-    if (tb[FILTER_FILTER]) {
-        int num;
-        num = strtol(blobmsg_data(tb[FILTER_FILTER]),0,0);
-        catv_filter(pcatv,num);
-    }
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    if(catv_get_status(&b))
-        return UBUS_STATUS_NO_DATA;
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-enum {
-    STATUS_RF_ENABLE
-};
-static const struct blobmsg_policy set_enable_policy[] = {
-    [STATUS_RF_ENABLE] = { .name = "enable", .type = BLOBMSG_TYPE_STRING },
-};
-
-static void catv_enable(struct catv_handler *h)
-{
-    int status;
-    status = i2c_smbus_read_byte_data(h->i2c_a2,73);
-    status = status | 0x4;
-    i2c_smbus_write_byte_data(h->i2c_a2, 73, status);
-}
-static void catv_disable(struct catv_handler *h)
-{
-    int status;
-    status = i2c_smbus_read_byte_data(h->i2c_a2,73);
-    status = status & ~0x4;
-    i2c_smbus_write_byte_data(h->i2c_a2, 73, status);
-}
-
-static int catv_set_enable_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                  struct ubus_request_data *req, const char *method,
-                                  struct blob_attr *msg)
-{
-    struct blob_buf b;
-    struct blob_attr *tb[ARRAY_SIZE(set_enable_policy)];
-
-    blobmsg_parse(set_enable_policy, ARRAY_SIZE(set_enable_policy) , tb, blob_data(msg), blob_len(msg));
-
-    if (tb[STATUS_RF_ENABLE]) {
-
-        if (0 == strncasecmp("off", blobmsg_data(tb[STATUS_RF_ENABLE]), 3) ){
-            catv_disable(pcatv);
-        }
-        if (0 == strncasecmp("on", blobmsg_data(tb[STATUS_RF_ENABLE]), 2) ){
-            catv_enable(pcatv);
-        }
-    }
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_status(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-
-static int catv_get_status_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_status(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_get_alarm(struct blob_buf *b)
-{
-    int status;
-
-    status = i2c_smbus_read_byte_data(pcatv->i2c_a2,74);
-
-    if(status < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    if (status & 0x01)
-        blobmsg_add_string(b, "Alarm temp HI","ON" );
-    else
-        blobmsg_add_string(b, "Alarm temp HI","OFF" );
-
-    if (status & 0x02)
-        blobmsg_add_string(b, "Alarm temp LO","ON" );
-    else
-        blobmsg_add_string(b, "Alarm temp LO","OFF" );
-
-    if (status & 0x04)
-        blobmsg_add_string(b, "Warning temp HI","ON" );
-    else
-        blobmsg_add_string(b, "Warning temp HI","OFF" );
-
-    if (status & 0x08)
-        blobmsg_add_string(b, "Warning temp LO","ON" );
-    else
-        blobmsg_add_string(b, "Warning temp LO","OFF" );
-
-    if (status & 0x10)
-        blobmsg_add_string(b, "Alarm VCC HI","ON" );
-    else
-        blobmsg_add_string(b, "Alarm VCC HI","OFF" );
-
-    if (status & 0x20)
-        blobmsg_add_string(b, "Alarm VCC LO","ON" );
-    else
-        blobmsg_add_string(b, "Alarm VCC LO","OFF" );
-
-    if (status & 0x40)
-        blobmsg_add_string(b, "Warning VCC HI","ON" );
-    else
-        blobmsg_add_string(b, "Warning VCC HI","OFF" );
-
-    if (status & 0x80)
-        blobmsg_add_string(b, "Warning VCC LO","ON" );
-    else
-        blobmsg_add_string(b, "Warning VCC LO","OFF" );
-
-
-    status = i2c_smbus_read_byte_data(pcatv->i2c_a2,75);
-
-    if (status & 0x01)
-        blobmsg_add_string(b, "Alarm VPD HI","ON" );
-    else
-        blobmsg_add_string(b, "Alarm VPD HI","OFF" );
-
-    if (status & 0x02)
-        blobmsg_add_string(b, "Alarm VPD LO","ON" );
-    else
-        blobmsg_add_string(b, "Alarm VPD LO","OFF" );
-
-    if (status & 0x04)
-        blobmsg_add_string(b, "Warning VPD HI","ON" );
-    else
-        blobmsg_add_string(b, "Warning VPD HI","OFF" );
-
-    if (status & 0x08)
-        blobmsg_add_string(b, "Warning VPD LO","ON" );
-    else
-        blobmsg_add_string(b, "Warning VPD LO","OFF" );
-
-    if (status & 0x10)
-        blobmsg_add_string(b, "Alarm RF HI","ON" );
-    else
-        blobmsg_add_string(b, "Alarm RF HI","OFF" );
-
-    if (status & 0x20)
-        blobmsg_add_string(b, "Alarm RF LO","ON" );
-    else
-        blobmsg_add_string(b, "Alarm RF LO","OFF" );
-
-    if (status & 0x40)
-        blobmsg_add_string(b, "Warning RF HI","ON" );
-    else
-        blobmsg_add_string(b, "Warning RF HI","OFF" );
-
-    if (status & 0x80)
-        blobmsg_add_string(b, "Warning RF LO","ON" );
-    else
-        blobmsg_add_string(b, "Warning RF LO","OFF" );
-
-    return UBUS_STATUS_OK;
-
-}
-
-static int catv_get_alarm_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-    struct blob_buf b;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    catv_get_alarm(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static int catv_save_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                            struct ubus_request_data *req, const char *method,
-                            struct blob_attr *msg)
-{
-    struct blob_buf b;
-    int status;
-
-    memset(&b, 0, sizeof(b));
-    blob_buf_init(&b, 0);
-
-    status = i2c_smbus_read_byte_data(pcatv->i2c_a2,73);
-
-    if(status < 0)
-        return UBUS_STATUS_NO_DATA;
-
-    if (status & 0x4)
-        ucix_add_option(pcatv->ctx, "catv", "catv", "enable", "yes");
-    else
-        ucix_add_option(pcatv->ctx, "catv", "catv", "enable", "no");
-
-    if (status & 0x10)
-        ucix_add_option(pcatv->ctx, "catv", "catv", "filter", "1");
-    else if (status & 0x20)
-        ucix_add_option(pcatv->ctx, "catv", "catv", "filter", "2");
-    else if (status & 0x40)
-        ucix_add_option(pcatv->ctx, "catv", "catv", "filter", "3");
-
-
-    ucix_save(pcatv->ctx,"/etc/config");
-    ucix_commit(pcatv->ctx, "catv");
-
-    blobmsg_add_string(&b, "Saved", "/etc/config/catv");
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-
-static int catv_get_all_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                               struct ubus_request_data *req, const char *method,
-                               struct blob_attr *msg)
-{
-    struct blob_buf b;
-    int ret = 0;
-    memset(&b, 0, sizeof(b));
-    blob_buf_init (&b, 0);
-
-    ret += catv_get_partnum(&b);
-    ret += catv_get_vendor(&b);
-    ret += catv_get_type(&b);
-    ret += catv_get_vendor_partnum(&b);
-    ret += catv_get_revision(&b);
-    ret += catv_get_serial(&b);
-    ret += catv_get_date(&b);
-    ret += catv_get_interface(&b);
-    ret += catv_get_bandwidth(&b);
-    ret += catv_get_wavelength(&b);
-    ret += catv_get_responsivity(&b);
-    ret += catv_get_minoutput(&b);
-    ret += catv_get_maxoptical(&b);
-    ret += catv_get_minoptical(&b);
-    ret += catv_get_templimit(&b);
-    ret += catv_get_vcclimit(&b);
-    ret += catv_get_vpdlimit(&b);
-    ret += catv_get_rflimit(&b);
-    ret += catv_get_firmware(&b);
-    ret += catv_get_temp(&b);
-    ret += catv_get_vcc(&b);
-    ret += catv_get_vpd(&b);
-    ret += catv_get_rf(&b);
-    ret += catv_get_status(&b);
-    ret += catv_get_alarm(&b);
-
-    ubus_send_reply(ubus_ctx, req, b.head);
-
-    return UBUS_STATUS_OK;
-}
-
-static const struct ubus_method catv_methods[] = {
-    { .name = "partnumber",   .handler = catv_get_partnum_method },
-    { .name = "vendor",   .handler = catv_get_vendor_method },
-    { .name = "type",   .handler = catv_get_type_method},
-    { .name = "vendornumber",   .handler = catv_get_vendor_partnum_method },
-    { .name = "revision", .handler = catv_get_revision_method },
-    { .name = "serial",   .handler = catv_get_serial_method },
-    { .name = "date", .handler = catv_get_date_method },
-    { .name = "interface", .handler = catv_get_interface_method },
-    { .name = "bandwidth", .handler = catv_get_bandwidth_method },
-    { .name = "wavelength", .handler = catv_get_wavelength_method },
-    { .name = "responsivity", .handler = catv_get_responsivity_method },
-    { .name = "minoutput", .handler = catv_get_minoutput_method },
-    { .name = "maxoptical", .handler = catv_get_maxoptical_method },
-    { .name = "minoptical", .handler = catv_get_minoptical_method },
-    { .name = "templimit", .handler = catv_get_templimit_method },
-    { .name = "vcclimit", .handler = catv_get_vcclimit_method },
-    { .name = "vpdlimit", .handler = catv_get_vpdlimit_method },
-    { .name = "rflimit", .handler = catv_get_rflimit_method },
-    { .name = "firmware", .handler = catv_get_firmware_method },
-    { .name = "temp", .handler = catv_get_temp_method },
-    { .name = "vcc", .handler = catv_get_vcc_method },
-    { .name = "vpd", .handler = catv_get_vpd_method },
-    { .name = "rf", .handler = catv_get_rf_method },
-    { .name = "status", .handler = catv_get_status_method },
-    { .name = "alarm", .handler = catv_get_alarm_method },
-    { .name = "get-all",  .handler = catv_get_all_method },
-
-    UBUS_METHOD("set-filter", catv_set_filter_method, filter_policy),
-    UBUS_METHOD("set-enable", catv_set_enable_method, set_enable_policy),
-
-    { .name = "save", .handler = catv_save_method },
-};
-
-static struct ubus_object_type catv_type =
-    UBUS_OBJECT_TYPE("catv", catv_methods);
-
-static struct ubus_object catv_object = {
-    .name = "catv", .type = &catv_type,
-    .methods = catv_methods, ARRAY_SIZE(catv_methods) };
-
-int catv_ubus_populate(struct catv_handler *h, struct ubus_context *ubus_ctx)
-{
-    int ret;
-
-    ret = ubus_add_object (ubus_ctx, &catv_object);
-
-    return ret;
-}
-
-static void catv_config_open(struct catv_handler *h)
-{
-    int loop = 0;
-    /* open config file */
-again:
-
-    h->ctx = ucix_init_path("/etc/config", "catv", 0);
-
-    if (NULL == h->ctx) {
-        int fd;
-
-        syslog(LOG_INFO,"CATV config file not found /etc/config/catv\n");
-        fd = open("/etc/config/catv",O_RDWR | O_CREAT | O_TRUNC, 0644);
-        close(fd);
-        if (loop++ < 10)
-            goto again;
-    }
-}
-
-static void catv_config_read(struct catv_handler *h)
-{
-    const char *s;
-
-    /* set set filter */
-again:
-    s = ucix_get_option(h->ctx, "catv", "catv", "filter");
-    if (s){
-        int num = strtol(s,0,0);
-        catv_filter(h,num);
-    } else {
-        /* no data recreate the file */
-        ucix_add_section(h->ctx,"catv","catv", "service");
-        ucix_add_option(h->ctx,"catv", "catv", "enable","no");
-        ucix_add_option(h->ctx,"catv", "catv", "filter","3");
-        ucix_save(h->ctx,"/etc/config");
-        ucix_commit(h->ctx,"catv");
-        goto again;
-    }
-
-    /* set enable */
-    s = ucix_get_option(h->ctx, "catv", "catv", "enable");
-    if (s){
-        if (strncasecmp("yes", s, 3) == 0)
-            catv_enable(h);
-        else  if (strncasecmp("no", s, 2) == 0)
-            catv_disable(h);
-    }
-
-}
-
-struct catv_handler * catv_init(struct uci_context *uci_ctx, const char *i2c_bus,int a0_addr,int a2_addr)
-{
-    struct catv_handler *h;
-    const char *p;
-
-    h = malloc( sizeof(struct catv_handler) );
-
-    if (!h)
-        return NULL;
-
-    p = ucix_get_option(uci_ctx, "hw", "board", "hardware");
-    if (p == 0) {
-        syslog(LOG_INFO, "%s: Missing Hardware identifier in configuration. I2C is not started\n",__func__);
-        return NULL;
-    }
-
-    /* only run on EG300 hardware */
-    if ( strcasecmp("EG300", p)){
-        free(h);
-        return NULL;
-    }
-
-    h->i2c_a0 = i2c_open_dev(i2c_bus, a0_addr,
-                             I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE);
-
-    if (h->i2c_a0 == -1 ){
-        syslog(LOG_INFO,"Did not find any CATV device at %s address %x \n", i2c_bus, a0_addr);
-        free(h);
-        return 0;
-    }
-
-    h->i2c_a2 = i2c_open_dev(i2c_bus, a2_addr,
-                             I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE);
-
-    if (h->i2c_a2 == -1 ){
-        syslog(LOG_INFO,"Did not find any CATV device at %s address %x \n", i2c_bus, a2_addr);
-        close(h->i2c_a0);
-        free(h);
-        return 0;
-    }
-
-    catv_config_open(h);
-    catv_config_read(h);
-
-//    dump_i2c(h->i2c_a0,0,255);
-//    dump_i2c(h->i2c_a2,0,255);
-
-    pcatv = h;
-    return h;
-}
-
-void catv_destroy(struct catv_handler *h)
-{
-    close(h->i2c_a0);
-    close(h->i2c_a2);
-    free(h);
-}
-
diff --git a/peripheral_manager/src/src/catv.h b/peripheral_manager/src/src/catv.h
deleted file mode 100644
index 63ce7b6176e6063c3536f2f3f9af396bc6a5f820..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/catv.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef CATV_H
-#include "libubus.h"
-
-#include "ucix.h"
-
-struct catv_handler;
-
-struct catv_handler * catv_init(struct uci_context *uci_ctx, const char * i2c_bus, int i2c_addr_a0,int i2c_addr_a2);
-void catv_destroy(struct catv_handler *h);
-int catv_ubus_populate(struct catv_handler *h, struct ubus_context *ubus_ctx);
-
-#endif /* CATV_H */
diff --git a/peripheral_manager/src/src/catv_monitor.c b/peripheral_manager/src/src/catv_monitor.c
deleted file mode 100644
index d971314d36a575aeee8317fb010fff4fee9d1d59..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/catv_monitor.c
+++ /dev/null
@@ -1,242 +0,0 @@
-#include <stdio.h>
-#include "log.h"
-
-#include "server.h"
-
-#include "libubus.h"
-#include <uci_config.h>
-#include <uci.h>
-#include "ucix.h"
-
-typedef enum {
-        STATE_OFF,
-        STATE_OK,
-        STATE_NOTICE,
-        STATE_ALERT,
-        STATE_ERROR,
-}state_t;
-
-state_t state;
-
-static struct ubus_context *ubus_ctx;
-static char *ubus_socket;
-
-#define CATV_MONITOR_TIME (1000 * 10) /* 10 sec in ms */
-
-void catv_monitor_init(struct server_ctx *s_ctx);
-void catv_monitor_set_socket(char *socket_name);
-
-static void set_led(state_t state);
-static int is_enabled(void);
-
-static void catv_monitor_handler(struct uloop_timeout *timeout);
-struct uloop_timeout catv_monitor_timer = { .cb = catv_monitor_handler };
-
-static void
-catv_status_cb(struct ubus_request *req, int type, struct blob_attr *msg)
-{
-	struct blob_attr *cur;
-	uint32_t rem;
-	const char *data;
-
-	rem = blob_len(msg);
-
-	__blob_for_each_attr(cur, blob_data(msg), rem) {
-                if (!strcmp("RF enable", blobmsg_name(cur))) {
-                        data = blobmsg_data(cur);
-                        if (!strncasecmp("on", data, 2))
-                                *(int*)req->priv = 1;
-                                return;
-                }
-        }
-        *(int*)req->priv = 0;
-        return;
-}
-
-static int is_enabled(void)
-{
-	uint32_t id;
-        struct blob_buf b;
-        int enabled = 0;
-        int ret;
-
-        if (ubus_lookup_id(ubus_ctx, "catv", &id)) {
-                DBG(4, "Failed to look up catv object\n");
-                return 0;
-        }
-
-        memset(&b, 0, sizeof(struct blob_buf));
-        blob_buf_init(&b, 0);
-
-        ret = ubus_invoke(ubus_ctx, id, "status", b.head, catv_status_cb, &enabled, 3000);
-
-        if (ret)
-                DBG(1,"catv_monitor: ret = %s", ubus_strerror(ret));
-
-        return enabled;
-}
-
-static void
-catv_vpd_cb(struct ubus_request *req, int type, struct blob_attr *msg)
-{
-	struct blob_attr *cur;
-	uint32_t rem;
-	const char *data = "-inf";
-
-	rem = blob_len(msg);
-
-        /* no response */
-        if ( rem == 0 ) {
-                state = STATE_ERROR;
-                return;
-        }
-
-	__blob_for_each_attr(cur, blob_data(msg), rem) {
-                if (!strcmp("VPD", blobmsg_name(cur))) {
-                        data = blobmsg_data(cur);
-                }
-        }
-
-        /* no cable */
-        if (!strcmp("-inf", data)) {
-                state = STATE_ERROR;
-        }
-}
-
-static void
-catv_alarm_cb(struct ubus_request *req, int type, struct blob_attr *msg)
-{
-	struct blob_attr *cur;
-	uint32_t rem;
-	const char *data = "-inf";
-
-	rem = blob_len(msg);
-
-        /* no response */
-        if ( rem == 0 ) {
-                state = STATE_ERROR;
-                return;
-        }
-
-	__blob_for_each_attr(cur, blob_data(msg), rem) {
-                if (!strcasecmp("Alarm VPD HI", blobmsg_name(cur))) {
-                        data = blobmsg_data(cur);
-                        /* if on  */
-                        if (!strcmp("on", data)) {
-                                state = STATE_ALERT;
-                        }
-                }else if (!strcasecmp("Alarm VPD LO", blobmsg_name(cur))) {
-                        data = blobmsg_data(cur);
-                        /* if on  */
-                        if (!strcmp("on", data)) {
-                                state = STATE_ALERT;
-                        }
-                }else if (!strcasecmp("Warning VPD HI", blobmsg_name(cur))) {
-                        data = blobmsg_data(cur);
-                        /* if on  */
-                        if (!strcmp("on", data)) {
-                                state = STATE_NOTICE;
-                        }
-                }else if (!strcasecmp("Warning VPD LO", blobmsg_name(cur))) {
-                        data = blobmsg_data(cur);
-                        /* if on  */
-                        if (!strcmp("on", data)) {
-                                state = STATE_NOTICE;
-                        }
-                }
-        }
-}
-
-
-static void catv_monitor_handler(struct uloop_timeout *timeout)
-{
-	uint32_t id;
-        struct blob_buf b;
-        int ret;
-
-        /* start to set new state to OK */
-        /* then checks turn on different errors */
-        state = STATE_OK;
-
-        if (is_enabled()) {
-
-                if (ubus_lookup_id(ubus_ctx, "catv", &id)) {
-                        DBG(1, "Failed to look up catv object\n");
-                        return;
-                }
-
-                memset(&b, 0, sizeof(struct blob_buf));
-                blob_buf_init(&b, 0);
-
-                /* first check alarms, they set notice/alert if present */
-                ret = ubus_invoke(ubus_ctx, id, "alarm", b.head, catv_alarm_cb, 0, 3000);
-                if (ret)
-                        DBG(1,"ret = %s", ubus_strerror(ret));
-
-                /* then check cable in, it sets Error,*/
-                ret = ubus_invoke(ubus_ctx, id, "vpd", b.head, catv_vpd_cb, 0, 3000);
-                if (ret)
-                        DBG(1,"ret = %s", ubus_strerror(ret));
-        }else
-                state = STATE_OFF;
-
-        set_led(state);
-
-        uloop_timeout_set(&catv_monitor_timer, CATV_MONITOR_TIME);
-}
-
-static void set_led(state_t lstate)
-{
-	uint32_t id;
-        struct blob_buf b;
-        int ret;
-        static state_t old_state = -1;
-
-        if ( lstate == old_state )
-                return;
-        old_state = lstate;
-
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init(&b, 0);
-
-        switch (lstate) {
-        case STATE_OFF:
-                blobmsg_add_string(&b, "state", "off"); break;
-        case STATE_OK:
-                blobmsg_add_string(&b, "state", "ok"); break;
-        case STATE_NOTICE:
-                blobmsg_add_string(&b, "state", "notice"); break;
-        case STATE_ALERT:
-                blobmsg_add_string(&b, "state", "alert"); break;
-        case STATE_ERROR:
-                blobmsg_add_string(&b, "state", "error"); break;
-        }
-
-        if (ubus_lookup_id(ubus_ctx, "led.ext", &id)) {
-		DBG(1, "Failed to look up led.ext object\n");
-		return;
-	}
-
-	ret = ubus_invoke(ubus_ctx, id, "set", b.head, NULL, 0, 3000);
-
-        if ( ret )
-                DBG(1,"catv_moitor: set led failed [%s]", ubus_strerror(ret));
-}
-
-void catv_monitor_init(struct server_ctx *s_ctx)
-{
-        ubus_ctx = ubus_connect(ubus_socket);
-        if (!ubus_ctx) {
-                syslog(LOG_ERR,"catv monitor: Failed to connect to ubus\n");
-                return;
-        }
-
-        /* start monitor timer */
-        uloop_timeout_set(&catv_monitor_timer, CATV_MONITOR_TIME);
-}
-
-void catv_monitor_set_socket(char *socket_name)
-{
-        if (socket_name)
-                ubus_socket = strdup(socket_name);
-}
diff --git a/peripheral_manager/src/src/gpio.c b/peripheral_manager/src/src/gpio.c
deleted file mode 100644
index c60221bcddfa91443812f9cf6f419bf0d5833014..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/gpio.c
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <syslog.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdlib.h>
-#include "gpio.h"
-#include "log.h"
-
-#define DEVFILE_BRCM_BOARD "/dev/brcmboard"
-
-static int brcmboard = -1;
-
-
-int board_ioctl_init(void) {
-	if (brcmboard == -1){
-		brcmboard = open(DEVFILE_BRCM_BOARD, O_RDWR);
-		if ( brcmboard == -1 ) {
-			syslog(LOG_ERR, "failed to open: %s", DEVFILE_BRCM_BOARD);
-			return 1;
-		}
-		DBG(1, "fd %d allocated\n", brcmboard);
-	}
-	return 0;
-}
-
-
-int board_ioctl(int ioctl_id, int action, int hex, char* string_buf, int string_buf_len, int offset) {
-	BOARD_IOCTL_PARMS IoctlParms = {0};
-
-	IoctlParms.string = string_buf;
-	IoctlParms.strLen = string_buf_len;
-	IoctlParms.offset = offset;
-	IoctlParms.action = action;
-	IoctlParms.buf    = (char*)"";
-	IoctlParms.result = 0;
-
-	if (brcmboard != -1){
-		if ( ioctl(brcmboard, ioctl_id, &IoctlParms) < 0 ) {
-			syslog(LOG_ERR, "ioctl: %d failed", ioctl_id);
-			return(-255);
-		}
-
-	}
-	return IoctlParms.result;
-}
-
-
-gpio_state_t gpio_get_state(gpio_t gpio)
-{
-	return board_ioctl(BOARD_IOCTL_GET_GPIO, 0, 0, NULL, gpio, 0);
-}
-
-void gpio_set_state(gpio_t gpio, gpio_state_t state)
-{
-	board_ioctl(BOARD_IOCTL_SET_GPIO, 0, 0, NULL, gpio, state);
-}
diff --git a/peripheral_manager/src/src/gpio.h b/peripheral_manager/src/src/gpio.h
deleted file mode 100644
index 65f34740dcee64a362e57a7cfc318f0637108f01..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/gpio.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef GPIO_H
-#define GPIO_H
-
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <board.h>
-
-typedef int gpio_t;
-
-typedef enum {
-	GPIO_STATE_LOW,
-	GPIO_STATE_HIGH,
-} gpio_state_t;
-
-int board_ioctl_init(void);
-int board_ioctl(int ioctl_id, int action, int hex, char* string_buf, int string_buf_len, int offset);
-#define gpio_init() board_ioctl_init()
-gpio_state_t gpio_get_state(gpio_t gpio);
-void gpio_set_state(gpio_t gpio, gpio_state_t state);
-
-#endif /* GPIO_H */
diff --git a/peripheral_manager/src/src/gpio_button.c b/peripheral_manager/src/src/gpio_button.c
deleted file mode 100644
index b0f6344ed50cecf72b385795a2dcb4c1919db04e..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/gpio_button.c
+++ /dev/null
@@ -1,80 +0,0 @@
-#include <syslog.h>
-#include <string.h>
-#include "button.h"
-#include "log.h"
-#include "server.h"
-#include "gpio.h"
-#include <board.h>
-
-void gpio_button_init(struct server_ctx *s_ctx);
-
-struct gpio_button_data {
-	int addr;
-	int active;
-	int state;
-	struct button_drv button;
-};
-
-static button_state_t gpio_button_get_state(struct button_drv *drv)
-{
-//	DBG(1, "state for %s",  drv->name);
-	struct gpio_button_data *p = (struct gpio_button_data *)drv->priv;
-	int value;
-
-	value = board_ioctl( BOARD_IOCTL_GET_GPIO, 0, 0, NULL, p->addr, 0);
-
-	if(p->active)
-		p->state = !!value;
-	else
-		p->state = !value;
-
-	return p->state;
-}
-
-static struct button_drv_func func = {
-	.get_state = gpio_button_get_state,
-};
-
-void gpio_button_init(struct server_ctx *s_ctx) {
-	struct ucilist *node;
-	LIST_HEAD(buttons);
-
-	DBG(1, "");
-
-	ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"gpio_buttons", "buttons", &buttons);
-	list_for_each_entry(node, &buttons, list) {
-		struct gpio_button_data *data;
-		const char *s;
-
-		DBG(1, "value = [%s]",node->val);
-
-		data = malloc(sizeof(struct gpio_button_data));
-		memset(data,0,sizeof(struct gpio_button_data));
-
-		data->button.name = node->val;
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "addr");
-		DBG(1, "addr = [%s]", s);
-		if (s){
-			data->addr =  strtol(s,0,0);
-		}
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "active");
-		data->active = -1;
-		if (s){
-			if (!strncasecmp("hi",s,2))
-				data->active =  1;
-			else if (!strncasecmp("low",s,3))
-				data->active =  0;
-
-		}
-		DBG(1, "active = %d", data->active);
-
-		data->button.func = &func;
-		data->button.priv = data;
-
-		button_add(&data->button);
-	}
-
-	gpio_init();
-}
diff --git a/peripheral_manager/src/src/gpio_led.c b/peripheral_manager/src/src/gpio_led.c
deleted file mode 100644
index 4fa9b51ce0e5d5691beac1ac58e2f661d513a208..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/gpio_led.c
+++ /dev/null
@@ -1,153 +0,0 @@
-#include <syslog.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <board.h>
-#include "led.h"
-#include "log.h"
-#include "server.h"
-#include "gpio.h"
-#include "gpio_shift_register.h"
-
-gpio_shift_register_t led_gpio_shift_register;
-
-void gpio_led_init(struct server_ctx *s_ctx);
-
-typedef enum {
-	LOW,
-	HI,
-	UNKNOWN,
-} active_t;
-
-typedef enum {
-	MODE_UNKNOWN,
-	DIRECT,
-	SHIFTREG_BRCM,
-	SHIFTREG_GPIO,
-} gpio_mode_t;
-
-struct gpio_led_data {
-	int addr;
-	active_t active;
-	int state;
-	gpio_mode_t mode;
-	struct led_drv led;
-};
-
-static int gpio_led_set_state(struct led_drv *drv, led_state_t state)
-{
-	struct gpio_led_data *p = (struct gpio_led_data *)drv->priv;
-	int bit_val = 0;
-
-	if(state) {
-		if(p->active)
-			bit_val=1;
-	} else {
-		if(!p->active)
-			bit_val=1;
-	}
-
-	p->state = state;
-
-	switch (p->mode) {
-	case DIRECT:
-		board_ioctl( BOARD_IOCTL_SET_GPIO, 0, 0, NULL, p->addr, bit_val);
-		break;
-	case SHIFTREG_BRCM:
-		board_ioctl( BOARD_IOCTL_LED_CTRL, 0, 0, NULL, p->addr, bit_val);
-		break;
-	case SHIFTREG_GPIO:
-		gpio_shift_register_cached_set(&led_gpio_shift_register, p->addr, bit_val);
-		break;
-	default:
-		DBG(1,"access mode not supported [%d,%s]", p->mode, p->led.name);
-	}
-
-	return p->state;
-}
-
-static led_state_t gpio_led_get_state(struct led_drv *drv)
-{
-	struct gpio_led_data *p = (struct gpio_led_data *)drv->priv;
-	DBG(1, "state for %s",  drv->name);
-
-	return p->state;
-}
-
-static struct led_drv_func func = {
-	.set_state = gpio_led_set_state,
-	.get_state = gpio_led_get_state,
-};
-
-void gpio_led_init(struct server_ctx *s_ctx) {
-
-	LIST_HEAD(leds);
-	struct ucilist *node;
-	int gpio_shiftreg_clk=0, gpio_shiftreg_dat=1, gpio_shiftreg_mask=2, gpio_shiftreg_bits=0;
-	char *s;
-
-	DBG(1, "");
-
-	if((s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "gpio_shiftreg_clk")))
-		gpio_shiftreg_clk = strtol(s,0,0);
-	DBG(1, "gpio_shiftreg_clk = [%d]", gpio_shiftreg_clk);
-	if((s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "gpio_shiftreg_dat")))
-		gpio_shiftreg_dat = strtol(s,0,0);
-	DBG(1, "gpio_shiftreg_dat = [%d]", gpio_shiftreg_dat);
-	if((s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "gpio_shiftreg_mask")))
-		gpio_shiftreg_mask = strtol(s,0,0);
-	DBG(1, "gpio_shiftreg_mask = [%d]", gpio_shiftreg_mask);
-	if((s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "gpio_shiftreg_bits")))
-		gpio_shiftreg_bits = strtol(s,0,0);
-	DBG(1, "gpio_shiftreg_bits = [%d]", gpio_shiftreg_bits);
-	
-	ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"gpio_leds", "leds", &leds);
-	list_for_each_entry(node,&leds,list){
-		struct gpio_led_data *data;
-		const char *s;
-
-		DBG(1, "value = [%s]",node->val);
-
-		data = malloc(sizeof(struct gpio_led_data));
-		memset(data,0,sizeof(struct gpio_led_data));
-
-		data->led.name = node->val;
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "addr");
-		DBG(1, "addr = [%s]", s);
-		if (s) {
-			data->addr =  strtol(s,0,0);
-		}
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "mode");
-		DBG(1, "mode = [%s]", s);
-		if (s) {
-
-			if (!strncasecmp("direct",s,3))
-				data->mode =  DIRECT;
-			else if (!strncasecmp("sr",s,5))
-				data->mode =  SHIFTREG_BRCM;
-			else if (!strncasecmp("csr",s,4))
-				data->mode =  SHIFTREG_GPIO;
-			else
-				DBG(1, "Mode %s : Not supported!", s);
-		}
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "active");
-		DBG(1, "active = [%s]", s);
-		if (s) {
-			data->active = UNKNOWN;
-			if (!strncasecmp("hi",s,3))
-				data->active = HI;
-			if (!strncasecmp("low",s,3))
-				data->active = LOW;
-		}
-		data->led.func = &func;
-		data->led.priv = data;
-		led_add(&data->led);
-	}
-	gpio_init();
-	gpio_shift_register_init(&led_gpio_shift_register, gpio_shiftreg_clk, gpio_shiftreg_dat, gpio_shiftreg_mask, gpio_shiftreg_bits);
-}
diff --git a/peripheral_manager/src/src/gpio_shift_register.c b/peripheral_manager/src/src/gpio_shift_register.c
deleted file mode 100644
index afbef7bf82cd4b0e9b66fbc9c2b7ff9fbd64bc14..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/gpio_shift_register.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include "gpio_shift_register.h"
-#include <stdlib.h>
-#include "log.h"
-
-int gpio_shift_register_init(gpio_shift_register_t *p, gpio_t gpio_clk, gpio_t gpio_dat, gpio_t gpio_mask, int size)
-{
-	p->clk=gpio_clk;
-	p->dat=gpio_dat;
-	p->mask=gpio_mask;
-	p->size=size;
-	p->state_cache=0;
-	gpio_set_state(p->clk, 0);
-	gpio_set_state(p->dat, 0);
-	gpio_set_state(p->mask, 0);
-	return 0;
-}
-
-void gpio_shift_register_set(gpio_shift_register_t *p, int state)
-{
-	int i;
-	if(!p->size)
-		return;
-	gpio_set_state(p->mask, 0); //mask low
-	for(i=p->size; i; i--) {
-		gpio_set_state(p->clk, 0); //clk low
-		gpio_set_state(p->dat, (state>>(i-1)) & 1); //place bit
-		gpio_set_state(p->clk, 1); //clk high
-	}
-	gpio_set_state(p->mask, 1); //mask high / sreg load
-	p->state_cache=state; //update internal register copy
-}
-
-
-void gpio_shift_register_cached_set(gpio_shift_register_t *p, shift_register_index_t index, gpio_state_t state)
-{
-	if(!p->size)
-		return;
-	if(!(index < p->size)) {
-		syslog(LOG_ERR, "index %d out of bounds", index);
-		return;
-	}
-	//update internal register copy
-	if(state)
-		p->state_cache |= (1<<index);
-	else
-		p->state_cache &= ~(1<<index);
-	gpio_shift_register_set(p, p->state_cache);
-}
diff --git a/peripheral_manager/src/src/gpio_shift_register.h b/peripheral_manager/src/src/gpio_shift_register.h
deleted file mode 100644
index c1f61cc96b5f7fbc75d447e07804d936ab90055e..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/gpio_shift_register.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef GPIO_SHIFT_REGISTER_H
-#define GPIO_SHIFT_REGISTER_H
-
-#include "gpio.h"
-
-typedef int shift_register_index_t;
-
-typedef struct {
-	gpio_t clk;
-	gpio_t dat;
-	gpio_t mask;
-	int size;
-	int state_cache;
-} gpio_shift_register_t;
-
-int gpio_shift_register_init(gpio_shift_register_t *p, gpio_t gpio_clk, gpio_t gpio_dat, gpio_t gpio_mask, int size);
-void gpio_shift_register_set(gpio_shift_register_t *p, int state);
-void gpio_shift_register_cached_set(gpio_shift_register_t *p, shift_register_index_t address, gpio_state_t bit_val);
-
-#endif
\ No newline at end of file
diff --git a/peripheral_manager/src/src/gpio_test.c b/peripheral_manager/src/src/gpio_test.c
deleted file mode 100755
index 858e1d8fe925ea9ccaafba0b4d3a8ab9d6276a8c..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/gpio_test.c
+++ /dev/null
@@ -1,376 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-//#include <libgen.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <error.h>
-#include <errno.h>
-//#include <limits.h>
-//#include <sys/types.h>
-//#include <sys/stat.h>
-//#include <syslog.h>
-//#include <config.h>
-#include <getopt.h>
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-#include "smbus.h"
-#include "i2c.h"
-#include "log.h"
-#include "gpio.h"
-#include "gpio_shift_register.h"
-#include "sx9512.h"
-
-#define DEV_I2C "/dev/i2c-0"
-
-int verbose, debug_level;
-
-
-#define CMDS \
-X(NONE,             "none",             0, 0, "", "") \
-X(GPIO_GET,         "gpio_get",         1, 1, "Get pin state", "<pin>") \
-X(GPIO_SET,         "gpio_set",         2, 2, "Set pin state", "<pin> <state>") \
-X(SH_SET,           "sh_set",           5, 5, "Set shift register state", "<clk> <dat> <mask> <size> <state>") \
-X(SMBUS_READ,       "smbus_read",       3, 3, "Read from I2C/SMBUS device", "<addr> <reg> <len>") \
-X(SMBUS_WRITE,      "smbus_write",      3, 3, "Write to I2C/SMBUS device", "<addr> <reg> <hex_data>") \
-X(SX9512_BUTTON,    "sx9512_button",    0, 0, "Read SX9512 buttons (endless loop)", "") \
-X(SX9512_READ,      "sx9512_read",      0, 0, "Look at configuration data (compare to default)", "") \
-X(SX9512_INIT,      "sx9512_init",      0, 1, "Init SX9512 config to device defaults", "[device]") \
-X(SX9512_NVM_LOAD,  "sx9512_nvm_load",  0, 0, "SX9512 load values from NVM", "") \
-X(SX9512_NVM_STORE, "sx9512_nvm_store", 0, 0, "SX9512 store config to NVM", "") \
-X(SX9512_RESET,     "sx9512_reset",     0, 0, "Send reset command to SX9512", "")
-
-
-#define X(id, str, min_arg, max_arg, desc, arg_desc) CMD_##id,
-enum { CMDS CMDS_AMOUNT } cmd;
-#undef X
-
-struct cmd {
-	const char *str;
-	int min_arg, max_arg;
-	const char *desc, *arg_desc;
-};
-
-#define X(id, str, min_arg, max_arg, desc, arg_desc) { str, min_arg, max_arg, desc, arg_desc },
-const struct cmd cmd_data[] = { CMDS };
-#undef X
-
-
-#define SX9512_DEVCFGS \
-X(NONE,    "none"   ) \
-X(DEFAULT, "default") \
-X(CLEAR,   "clear"  ) \
-X(CG300,   "cg300"  ) \
-X(CG301,   "cg301"  ) \
-X(EG300,   "eg300"  ) \
-X(DG400,   "dg400"  )
-
-#define X(a, b) SX9512_DEVCFG_##a,
-enum sx9512_devcfg { SX9512_DEVCFGS SX9512_DEVCFG_AMOUNT };
-#undef X
-
-#define X(a, b) b,
-const char *sx9512_devcfg_str[] = { SX9512_DEVCFGS };
-#undef X
-
-
-static enum sx9512_devcfg sx9512_devcfg_str_to_id(const char *s)
-{
-	int i;
-	for(i=0; i<SX9512_DEVCFG_AMOUNT; i++) {
-		if(!strcmp(s, sx9512_devcfg_str[i]))
-			return i;
-	}
-	return 0;
-}
-
-
-static void print_usage(char *prg_name)
-{
-	int i;
-	char tmp[64];
-	printf("Usage: %s [options...] <cmd> <arg(s)>\n", prg_name);
-	printf("Options:\n");
-	printf("  -v, --verbose  Verbose output\n");
-	printf("  -h, --help     Show this help screen.\n");
-	printf("Commands:\n");
-	for(i=0;i<CMDS_AMOUNT;i++) {
-		sprintf(tmp, "%s %s", cmd_data[i].str, cmd_data[i].arg_desc);
-		printf("  %-40.40s %s\n", tmp, cmd_data[i].desc);
-	}
-	printf("\n");
-}
-
-
-int main(int argc, char **argv)
-{
-	int i, j, ch, r, fd=0;
-	int pin, state;
-	int pin_clk, pin_dat, pin_mask;
-	gpio_shift_register_t p;
-	int addr=0, s, n, l;
-	enum sx9512_devcfg devcfg=0;
-	uint8_t tmp[32];
-	char *str_value=0, *eptr, str_hex[3];
-	struct sx9512_reg_nvm nvm, nvm_def;
-	while(1) {
-		int option_index = 0;
-		static struct option long_options[] = {
-			{"verbose", no_argument,       0, 'v'},
-			{"help",    no_argument,       0, 'h'},
-			{0, 0, 0, 0}
-		};
-		ch = getopt_long(argc, argv, "vh", long_options, &option_index);
-		if(ch == -1)
-			break;
-		switch (ch) {
-			case 'v':
-				verbose=1;
-				break;
-			case 'h':
-			default:
-				print_usage(argv[0]);
-				exit(-1);
-		}
-	}
-	//i=argc-optind;
-	if((argc-optind)<1) {
-		print_usage(argv[0]);
-		error(-1, errno, "Error: need cmd");
-	}
-	for(i=0;i<CMDS_AMOUNT;i++) {
-		if(!strcmp(argv[optind], cmd_data[i].str))
-			cmd=i;
-	}
-	if(!cmd) {
-		print_usage(argv[0]);
-		error(-1, errno, "Error: bad cmd %s", argv[optind]);
-	}
-	optind++;
-	if((argc-optind)<cmd_data[cmd].min_arg) {
-		print_usage(argv[0]);
-		error(-1, errno, "Error: too few arguments");
-	}
-	if((argc-optind)>cmd_data[cmd].max_arg) {
-		print_usage(argv[0]);
-		error(-1, errno, "Error: too many arguments");
-	}
-	switch(cmd) {
-	case CMD_GPIO_GET:
-	case CMD_GPIO_SET:
-	case CMD_SH_SET:
-		gpio_init();
-		break;
-	case CMD_SMBUS_READ:
-	case CMD_SMBUS_WRITE:
-		addr=strtol(argv[optind],NULL,16);
-		optind++;
-		if(verbose)
-			printf("Open I2C device %s\n", DEV_I2C);
-		fd = open(DEV_I2C, O_RDWR);
-		if(fd < 0)
-			error(-1, errno, "could not open %s", DEV_I2C);
-		if(verbose)
-			printf("Set I2C addr=%02x\n", addr);
-		if(ioctl(fd, I2C_SLAVE, addr) < 0) {
-			error(0, errno, "could not set address %x for i2c chip", addr);
-			close(fd);
-			return -1;
-		}
-		break;
-	case CMD_SX9512_BUTTON:
-	case CMD_SX9512_READ:
-	case CMD_SX9512_INIT:
-	case CMD_SX9512_NVM_LOAD:
-	case CMD_SX9512_NVM_STORE:
-	case CMD_SX9512_RESET:
-		if((fd=sx9512_init(DEV_I2C, SX9512_I2C_ADDRESS, NULL))<0)
-			error(-1, errno, "could not init SX9512");
-		break;
-	default:
-		break;
-	}
-
-	switch(cmd) {
-	case CMD_GPIO_GET:
-		pin=strtol(argv[optind],0,0);
-		if(verbose)
-			printf("Get gpio %d state\n", pin);
-		r=gpio_get_state(pin);
-		if(verbose)
-			printf("state=%d\n", r);
-		return(r);
-	case CMD_GPIO_SET:
-		pin=strtol(argv[optind],0,0);
-		optind++;
-		state=strtol(argv[optind],0,0);
-		if(state!=0 && state!=1) {
-			print_usage(argv[0]);
-			error(-1, errno, "Error: bad state %d", state);
-		}
-		if(verbose)
-			printf("Set gpio %d state to %d\n", pin, state);
-		gpio_set_state(pin, state);
-		break;
-	case CMD_SH_SET:
-		pin_clk=strtol(argv[optind],NULL,0);
-		optind++;
-		pin_dat=strtol(argv[optind],NULL,0);
-		optind++;
-		pin_mask=strtol(argv[optind],NULL,0);
-		optind++;
-		s=strtol(argv[optind],NULL,0);
-		optind++;
-		state=strtol(argv[optind],NULL,16);
-		if(verbose)
-			printf("Set shift register (clk=%d, dat=%d, mask=%d, size=%d) state to %X\n", pin_clk, pin_dat, pin_mask, s, state);
-		gpio_shift_register_init(&p, pin_clk, pin_dat, pin_mask, s);
-		gpio_shift_register_set(&p, state);
-		break;
-	case CMD_SMBUS_READ:
-		s=strtol(argv[optind],NULL,16);
-		optind++;
-		n=strtol(argv[optind],NULL,0);
-		if(s+n>256)
-			n=256-s;
-		if(verbose)
-			printf("smbus read start (addr=%02x, reg=%02x, len=%d)\n", addr, s, n);
-		for(i=s; i<(s+n); i+=32) {
-			l=n-(i-s);
-			if(l>32)
-				l=32;
-			if(verbose)
-				printf("smbus read (reg=%02x, len=%d)\n", i, l);
-			r=i2c_smbus_read_i2c_block_data(fd, i, l, (__u8 *)&tmp);
-			if(r<0) {
-				error(0, errno, "I2C read error (%d)", r);
-				close(fd);
-				return(-1);
-			}
-			printf("%02X:", i/32);
-			for(j=0; j<l; j++)
-				printf("%02x", tmp[j]);
-			printf("\n");
-		}
-		close(fd);
-		if(n==1)
-			return(tmp[0]);
-		break;
-	case CMD_SMBUS_WRITE:
-		s=strtol(argv[optind],NULL,16);
-		optind++;
-		str_value = argv[optind];
-		n=strlen(str_value);
-		if(n%2)
-			error(-1, errno, "Error: odd length hex value %s", str_value);
-		n>>=1;
-		if(s+n>256)
-			n=256-s;
-		if(verbose)
-			printf("smbus write start (addr=%02x, reg=%02x, len=%d, val=%s)\n", addr, s, n, str_value);
-		for(i=0; i<n; i+=32) {
-			l=n-i;
-			if(l>32)
-				l=32;
-			str_hex[2]=0;
-			for(j=0; j<l; j++) {
-				str_hex[0]=str_value[(i+j)<<1];
-				str_hex[1]=str_value[((i+j)<<1)+1];
-				tmp[j]=strtol(str_hex, &eptr,16);
-				if((errno != 0 && tmp[j] == 0) || eptr==str_hex)
-					error(-1, errno, "hex conversion error at %d (%s)", j, str_hex);
-			}
-			if(verbose)
-				printf("smbus write (reg=%02x, len=%d, val=%.*s)\n", s+i, l, l*2, str_value+(i*2));
-			r=i2c_smbus_write_i2c_block_data(fd, s+i, l, tmp);
-			if(r<0) {
-				error(0, errno, "I2C write error (%d)", r);
-				close(fd);
-				return(-1);
-			}
-			printf("%02X:", i/32);
-			for(j=0; j<l; j++)
-				printf("%02x ", tmp[j]);
-			printf("\n");
-		}
-		close(fd);
-		break;
-	case CMD_SX9512_BUTTON:
-		while(1) {
-			if(verbose)
-				printf("Start reading buttons from SX9512\n");
-			struct sx9512_touch_state touch_state;
-			if(sx9512_read_status_cached(fd, &touch_state))
-				error(-1, errno, "I2C read error");
-			//printf("[state %02X]\n", touch_state.state);
-			if(touch_state.touched)
-				printf("[touch %02X]\n", touch_state.touched);
-			if(touch_state.released)
-				printf("[release %02X]\n", touch_state.released);
-			fflush(stdout);
-			sleep(1);
-		}
-		break;
-	case CMD_SX9512_READ:
-		if(verbose)
-			printf("Read SX9512 registers (and compare to defaults)\n");
-		sx9512_reg_nvm_init_defaults(&nvm_def, 0xff, 0xff);
-		if(sx9512_reg_nvm_read(fd, &nvm))
-			error(-1, errno, "while reading nvm registers");
-		s=sizeof(nvm);
-		for(i=0; i<s; i++)
-			printf("%02x: %02x (%02x)0 %s\n", SX9512_REG_NVM_AREA_START+i, ((uint8_t *)&nvm)[i], ((uint8_t *)&nvm_def)[i], sx9512_reg_name(SX9512_REG_NVM_AREA_START+i));
-		break;
-	case CMD_SX9512_INIT:
-		if((argc-optind)==1)
-			devcfg = sx9512_devcfg_str_to_id(argv[optind]);
-		switch(devcfg) {
-		case SX9512_DEVCFG_DEFAULT:
-			sx9512_reg_nvm_init_defaults(&nvm, 0xff, 0xff);
-			break;
-		case SX9512_DEVCFG_CLEAR:
-			memset(&nvm, 0, sizeof(nvm));
-			break;
-		case SX9512_DEVCFG_CG300:
-			sx9512_reg_nvm_init_cg300(&nvm);
-			break;
-		case SX9512_DEVCFG_CG301:
-			sx9512_reg_nvm_init_cg301(&nvm);
-			break;
-		case SX9512_DEVCFG_EG300:
-			sx9512_reg_nvm_init_eg300(&nvm);
-			break;
-		case SX9512_DEVCFG_DG400:
-			sx9512_reg_nvm_init_dg400(&nvm);
-			break;
-		default:
-			fprintf(stderr, "Error: bad device arg, valid options are:\n");
-			for(i=0;i<SX9512_DEVCFG_AMOUNT;i++)
-				fprintf(stderr, "%s ", sx9512_devcfg_str[i]);
-			fprintf(stderr, "\n");
-			return -1;
-		}
-		if(verbose)
-			printf("Init SX9512 registers to %s\n", sx9512_devcfg_str[devcfg]);
-		if(sx9512_reg_nvm_write(fd, &nvm))
-			error(-1, errno, "while writing nvm registers");
-		break;
-	case CMD_SX9512_NVM_LOAD:
-		if(sx9512_reg_nvm_load(fd))
-			error(-1, errno, "while loading nvm registers");
-		break;
-	case CMD_SX9512_NVM_STORE:
-		if(sx9512_reg_nvm_store(fd))
-			error(-1, errno, "while storing nvm registers");
-		break;
-	case CMD_SX9512_RESET:
-		if(sx9512_reset(fd))
-			error(-1, errno, "while trying to reset");
-		break;
-	default:
-		break;
-	}
-	fflush(stdout);
-	return 0;
-}
diff --git a/peripheral_manager/src/src/i2c.c b/peripheral_manager/src/src/i2c.c
deleted file mode 100644
index db1e813b9051a11eba2c9a5928dc969a2bb90bc1..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/i2c.c
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <string.h>
-#include <syslog.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-
-#include "smbus.h"
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-
-#include "i2c.h"
-#include "log.h"
-
-void dump_i2c(int fd,int start,int stop)
-{
-	int i;
-	int res;
-
-	for (i=start ; i < stop; i++) {
-		res = i2c_smbus_read_byte_data(fd,i);
-		if (res < 0){perror("i2c error\n");}
-		DBG(1,"/dev/i2c-0 READ %d = 0x%02x\n",i,(unsigned char)res);
-	}
-}
-
-int i2c_open_dev (const char *bus, int addr, unsigned long funcs_needed)
-{
-	int fd = open(bus, O_RDWR);
-	if (fd < 0) {
-		syslog(LOG_INFO,"%s: could not open %s\n",__func__, bus);
-		return -1;
-	}
-	if (ioctl(fd, I2C_SLAVE, addr) < 0) {
-		syslog(LOG_INFO,"%s: could not set address %x for i2c chip\n",
-		       __func__, addr);
-error:
-		close (fd);
-		return -1;
-	}
-	if(funcs_needed) {
-		unsigned long funcs;
-		if (ioctl(fd, I2C_FUNCS, &funcs) < 0) {
-			syslog(LOG_INFO,"%s: could not get I2C_FUNCS\n",__func__);
-			goto error;
-		}
-		if((funcs & funcs_needed) != funcs_needed) {
-			syslog(LOG_INFO,"%s: lacking I2C capabilities, have %lx, need %lx\n",
-			       __func__, funcs, funcs_needed);
-			goto error;
-		}
-	}
-	return fd;
-}
diff --git a/peripheral_manager/src/src/i2c.h b/peripheral_manager/src/src/i2c.h
deleted file mode 100644
index 85ea5a6b50d43faeff301060bec58f664435a567..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/i2c.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef I2C_H
-#define I2C_H
-
-void dump_i2c(int fd,int start,int stop);
-int i2c_open_dev (const char *bus, int addr, unsigned long functions_needed);
-
-#endif
diff --git a/peripheral_manager/src/src/led.c b/peripheral_manager/src/src/led.c
deleted file mode 100644
index d59d4b8fee6ec85aded8b4334097056b2bfcf1d2..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/led.c
+++ /dev/null
@@ -1,934 +0,0 @@
-#include <ctype.h>
-#include <syslog.h>
-#include "log.h"
-#include "led.h"
-
-static struct blob_buf bblob;
-
-typedef enum {
-    LED_OFF,
-    LED_OK,
-    LED_EOK,
-    LED_NOTICE,
-    LED_ALERT,
-    LED_ERROR,
-    LED_CUSTOM,
-    LED_ACTION_MAX,
-} led_action_t;
-
-typedef enum {
-    LEDS_NORMAL,
-    LEDS_PROXIMITY,
-    LEDS_SILENT,
-    LEDS_INFO,
-    LEDS_TEST,
-    LEDS_PROD,
-    LEDS_RESET,
-    LEDS_ALLON,
-    LEDS_ALLOFF,
-    LEDS_MAX,
-} leds_state_t;
-
-/* Names for led_action_t */
-static const char * const fn_actions[LED_ACTION_MAX] =
-{ "off", "ok", "eok", "notice", "alert", "error", "custom"};
-
-/* Names for led_state_t */
-static const char* const led_states[LED_STATES_MAX] =
-{ "off", "on", "flash_slow", "flash_fast","pulsing", "fadeon", "fadeoff" };
-
-/* Names for leds_state_t */
-static const char* const leds_states[LEDS_MAX] =
-{ "normal", "proximity", "silent", "info", "test", "production", "reset", "allon" , "alloff"};
-
-/* lowest level, contain states, timers,pointer to driver for a single physical led.*/
-struct led {
-	struct list_head list;
-	led_state_t state;		/* state that this led should have, set from the config file */
-	struct led_drv *drv;
-};
-
-struct super_functions {
-	struct list_head list;
-	led_action_t state;		/* state that the function need to match */
-	struct function_led *function;
-};
-
-struct super_list {
-	struct list_head list;
-	struct list_head sf_list;	/* this list contains states that needs to match for this super fuction action to be active */
-};
-
-/*middle layer contains lists of leds /buttons/... that should be set to a specific state */
-struct function_action {
-	const char *name;		/* If name is set this led action is in use by the board. */
-	struct list_head led_list;
-	struct list_head button_list;
-	struct list_head super_list;    /* list of super function lists */
-};
-
-/* main struct for the function leds.*/
-struct function_led {
-	const char *name;		/* If name is set this led function is in use by the board.        */
-	led_action_t state;		/* state of the function led. contain what action is currently set */
-	int dimming;			/* should this led be dimmed */
-	int brightness;			/* Brightness of the led */
-	int timeout;			/* if time is after */
-	int press_indicator;		/* record if this is part of press indictor */
-	struct function_action actions[LED_ACTION_MAX];
-};
-
-struct function_led *leds;		/* Array of functions, LED_FUNCTIONS + super_functions */
-static int total_functions;		/* number of entries in leds array */
-
-static leds_state_t	global_state;	/* global state for the leds,overrids individual states */
-static press_t		press_state;	/* global state for the press indicator */
-
-static led_action_t dimming_level;	/* The min level where dimming should not happen on led */
-static int dimming_timeout;		/* The time to turn on leds when we have dimming on     */
-static int dimming_count;		/* as long as this is not zero show all leds */
-
-#define FLASH_TIMEOUT 250		/* this is the delay for the update loop. 4 times a second */
-#define FLASH_HZ (1000/FLASH_TIMEOUT)
-
-int get_index_by_name(const char *const*array, int max, const char *name);
-int get_index_for_function(const char *name);
-struct led_drv *get_drv_led(char *name);
-static void dump_drv_list(void);
-static void dump_led(void);
-static void all_leds_off(void);
-static void all_leds_on(void);
-static void all_leds(led_state_t state);
-static const char * get_function_action( const char *s, struct function_led **function, int *action);
-static void super_update(void);
-
-/* we find out the index for a match in an array of char pointers containing max number of pointers */
-int get_index_by_name(const char *const*array, int max, const char *name)
-{
-	int i;
-	for (i=0; i < max ; i++ ){
-		if (!strcasecmp(name, array[i]))
-			return i;
-	}
-	return -1;
-}
-
-int get_index_for_function(const char *name)
-{
-	int i;
-	for (i=0 ; i < total_functions; i++) {
-		if (!strcasecmp(name, leds[i].name))
-			return i;
-	}
-	return -1;
-}
-
-/* PUT every led from drivers into a list */
-struct drv_led_list{
-	struct list_head list;
-	struct led_drv *drv;
-};
-LIST_HEAD(drv_leds_list);
-
-void led_add( struct led_drv *drv)
-{
-	struct drv_led_list *drv_node = malloc(sizeof(struct drv_led_list));
-
-	DBG(1,"called with led name [%s]", drv->name);
-	drv_node->drv = drv;
-
-	list_add(&drv_node->list, &drv_leds_list);
-}
-
-static void all_leds(led_state_t state) {
-	struct drv_led_list *node;
-	DBG(1, "set to state %d",state);
-
-	list_for_each_entry(node, &drv_leds_list, list) {
-		node->drv->func->set_state( node->drv, state);
-	}
-}
-
-static void all_leds_off(void) {
-	all_leds(OFF);
-}
-
-static void all_leds_on(void) {
-	all_leds(ON);
-}
-
-#define TEST_TIMEOUT 250
-static void test_handler(struct uloop_timeout *timeout);
-static struct uloop_timeout test_inform_timer = { .cb = test_handler };
-
-static void test_handler(struct uloop_timeout *timeout) {
-
-	static int cnt = 0;
-	static led_state_t state = OFF;
-
-	static struct drv_led_list *led;
-	DBG(1,"cnt = %d state %d",cnt,state);
-
-	/* flash all leads 2 times.*/
-	if ( cnt < 4) {
-		cnt++;
-		if (state == OFF){
-			all_leds_on();
-			state = ON;
-		}else{
-			all_leds_off();
-			state = OFF;
-		}
-		goto done;
-	}
-
-	if (global_state == LEDS_RESET){
-		cnt = 0;
-		goto done;
-	}
-
-	/* cycle through every led once */
-	if (cnt == 4 ) {
-		cnt++;
-		led = list_first_entry(&drv_leds_list, struct drv_led_list, list );
-	}
-	if (cnt == 5 ) {
-		if (state == OFF){
-			led->drv->func->set_state(led->drv, ON);
-			state = ON;
-		}else{
-			led->drv->func->set_state(led->drv, OFF);
-			/* was this the last led ? if so stop */
-			if ( list_is_last(&led->list, &drv_leds_list) ){
-				cnt = 0;
-				state = OFF;
-				goto done;
-			}else{ /* nope more leds in list. get next and turn it on */
-				led = (struct drv_led_list *)led->list.next;
-				led->drv->func->set_state(led->drv, ON);
-				state = ON;
-			}
-		}
-	}
-done:
-
-    if (global_state == LEDS_TEST || global_state == LEDS_RESET)
-	    uloop_timeout_set(&test_inform_timer, TEST_TIMEOUT);
-    else{
-	    cnt = 0;
-	    state = OFF;
-    }
-}
-
-/* go over the driver list for any led name that matches name and returna pointer to driver. */
-struct led_drv *get_drv_led(char *name)
-{
-	struct list_head *i;
-	list_for_each(i, &drv_leds_list) {
-		struct drv_led_list *node = list_entry(i, struct drv_led_list, list);
-		if (!strcmp(node->drv->name, name))
-			return node->drv;
-	}
-	return NULL;
-}
-
-static void dump_drv_list(void)
-{
-	struct list_head *i;
-	list_for_each(i, &drv_leds_list) {
-		struct drv_led_list *node = list_entry(i, struct drv_led_list, list);
-		DBG(1,"led name = [%s]",node->drv->name);
-	}
-}
-
-static void dump_led(void)
-{
-	int i,j;
-	for (i = 0; i < total_functions ; i++) {
-		for (j = 0 ; j < LED_ACTION_MAX; j++ ) {
-			if ( leds[i].actions[j].name != NULL ) {
-				struct led *led;
-				struct super_list *sl;
-
-				/* print out action list */
-				list_for_each_entry(led, &leds[i].actions[j].led_list, list) {
-					DBG(1,"%-15s %-8s %-15s %-10s",
-					    leds[i].name,
-					    leds[i].actions[j].name,
-					    led->drv->name,
-					    led_states[led->state]);
-				}
-				/* print out super function list */
-				list_for_each_entry(sl, &leds[i].actions[j].super_list, list) {
-					struct super_functions *sf;
-					DBG(1,"   AND list");
-					list_for_each_entry(sf, &sl->sf_list, list) {
-						DBG(1,"\tfunction [%s] action [%s]",sf->function->name, fn_actions[sf->state]);
-					}
-				}
-			}
-		}
-	}
-}
-
-/* loop over every function, if it is a super function update the state */
-static void super_update(void)
-{
-	int i,j;
-	for (i = 0; i < total_functions ; i++) {
-		for (j = 0 ; j < LED_ACTION_MAX; j++ ) {
-			if ( leds[i].actions[j].name != NULL ) {
-				struct super_list *sl;
-				list_for_each_entry(sl, &leds[i].actions[j].super_list, list) {
-					struct super_functions *sf;
-					int status = 0;
-//					DBG(1,"   AND list");
-					list_for_each_entry(sf, &sl->sf_list, list) {
-//						DBG(1,"\tfunction [%s] action [%s]",sf->function->name, fn_actions[sf->state]);
-						if (sf->function->state == sf->state ) {
-							status = 1;
-						} else {
-							status = 0;
-							break;
-						}
-					}
-					if (status){
-						leds[i].state = j;
-						DBG(3,"\tSet super function [%s] to action [%s]",leds[i].name, fn_actions[j]);
-					}
-				}
-			}
-		}
-	}
-}
-
-/* return 0 = OK, -1 = error */
-static int set_function_led(const char* fn_name, const char* action) {
-	int led_idx = get_index_for_function(fn_name);
-	int act_idx = get_index_by_name(fn_actions   , LED_ACTION_MAX, action );
-	struct led *led;
-
-	if(led_idx == -1) {
-		syslog(LOG_WARNING, "called over ubus with non valid led name [%s]", fn_name);
-		return -1;
-	}
-	if(act_idx == -1) {
-		syslog(LOG_WARNING, "called over ubus with non valid action [%s] for led [%s]", action, fn_name);
-		return -1;
-	}
-
-	leds[led_idx].state = act_idx;
-
-	list_for_each_entry(led, &leds[led_idx].actions[act_idx].led_list, list) {
-		if (led->drv){
-			led->drv->func->set_state(led->drv, led->state);
-		}
-	}
-
-	return 0;
-}
-
-static int brightness_function_led(const char* fn_name, int brightness) {
-	int led_idx = get_index_for_function(fn_name);
-	struct led *led;
-
-	if(led_idx == -1) {
-		syslog(LOG_WARNING, "called over ubus with non valid led name [%s]", fn_name);
-		return -1;
-	}
-
-	leds[led_idx].brightness = brightness;
-
-	list_for_each_entry(led, &leds[led_idx].actions[ leds[led_idx].state ].led_list, list) {
-		if (led->drv){
-			if (led->drv->func->set_brightness){
-				led->drv->func->set_brightness(led->drv, brightness);
-			}
-		}
-	}
-
-	return 0;
-}
-
-static int timeout_function_led(const char* fn_name, int timeout) {
-	int led_idx = get_index_for_function(fn_name);
-
-	if(led_idx == -1) {
-		syslog(LOG_WARNING, "called over ubus with non valid led name [%s]", fn_name);
-		return -1;
-	}
-
-	/* store timeout as number of passes on the flash loop */
-	/* in the loop decrement the timeout */
-	leds[led_idx].timeout = FLASH_HZ * timeout;
-
-	return 0;
-}
-
-enum {
-	LED_STATE,
-	LED_BRIGHTNESS,
-	LED_TIMEOUT,
-	__LED_MAX
-};
-
-static const struct blobmsg_policy led_policy[] = {
-	[LED_STATE] = { .name = "state", .type = BLOBMSG_TYPE_STRING },
-	[LED_BRIGHTNESS] = { .name = "brightness", .type = BLOBMSG_TYPE_INT32 },
-	[LED_TIMEOUT] = { .name = "timeout", .type = BLOBMSG_TYPE_INT32 },
-};
-
-static int led_set_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                          struct ubus_request_data *req, const char *method,
-                          struct blob_attr *msg)
-{
-	struct blob_attr *tb[__LED_MAX];
-	char* state;
-	int number;
-	char *fn_name = strchr(obj->name, '.') + 1;
-
-	blobmsg_parse(led_policy, ARRAY_SIZE(led_policy), tb, blob_data(msg), blob_len(msg));
-	if (tb[LED_STATE]) {
-		state = blobmsg_data(tb[LED_STATE]);
-		DBG(1,"set led [%s]->[%s]", fn_name, state);
-		if (set_function_led(fn_name, state) ){
-			return UBUS_STATUS_NO_DATA;
-		}
-	}
-
-	if (tb[LED_BRIGHTNESS]) {
-		number = blobmsg_get_u32(tb[LED_BRIGHTNESS]);
-		DBG(1,"set brightness [%s]->[%x]", fn_name, number);
-		if (brightness_function_led(fn_name, number) ){
-			return UBUS_STATUS_NO_DATA;
-		}
-	}
-
-	if (tb[LED_TIMEOUT]) {
-		number = blobmsg_get_u32(tb[LED_TIMEOUT]);
-		DBG(1,"set timeout [%s]->[%x]", fn_name, number);
-		timeout_function_led(fn_name, number);
-	} else // remove timeout
-		 timeout_function_led(fn_name, 0);
-
-	return 0;
-}
-
-static int led_status_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                             struct ubus_request_data *req, const char *method,
-                             struct blob_attr *msg)
-{
-	char *fn_name = strchr(obj->name, '.') + 1;
-	int led_idx = get_index_for_function(fn_name);
-	DBG(1,"for led %s",leds[led_idx].name);
-
-	blob_buf_init (&bblob, 0);
-	blobmsg_add_string(&bblob, "state",fn_actions[leds[led_idx].state]);
-	blobmsg_add_u32(&bblob, "brightness",leds[led_idx].brightness);
-	ubus_send_reply(ubus_ctx, req, bblob.head);
-
-	return 0;
-}
-
-static int leds_set_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                           struct ubus_request_data *req, const char *method,
-                           struct blob_attr *msg)
-{
-	struct blob_attr *tb[__LED_MAX];
-
-	blobmsg_parse(led_policy, ARRAY_SIZE(led_policy), tb, blob_data(msg), blob_len(msg));
-
-	if (tb[LED_STATE]) {
-		char* state;
-		int state_idx;
-
-		state = blobmsg_data(tb[LED_STATE]);
-		state_idx = get_index_by_name(leds_states, LEDS_MAX , state);
-
-		if (state_idx == -1) {
-			syslog(LOG_WARNING, "leds_set_method: Unknown state %s.", state);
-			return 0;
-		}
-
-		global_state = state_idx;
-
-		if (global_state == LEDS_INFO) {
-			all_leds_off();
-		}
-
-		if (global_state == LEDS_PROD) {
-			all_leds_off();
-		}
-
-		if (global_state == LEDS_TEST || global_state == LEDS_RESET) {
-			all_leds_off();
-			uloop_timeout_set(&test_inform_timer, TEST_TIMEOUT);
-		}
-		if (global_state == LEDS_ALLON) {
-			all_leds_on();
-		}
-		if (global_state == LEDS_ALLOFF) {
-			all_leds_off();
-		}
-
-		DBG(1,"led global state set to [%s] wanted [%s]", leds_states[global_state], state);
-	}else
-		syslog(LOG_WARNING, "Unknown attribute [%s]", (char *)blob_data(msg));
-
-	return 0;
-}
-
-static int leds_status_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                              struct ubus_request_data *req, const char *method,
-                              struct blob_attr *msg)
-{
-
-	blob_buf_init (&bblob, 0);
-	blobmsg_add_string(&bblob, "state", leds_states[global_state]);
-	DBG(1,"leds global state is [%s]",leds_states[global_state]);
-	ubus_send_reply(ubus_ctx, req, bblob.head);
-	return 0;
-}
-
-static const struct ubus_method led_methods[] = {
-	UBUS_METHOD("set", led_set_method, led_policy),
-	{ .name = "status", .handler = led_status_method },
-};
-
-static struct ubus_object_type led_object_type =
-	UBUS_OBJECT_TYPE("led", led_methods);
-
-static const struct ubus_method leds_methods[] = {
-	UBUS_METHOD("set", leds_set_method, led_policy),
-	{ .name = "status", .handler = leds_status_method },
-//    { .name = "proximity", .handler = leds_proximity_method },
-};
-
-static struct ubus_object_type leds_object_type =
-	UBUS_OBJECT_TYPE("leds", leds_methods);
-
-#define LED_OBJECTS 1
-static struct ubus_object led_objects[LED_OBJECTS] = {
-    { .name = "leds",	        .type = &leds_object_type, .methods = leds_methods, .n_methods = ARRAY_SIZE(leds_methods), },
-};
-
-static void flash_handler(struct uloop_timeout *timeout);
-static struct uloop_timeout flash_inform_timer = { .cb = flash_handler };
-
-static void flash_handler(struct uloop_timeout *timeout)
-{
-	static int counter = 1; /* bit 0 is fast flash bit 2 is slow flash */
-	int i;
-	led_state_t slow=OFF,fast=OFF;
-	counter++;
-
-	/* count down dimming to zero */
-	if (dimming_count)
-		dimming_count--;
-
-	if (counter & 1 )
-		fast = ON;
-	if (counter & 4 )
-		slow = ON;
-
-	super_update();
-
-	if (global_state == LEDS_NORMAL ||
-	    global_state == LEDS_INFO ) {
-		for (i = 0; i < total_functions ; i++) {
-			struct led *led;
-			if (leds[i].press_indicator && (press_state != PRESS_NONE) ) {
-//				DBG(1,"INDICATE_PRESS on %s",leds[i].name);
-				list_for_each_entry(led, &leds[i].actions[leds[i].state].led_list, list) {
-					if (led->drv){
-						if (press_state == PRESS_LONG)
-							led->drv->func->set_state(led->drv, ON);
-						else
-							led->drv->func->set_state(led->drv, fast);
-					}
-				}
-
-				/* normal operation, flash else reset state */
-			} else {
-				led_action_t action_state = leds[i].state;
-
-				/* in case of info mode suppress OK state. that is if OK -> turn it into OFF */
-				if (global_state == LEDS_INFO) {
-					if (action_state == LED_OK)
-						action_state = LED_OFF;
-				}
-
-				/* is this function dimmed ? */
-				if (leds[i].dimming) {
-					/* if timer is not active we should dimm */
-					if (!dimming_count){
-						if (action_state < dimming_level)
-							action_state = LED_OFF;
-					}
-				}
-
-				/* is there a timeout on this led ?*/
-				if (leds[i].timeout) {
-					leds[i].timeout--;
-					/* if it has timedout set state to OFF */
-					if (! leds[i].timeout) {
-						leds[i].state  = LED_OFF;
-					}
-				}
-
-				list_for_each_entry(led, &leds[i].actions[action_state].led_list, list) {
-
-					if (led->state == FLASH_FAST) {
-						if (led->drv) {
-							if (led->drv->func->support) {
-								if (led->drv->func->support(led->drv, FLASH_FAST)) {
-									/* hardware support flash */
-									led->drv->func->set_state(led->drv, FLASH_FAST);
-									continue;
-								}
-							}
-							/* emulate flash with on/off */
-							led->drv->func->set_state(led->drv, fast);
-						}
-					}else if (led->state == FLASH_SLOW) {
-						if (led->drv) {
-							if (led->drv->func->support) {
-								if (led->drv->func->support(led->drv, FLASH_SLOW)) {
-									/* hardware support flash */
-									led->drv->func->set_state(led->drv, FLASH_SLOW);
-									continue;
-								}
-							}
-							/* emulate flash with on/off */
-							led->drv->func->set_state(led->drv, slow);
-						}
-					}else{
-						if (led->drv)
-							led->drv->func->set_state(led->drv, led->state);
-					}
-				}
-			}
-		}
-	}
-	uloop_timeout_set(&flash_inform_timer, FLASH_TIMEOUT);
-}
-
-void led_pressindicator_set(press_t type){
-
-	/* press long has prio over short so if it's already set to long do not change */
-	if (type == PRESS_SHORT && press_state == PRESS_LONG)
-		return;
-
-	press_state = type;
-}
-
-void led_dimming(void){
-
-	/* we resuse the flash timer and decrement dimmming_count on every loop */
-	/* set the intial value so that we get the correct timeout */
-	dimming_count = dimming_timeout * (1000/FLASH_TIMEOUT);
-}
-
-/*
-  input: s, string of comma separated function_action names, 'wifi_ok, wps_ok'
-
-  return:
-	NULL if no valid function actionpair found.
-	pointer to start of unused part of string.
-
-	fills in the function pointer with NULL or a real function
-	fills in action with 0 or real index (include 0),
-
-*/
-const char * get_function_action( const char *s, struct function_led **function, int *action)
-{
-	const char *first, *last, *end, *p;
-	char func[100], act[20];
-
-	DBG(1,"start [%s]", s);
-
-	*function = NULL;
-	*action = 0;
-
-	/* if string is zero length give up. */
-	if ( 0 == strlen(s))
-		return NULL;
-
-	end = s + strlen(s);
-
-	/* find first alpha char */
-	while (!isalnum(*s)){
-		s++;
-		if (s == end)
-			return NULL;
-	}
-	first = s;
-
-	/* find , or end of string or space/tab */
-	while ( (*s != ',') && (!isblank(*s))) {
-		s++;
-		if (s == end)
-			break;
-	}
-	last = s;
-
-	/* scan backwards for _ */
-	while (*s != '_' && s > first){
-		s--;
-	}
-
-	/* if we could not find a _ char bail out */
-	if (*s != '_')
-		return NULL;
-
-	/* extract function name */
-	p = first;
-	while (p != s) {
-		func[p-first] = *p;
-		p++;
-	}
-	func[p-first] = 0;
-
-	/* extract action name */
-	p = s + 1;
-	while (p != last) {
-		act[p-(s+1)] = *p;
-		p++;
-	}
-	act[p-(s+1)] = 0;
-
-	DBG(1,"function[%s] action[%s] func_idx %d", func, act, get_index_for_function(func));
-	*function = &leds[get_index_for_function(func)];
-	*action = get_index_by_name(fn_actions   , LED_ACTION_MAX, act );
-
-	if (*last == ',')
-		last++;
-
-	return last;
-}
-
-/* when this is called all driver leds needs to exist */
-void led_init( struct server_ctx *s_ctx)
-{
-	int i,j;
-	LIST_HEAD(led_map_list);
-	struct ucilist *map_node;
-	const char *s;
-
-	dump_drv_list();
-
-	/* register leds with ubus */
-	for (i=0 ; i<LED_OBJECTS ; i++) {
-		int ret = ubus_add_object(s_ctx->ubus_ctx, &led_objects[i]);
-		if (ret)
-			DBG(1,"Failed to add object: %s", ubus_strerror(ret));
-	}
-
-	/* read out the function leds */
-	ucix_get_option_list( s_ctx->uci_ctx, "hw", "led_map", "functions" , &led_map_list);
-
-	total_functions = 0;
-	list_for_each_entry(map_node, &led_map_list, list) {
-		total_functions++;
-	}
-
-	leds = malloc(sizeof(struct function_led) * total_functions);
-	memset(leds, 0, sizeof(struct function_led) * total_functions);
-
-	/* set function name & regiter with ubus */
-	i = 0;
-	list_for_each_entry(map_node, &led_map_list, list) {
-		char name[100];
-		int ret;
-		struct ubus_object *ubo;
-		ubo = malloc(sizeof(struct ubus_object));
-		memset(ubo, 0, sizeof(struct ubus_object));
-
-		leds[i].name = strdup(map_node->val);
-
-		sprintf(name, "led.%s", leds[i].name);
-		ubo->name      = strdup(name);
-		ubo->methods   = led_methods;
-		ubo->n_methods = ARRAY_SIZE(led_methods);
-		ubo->type      = &led_object_type;
-
-		ret = ubus_add_object(s_ctx->ubus_ctx, ubo);
-		if (ret)
-			DBG(1,"Failed to add object: %s", ubus_strerror(ret));
-		i++;
-	}
-
-	/* we create a top list of led functions */
-	/* that list contains a new list of actions */
-	/* every action contains led actions lists */
-	/* the led states is attached to the drv_leds lists */
-
-	for (i = 0; i < total_functions ; i++) {
-		for (j = 0 ; j < LED_ACTION_MAX; j++ ) {
-			char led_fn_name[256];
-			char led_action[256];
-
-			LIST_HEAD(led_action_list);
-			struct ucilist *node;
-			snprintf(led_fn_name, 256, "led_%s", leds[i].name);
-			snprintf(led_action, 256, "led_action_%s", fn_actions[j]);
-			ucix_get_option_list( s_ctx->uci_ctx, "hw", led_fn_name, led_action , &led_action_list);
-
-			INIT_LIST_HEAD( &leds[i].actions[j].led_list );
-
-			if (!list_empty(&led_action_list)) {
-
-				/* Found led with action, init structs */
-				leds[i].state = LED_OFF;
-				leds[i].brightness = 100;
-
-				leds[i].actions[j].name    = fn_actions[j];
-
-				/* fill in led actions */
-				DBG(2,"%-15s has led actions %s -> ", led_fn_name, fn_actions[j]);
-				list_for_each_entry(node, &led_action_list, list) {
-					char led_name[256],led_state[256];
-					struct led *led;
-					struct led_drv *drv;
-					char *c;
-					s = strdup(node->val);
-					led_name[0]=0;
-					led_state[0]=0;
-
-					/* get pointer to low level led driver. by removing the = sign and
-					   storing the remaining two strings.
-					*/
-					c = strchr(s,'=');
-					if( c == NULL)
-						continue;	/* no = found, abort */
-					*c = ' ';
-
-					sscanf(s, "%s %s", led_name, led_state);
-					drv = get_drv_led(led_name);
-
-					if (drv) {
-						led = malloc(sizeof(struct led));
-						led->drv = drv;
-						led->state = get_index_by_name(led_states, LED_STATES_MAX, led_state);
-						list_add(&led->list, &leds[i].actions[j].led_list);
-					}else {
-						syslog(LOG_ERR,"Config specified use of led name [%s]. But it's not registerd with a led driver.", led_name);
-					}
-					DBG(2, "%-35s%s","",node->val);
-					free((void*)s);
-				}
-
-				/* fill in button actions */
-
-				/* fill in xxx actions */
-			}else {
-				DBG(2,"%-15s has no actions -> %s", led_fn_name, fn_actions[j]);
-			}
-		}
-	}
-
-	/* Read in functions that have function list (super functions) */
-	for (i = 0; i < total_functions ; i++) {
-		for (j = 0 ; j < LED_ACTION_MAX; j++ ) {
-			char led_fn_name[256];
-			char super_action[256];
-			LIST_HEAD(super_action_list);
-			struct ucilist *node;
-			snprintf(led_fn_name, 256, "led_%s", leds[i].name);
-			snprintf(super_action, 256, "super_%s", fn_actions[j]);
-			ucix_get_option_list( s_ctx->uci_ctx, "hw", led_fn_name, super_action , &super_action_list);
-			INIT_LIST_HEAD( &leds[i].actions[j].super_list );
-
-			if (!list_empty(&super_action_list)) {
-				DBG(1,"A:%s %s is a super function ",led_fn_name,super_action);
-
-				list_for_each_entry(node, &super_action_list, list) {
-					struct function_led *function;
-					int action_ix;
-					struct super_list *sl = malloc(sizeof(struct super_list));
-					memset(sl, 0, sizeof(struct super_list));
-					list_add(&sl->list, &leds[i].actions[j].super_list);
-					INIT_LIST_HEAD( &sl->sf_list );
-
-					DBG(1,"add to super list  %s",node->val);
-
-					s = node->val;
-					while ((s = get_function_action(s, &function, &action_ix))){
-						if (function) {
-							struct super_functions *sf = malloc(sizeof(struct super_functions));
-							memset(sf, 0, sizeof(struct super_functions));
-							sf->state = action_ix;
-							sf->function = function;
-							list_add(&sf->list, &sl->sf_list);
-							DBG(1,"C %s %s",function->name, fn_actions[action_ix]);
-						}
-					}
-				}
-			}else
-				DBG(1,"A:%s %s is a normal function ",led_fn_name,super_action);
-		}
-	}
-
-
-	/* setup and read dimming options for led */
-	{
-		struct ucilist *node;
-		LIST_HEAD(dimm_list);
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , "led_map", "dimming_level");
-		dimming_level = LED_OFF;
-		if (s) {
-			DBG(1,"Dimming init");
-			for(i=0 ; i < LED_ACTION_MAX ; i++) {
-				if (! strncasecmp(s, fn_actions[i], strlen(fn_actions[i]))){
-					dimming_level = i;
-				}
-			}
-		}
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , "led_map", "dimming_on");
-		dimming_timeout = 0;
-		if (s) {
-			dimming_timeout = strtol(s, NULL, 0);
-		}
-
-		ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"led_map", "dimming", &dimm_list);
-		list_for_each_entry(node, &dimm_list, list) {
-			int ix;
-			s = node->val;
-			ix = get_index_for_function(s);
-			if (ix != -1){
-				leds[ix].dimming = 1;
-				DBG(1,"dimming on led [%s]", leds[ix].name);
-			}else
-				syslog(LOG_ERR,"dimming Led [%s] don't exist", s);
-		}
-	}
-
-	DBG(1,"Dimming level %s", fn_actions[dimming_level]);
-	DBG(1,"Dimming timeout %d", dimming_timeout);
-
-	{
-		struct ucilist *node;
-		/* read function buttons from section button_map */
-		LIST_HEAD(press_indicator);
-
-		/* read in generic configuration. press indicator listdefault params..... */
-
-		ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"led_map", "press_indicator", &press_indicator);
-		list_for_each_entry(node, &press_indicator, list) {
-			int ix;
-			s = node->val;
-			s +=4;	/*remove 'led_' from string */
-			DBG(1,"press indicator %s [%s]",node->val, s);
-			ix  = get_index_for_function(s);
-//			DBG(1,"press indicator %s [%s]->%d",node->val, s, ix);
-			leds[ix].press_indicator = 1;
-		}
-	}
-	uloop_timeout_set(&flash_inform_timer, FLASH_TIMEOUT);
-
-	dump_led();
-	all_leds_off();
-}
-
diff --git a/peripheral_manager/src/src/led.h b/peripheral_manager/src/src/led.h
deleted file mode 100644
index 66bf29c576bbe9058b3407d581b74393bf9a8adb..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/led.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef LED_H
-#define LED_H
-
-#include "server.h"
-
-typedef enum {
-	OFF,
-	ON,
-	FLASH_SLOW,
-	FLASH_FAST,
-	PULSING,
-	FADEON,
-	FADEOFF,
-	NEED_INIT,		/* set on loading config */
-	LED_STATES_MAX,
-} led_state_t;
-
-typedef enum {
-	NONE,
-	RED,
-	GREEN,
-	BLUE,
-	YELLOW,
-	WHITE,
-} led_color_t;
-
-typedef enum {
-	PRESS_NONE,
-	PRESS_SHORT,
-	PRESS_LONG,
-} press_t;
-
-struct led_drv;
-
-struct led_drv_func{
-	int         (*set_state)(struct led_drv *, led_state_t);	/* Set led state, on,off,flash ...      */
-	led_state_t (*get_state)(struct led_drv *);			/* Get led state, on,off,flash ...	*/
-	int         (*set_color)(struct led_drv *, led_color_t);	/* Set led color			*/
-	led_color_t (*get_color)(struct led_drv *);			/* Get led color			*/
-	int         (*set_brightness)(struct led_drv *, int );		/* Set led brightness			*/
-	int         (*get_brightness)(struct led_drv *);		/* Get led brightness			*/
-	int         (*support)  (struct led_drv *, led_state_t);	/* do driver has hardware support for state */
-};
-
-struct led_drv {
-	const char *name;		/* name, set in the confg file,has to be uniq	*/
-	void *priv;			/* for use by the driver			*/
-	struct led_drv_func *func;	/* function pointers for controlling the led	*/
-};
-
-void led_add( struct led_drv *);
-void led_init(struct server_ctx *);
-
-void led_dimming(void);
-void led_pressindicator_set(press_t type);
-
-#endif /* LED_H */
diff --git a/peripheral_manager/src/src/log.h b/peripheral_manager/src/src/log.h
deleted file mode 100644
index f4d1c37df0a94397342f1114ec5edde5781dad18..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/log.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef LOG_H
-#define LOG_H
-/* Use this */
-#include <syslog.h>
-
-extern int debug_level;
-
-#define DBG_RAW(...) fprintf( stderr, __VA_ARGS__ );
-#define DBG(level,fmt, args...)							\
-	do {									\
-		if (level <= debug_level)					\
-			syslog( LOG_DEBUG,"%-20s: " fmt , __func__, ##args);	\
-	} while(0)
-
-#endif /* LOG_H */
diff --git a/peripheral_manager/src/src/peripheral_manager.c b/peripheral_manager/src/src/peripheral_manager.c
deleted file mode 100644
index 4521eeddadc9db6aea8e448f540070c052248b5d..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/peripheral_manager.c
+++ /dev/null
@@ -1,179 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <libgen.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <syslog.h>
-#include <config.h>
-#include <getopt.h>
-#include "log.h"
-#include "ucix.h"
-
-#include <libubox/uloop.h>
-#include <libubus.h>
-
-#include "server.h"
-
-int debug_level = 0;
-
-static const char *config_path = "/lib/db/config";
-static const char *config_file = "hw";
-
-static char *ubus_socket;
-
-void catv_monitor_set_socket(char *);
-
-void print_usage(char *prg_name);
-
-void print_usage(char *prg_name) {
-        printf("Usage: %s -h -f\n", prg_name);
-        printf("  Options: \n");
-        printf("      -f, --foreground\tDon't fork off as a daemon.\n");
-        printf("      -d, --debug=NUM\tSet debug level. Higher = more output\n");
-        printf("      -c, --config=FILE\tConfig file to use. default = %s/%s\n", config_path, config_file);
-        printf("      -s, --socket=FILE\tSet the unix domain socket to connect to for ubus\n");
-        printf("      -h\t\tShow this help screen.\n");
-        printf("\n");
-}
-
-int main(int argc, char **argv)
-{
-	int ch;
-	int daemonize = 1;
-	pid_t pid, sid;
-	struct uci_context *uci_ctx = NULL;
-	static struct ubus_context *ubus_ctx = NULL;
-
-	while (1) {
-		int option_index = 0;
-		static struct option long_options[] = {
-                        {"foreground",  no_argument, 0, 'f'},
-                        {"verbose",     no_argument, 0, 'v'},
-                        {"debug", required_argument, 0, 'd'},
-                        {"config",required_argument, 0, 'c'},
-                        {"socket",required_argument, 0, 's'},
-                        {"help",	no_argument, 0, 'h'},
-                        {0, 0, 0, 0}
-                };
-
-                ch = getopt_long(argc, argv, "hvfhd:c:s:",
-                                long_options, &option_index);
-
-		if (ch == -1)
-                        break;
-
-                switch (ch) {
-                case 'f':
-                        daemonize = 0;
-                        break;
-                case 'd':
-                        debug_level = strtol(optarg, 0, 0);
-                        break;
-
-                case 'c':
-			config_file = basename(optarg);
-			config_path = dirname(optarg);
-			break;
-                case 's':
-			ubus_socket = optarg;
-			break;
-
-		case 'h':
-                default:
-			print_usage(argv[0]);
-			exit(0);
-                }
- 	}
-
-	if (optind < argc) {
-		printf("Extra arguments discarded: ");
-		while (optind < argc)
-			printf("%s ", argv[optind++]);
-		printf("\n");
-	}
-
-
-	/* Setup logging */
-	if (daemonize) {
-		setlogmask(LOG_UPTO(LOG_INFO));
-		openlog(PACKAGE, LOG_CONS, LOG_USER);
-
-		syslog(LOG_INFO, "%s daemon starting up", PACKAGE);
-	} else {
-		setlogmask(LOG_UPTO(LOG_DEBUG));
-		openlog(PACKAGE, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
-
-		syslog(LOG_INFO, "%s program starting up", PACKAGE);
-	}
-
-	/* daemonize */
-	if (daemonize) {
-		syslog(LOG_INFO, "starting the daemonizing process");
-
-		/* Fork off the parent process */
-		pid = fork();
-		if (pid < 0) {
-			exit(EXIT_FAILURE);
-		}
-		/* If we got a good PID, then
-		   we can exit the parent process. */
-		if (pid > 0) {
-			exit(EXIT_SUCCESS);
-		}
-
-		/* Change the file mode mask */
-		umask(0);
-
-		/* Create a new SID for the child process */
-		sid = setsid();
-		if (sid < 0) {
-			/* Log the failure */
-			exit(EXIT_FAILURE);
-		}
-
-		/* Change the current working directory */
-		if ((chdir("/")) < 0) {
-			/* Log the failure */
-			exit(EXIT_FAILURE);
-		}
-		/* Close out the standard file descriptors */
-		close(STDIN_FILENO);
-		close(STDOUT_FILENO);
-		close(STDERR_FILENO);
-	}
-
-	/* open configuration file */
-	uci_ctx = ucix_init_path(config_path , config_file, 0 );
-	if (! uci_ctx ) {
-		syslog(LOG_ERR,"Failed to load config file \"%s/%s\"\n", config_path, config_file);
-		exit(1);
-	}
-
-	/* connect to ubus */
-	ubus_ctx = ubus_connect(ubus_socket);
-	if (!ubus_ctx) {
-		syslog(LOG_ERR,"Failed to connect to ubus. Can't continue.\n");
-		exit(EXIT_FAILURE);
-	}
-
-	/* connect ubus handler to ubox evenet loop */
-	if (uloop_init() != 0) {
-		syslog(LOG_ERR,"Could not init event loop, Can't continue.\n");
-		exit(EXIT_FAILURE);
-	}
-	ubus_add_uloop(ubus_ctx);
-
-	catv_monitor_set_socket(ubus_socket);
-
-	server_start(uci_ctx, ubus_ctx);
-
-	ubus_free(ubus_ctx);
-
-	DBG(1,"testing\n");
-	syslog(LOG_INFO, "%s exiting", PACKAGE);
-
-	uloop_done();
-	return 0;
-}
diff --git a/peripheral_manager/src/src/prox_px3220.c b/peripheral_manager/src/src/prox_px3220.c
deleted file mode 100644
index c4ac475f0d453063c5da4698e605ec6706642228..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/prox_px3220.c
+++ /dev/null
@@ -1,196 +0,0 @@
-#include <syslog.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-
-#include <board.h>
-#include "button.h"
-
-#include "smbus.h"
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-#include "ucix.h"
-#include "i2c.h"
-#include "log.h"
-
-#include "gpio.h"
-#include "prox_px3220.h"
-
-/* register names, from page 29, */
-#define PX3220_SYSCONF		0x00
-#define PX3220_IRQ_STATUS	0x01
-#define PX3220_IRQ_CLEAR	0x02
-#define PX3220_IR_DATA_LOW	0x0A
-#define PX3220_IR_DATA_HIGH	0x0B
-#define PX3220_PS_DATA_LOW	0x0E
-#define PX3220_PS_DATA_HIGH	0x0F
-#define PX3220_PS_LOW_THRESH_L	0x2A
-#define PX3220_PS_LOW_THRESH_H	0x2B
-#define PX3220_PS_HIGH_THRESH_L	0x2C
-#define PX3220_PS_HIGH_THRESH_H	0x2D
-
-#define IRQ_BUTTON 33
-
-struct i2c_reg_tab {
-	char addr;
-	char value;
-	char range;  /* if set registers starting from addr to addr+range will be set to the same value */
-};
-
-struct button_data {
-	int addr;
-	int state;
-	struct button_drv button;
-};
-
-static const struct i2c_reg_tab i2c_init_tab_vox25[]={
-        {PX3220_SYSCONF, 	  0x04, 0x00 },      /* Reset */
-        {PX3220_SYSCONF, 	  0x02, 0x00 },      /* Power on IR */
-        {PX3220_IRQ_STATUS,	  0x01, 0x00 },
-        {0x20,           	  0x17, 0x00 },
-        {0x23,           	  0x03, 0x00 },
-        {PX3220_PS_LOW_THRESH_L,  0x00, 0x00 },
-        {PX3220_PS_LOW_THRESH_H,  0x18, 0x00 },
-        {PX3220_PS_HIGH_THRESH_L, 0x00, 0x00 },
-        {PX3220_PS_HIGH_THRESH_H, 0x14, 0x00 },
-};
-
-int dev;
-int shadow_proximity;
-
-void do_init_tab(const struct i2c_reg_tab *tab, int len );
-
-
-void do_init_tab(const struct i2c_reg_tab *tab, int len )
-{
-        int i;
-
-	for (i = 0 ; i < len ; i++){
-		int y;
-		int ret;
-		for ( y = 0 ; y <= tab[i].range; y++ ){
-			DBG(3,"%s: addr %02X = %02X ",__func__,(unsigned char)tab[i].addr+y, (unsigned char)tab[i].value);
-			ret = i2c_smbus_write_byte_data(dev, tab[i].addr+y, tab[i].value);
-			if (ret < 0){
-				perror("write to i2c dev\n");
-			}
-		}
-	}
-
-}
-
-void px3220_check(void)
-{
-        int got_irq;
-	unsigned short reg_low, reg_high, ps_val;
-
-        shadow_proximity = 0;
-        if (dev){
-                got_irq = board_ioctl( BOARD_IOCTL_GET_GPIO, 0, 0, NULL, IRQ_BUTTON, 0);
-
-                /* got_irq is active low */
-                if (!got_irq) {
-                        reg_low = i2c_smbus_read_byte_data(dev, PX3220_PS_DATA_LOW);
-
-                        reg_high = i2c_smbus_read_byte_data(dev, PX3220_PS_DATA_HIGH);
-
-                        ps_val = ((reg_high & 0x3F) << 4) | (reg_low & 0xF);
-
-                        if (ps_val > 0x58)
-                                shadow_proximity |= 0x1;
-                        else
-                                shadow_proximity |= 0x2;
-                }
-        }
-
-        if (shadow_proximity)
-                DBG(1,"shadow_proximity [%x]", shadow_proximity);
-}
-
-static button_state_t px3220_button_get_state(struct button_drv *drv)
-{
- 	struct button_data *p = (struct button_data *)drv->priv;
-
-        if (p->addr == 0 ){
-                if (shadow_proximity & 1 ) {
-                        shadow_proximity &= ~0x1;
-                        return p->state = BUTTON_PRESSED;
-                }
-        }
-
-        if (p->addr == 1 ){
-                if (shadow_proximity & 2 ) {
-                        shadow_proximity &= ~0x2;
-                        return p->state = BUTTON_PRESSED;
-                }
-        }
-
-        p->state = BUTTON_RELEASED;
-        return p->state;
-}
-
-static struct button_drv_func button_func = {
-	.get_state = px3220_button_get_state,
-};
-
-void px3220_init(struct server_ctx *s_ctx) {
-
-	const char *p;
-
-	struct ucilist *node;
-	LIST_HEAD(buttons);
-
-	DBG(1, "");
-
-	p = ucix_get_option(s_ctx->uci_ctx, "hw", "board", "hardware");
-	if (p == 0){
-		syslog(LOG_INFO, "%s: Missing Hardware identifier in configuration. I2C is not started\n",__func__);
-		return;
-	}
-
-        /* Driver only existfor VOX25 board */
-        if (strcmp("VOX25", p))
-		return;
-
-        /* open i2c device */
-        dev = i2c_open_dev("/dev/i2c-0", 0x1E,
-                           I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE);
-        if (dev < 0) {
-		syslog(LOG_INFO,"%s: could not open i2c touch device\n",__func__);
-		dev = 0;
-		return;
-	}
-
-	do_init_tab(i2c_init_tab_vox25, sizeof(i2c_init_tab_vox25)/sizeof(struct i2c_reg_tab));
-
-
-        /* read config file */
-        ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"3220_buttons", "buttons", &buttons);
-	list_for_each_entry(node, &buttons, list) {
-		struct button_data *data;
-		const char *s;
-
-		DBG(1, "value = [%s]",node->val);
-
-		data = malloc(sizeof(struct button_data));
-		memset(data,0,sizeof(struct button_data));
-
-		data->button.name = node->val;
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "addr");
-		DBG(1, "addr = [%s]", s);
-		if (s){
-			data->addr =  strtol(s,0,0);
-		}
-
-		data->button.func = &button_func;
-		data->button.priv = data;
-
-		button_add(&data->button);
-	}
-
-}
-
diff --git a/peripheral_manager/src/src/prox_px3220.h b/peripheral_manager/src/src/prox_px3220.h
deleted file mode 100644
index d709c92c4a5c9a01946045bb705fbb7a5ea10494..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/prox_px3220.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef PROX_PX3220_H
-#define PROX_PX3220_H
-
-#include "server.h"
-
-void px3220_init(struct server_ctx *);
-void px3220_check(void);
-
-#endif /* PROX_PX3220_H */
diff --git a/peripheral_manager/src/src/server.c b/peripheral_manager/src/src/server.c
deleted file mode 100644
index 78410d5f9b6a75d3ad13fd25134f56ece39bfdc8..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/server.c
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "config.h"
-#include <syslog.h>
-#include "log.h"
-#include "server.h"
-#include "led.h"
-#include "button.h"
-#include "catv.h"
-#include "sfp.h"
-#include "touch_sx9512.h"
-#include "prox_px3220.h"
-
-struct server_ctx server;
-
-void sim_led_init(struct server_ctx *);
-void sim_button_init(struct server_ctx *);
-
-void gpio_led_init(struct server_ctx *);
-void gpio_button_init(struct server_ctx *);
-
-void catv_monitor_init(struct server_ctx *);
-void vox_init(struct server_ctx *);
-
-struct catv_handler *catv_h;
-struct sfp_handler *sfp_h;
-
-void server_start(struct uci_context *uci_ctx, struct ubus_context *ubus_ctx)
-
-{
-	DBG(1, "init server context.");
-	server.uci_ctx = uci_ctx;
-	server.ubus_ctx = ubus_ctx;
-
-	DBG(1, "run init function for all hardware drivers.");
-
-	sim_led_init(&server);
-	sim_button_init(&server);
-
-#ifdef HAVE_BOARD_H
-	gpio_led_init(&server);
-	gpio_button_init(&server);
-
-	sx9512_handler_init(&server);
-
-	px3220_init(&server);
-
-	vox_init(&server);
-#endif
-
-	DBG(1, "connect generic buttons/leds to hardware drivers.");
-	led_init(&server);
-	button_init(&server);
-
-	sfp_h = sfp_init(uci_ctx);
-	if (sfp_h) {
-		sfp_ubus_populate(sfp_h, ubus_ctx);
-	}
-
-	catv_h = catv_init(uci_ctx, "/dev/i2c-0", 0x50, 0x51);
-	if (catv_h){
-		catv_ubus_populate(catv_h, ubus_ctx);
-	}
-
-	catv_monitor_init(&server);
-
-	DBG(1, "give control to uloop main loop.");
-	uloop_run();
-}
diff --git a/peripheral_manager/src/src/server.h b/peripheral_manager/src/src/server.h
deleted file mode 100644
index e43cba12d509ce234e4340331222e90f8c911cb7..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/server.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef SERVER_H
-#define SERVER_H
-#include <libubus.h>
-#include "ucix.h"
-
-struct server_ctx {
-	struct uci_context *uci_ctx;
-	struct ubus_context *ubus_ctx;
-};
-
-void server_start( struct uci_context *uci_ctx, struct ubus_context *ubus_ctx);
-
-#endif /* SERVER_H */
diff --git a/peripheral_manager/src/src/sfp.c b/peripheral_manager/src/src/sfp.c
deleted file mode 100644
index 7848000e8a2f55af6c3639382bc496cbf00d4b7e..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/sfp.c
+++ /dev/null
@@ -1,1112 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <math.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-
-#include "smbus.h"
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-
-#include "libubus.h"
-#include <uci_config.h>
-#include <uci.h>
-#include "ucix.h"
-
-#include "i2c.h"
-#include "sfp.h"
-#include "log.h"
-
-//static struct blob_buf b;
-
-struct i2c_sfp {
-        const char *bus;
-        int rom_addr;
-        int ddm_addr;
-        const char *name;
-};
-
-const struct i2c_sfp i2c_sfp_list[] = {
-        { .bus = "/dev/i2c-0",
-          .rom_addr = 0x50,
-          .ddm_addr = 0x51,
-          .name = "EG200"
-        },
-        { .bus = "/dev/i2c-1",
-          .rom_addr = 0x50,
-          .ddm_addr = 0x51,
-          .name = "EG300"
-        },
-};
-
-const struct i2c_sfp *i2c_sfp;
-
-static int sfp_rom_fd = -1;
-static int sfp_ddm_fd = -1;
-
-static int sfp_rom_byte(unsigned addr)
-{
-        int ret;
-        if (!i2c_sfp)
-                return -1;
-
-        if (sfp_rom_fd >= 0) {
-                ret = i2c_smbus_read_byte_data(sfp_rom_fd, addr);
-                if (ret >= 0)
-                        return ret;
-                /* Close and retry */
-                close (sfp_rom_fd);
-                goto open;
-        }
-        if (sfp_rom_fd < 0) {
-        open:
-                sfp_rom_fd = i2c_open_dev(i2c_sfp->bus, i2c_sfp->rom_addr, I2C_FUNC_SMBUS_READ_BYTE);
-                if (sfp_rom_fd < 0)
-                        return -1;
-        }
-        ret = i2c_smbus_read_byte_data(sfp_rom_fd, addr);
-        if (ret < 0) {
-                DBG(1,"%s: i2c_smbus_read_byte_data failed: addr %d", __func__, addr);
-        }
-        return ret;
-};
-
-static int sfp_rom_bytes(unsigned addr, char *p, size_t length)
-{
-        int byte = sfp_rom_byte(addr);
-        unsigned int i;
-        if (byte < 0)
-                return 0;
-        p[0] = byte;
-
-        for (i = 1; i < length; i++) {
-                byte = i2c_smbus_read_byte_data(sfp_rom_fd, addr + i);
-                if (byte < 0)
-                        return 0;
-                p[i] = byte;
-        }
-        return 1;
-}
-
-static int sfp_rom_get_type(struct blob_buf *b)
-{
-        int byte = sfp_rom_byte (0);
-        char buf[20];
-        const char *value;
-
-        if (byte < 0)
-                return 0;
-
-        switch (byte) {
-        case 0:
-                value = "unspecified";
-                break;
-        case 1:
-                value = "GBIC";
-                break;
-        case 2:
-                value = "soldered module/connector";
-                break;
-        case 3:
-                value = "SFP";
-                break;
-        default:
-                snprintf(buf, sizeof(buf), "%s %d",
-                         byte < 0x80 ? "reserved" : "vendor specific",
-                         byte);
-                value = buf;
-                break;
-        }
-
-        blobmsg_add_string(b, "type", value);
-        return 1;
-}
-
-static int sfp_rom_get_type_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                   struct ubus_request_data *req, const char *method,
-                                   struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf ));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_type(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-static int sfp_rom_get_connector(struct blob_buf *b)
-{
-        int byte = sfp_rom_byte (2);
-        char buf[20];
-
-        const char *value;
-
-        if (byte < 0)
-                return 0;
-
-        switch (byte) {
-        case 0:
-                value = "Unspecified";
-                break;
-        case 1:
-                value = "SC";
-                break;
-        case 2:
-                value = "Fiber Channel style 1";
-                break;
-        case 3:
-                value = "Fiber Channel style 2";
-                break;
-        case 4:
-                value = "TNC/BNC";
-                break;
-        case 5:
-                value = "Fiber Channel coaxial";
-                break;
-        case 6:
-                value = "FiberJack";
-                break;
-        case 7:
-                value = "LC";
-                break;
-        case 8:
-                value = "MT-RJ";
-                break;
-        case 9:
-                value = "MU";
-                break;
-        case 10:
-                value = "SG";
-                break;
-        case 11:
-                value = "Optical pigtail";
-                break;
-        case 32:
-                value = "HSSDC II";
-                break;
-        case 33:
-                value = "Copper pigtail";
-                break;
-        default:
-                snprintf(buf, sizeof(buf), "%s %d",
-                         byte < 0x80 ? "reserved" : "vendor specific",
-                         byte);
-                value = buf;
-                break;
-        }
-
-        blobmsg_add_string(b, "connector", value);
-        return 1;
-}
-
-static int sfp_rom_get_connector_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                        struct ubus_request_data *req, const char *method,
-                                        struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_connector (&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_ethernet(struct blob_buf *b)
-{
-        int byte = sfp_rom_byte (6);
-        int i;
-        char value[11];
-        if (byte < 0)
-                return 0;
-
-        i = 0;
-        if (byte & 8)
-                value[i++] = 'T';
-        if (byte & 4) {
-                if (i)
-                        value[i++] = ',';
-                strcpy(value+i, "CX");
-                i += 2;
-        }
-        if (byte & 2) {
-                if (i)
-                        value[i++] = ',';
-                strcpy(value+i, "LX");
-                i += 2;
-        }
-        if (byte & 1) {
-                if (i)
-                        value[i++] = ',';
-                strcpy(value+i, "SX");
-                i += 2;
-        }
-        if (!i)
-                return 0;
-
-        value[i] = '\0';
-        blobmsg_add_string(b, "ethernet", value);
-        return 1;
-}
-
-static int sfp_rom_get_ethernet_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                       struct ubus_request_data *req, const char *method,
-                                       struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_ethernet(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_encoding(struct blob_buf *b)
-{
-        int byte = sfp_rom_byte (11);
-        char buf[20];
-        const char *value;
-        if (byte < 0)
-                return 0;
-
-        switch (byte) {
-        case 0:
-                value = "Unspecified";
-                break;
-        case 1:
-                value = "8B10B";
-                break;
-        case 2:
-                value = "4B5B";
-                break;
-        case 3:
-                value = "NRZ";
-                break;
-        case 4:
-                value = "Manchester";
-                break;
-        default:
-                snprintf(buf, sizeof(buf), "%s %d",
-                         "reserved", byte);
-                value = buf;
-                break;
-        }
-
-        blobmsg_add_string(b, "encoding", value);
-        return 1;
-}
-
-static int sfp_rom_get_encoding_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                       struct ubus_request_data *req, const char *method,
-                                       struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_encoding(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_rate(struct blob_buf *b)
-{
-        int byte = sfp_rom_byte (12);
-        int tol;
-        if (byte < 0)
-                return 0;
-
-        /* Read byte is in units of 100 Mbit/s, scale to Mbit/s. */
-        blobmsg_add_u32(b, "rate", 100*byte);
-        tol = sfp_rom_byte (66);
-        if (tol > 0)
-                blobmsg_add_u32(b, "rate-max", (100 + tol)*byte);
-
-        tol = sfp_rom_byte (67);
-        if (tol > 0 && tol <= 100)
-                blobmsg_add_u32(b, "rate-min", (100 - tol)*byte);
-
-        return 1;
-}
-
-static int sfp_rom_get_rate_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                   struct ubus_request_data *req, const char *method,
-                                   struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_rate(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_length(struct blob_buf *b)
-{
-        int sm_1000;
-        int sm_100;
-        int mm50;
-        int mm62;
-        int cu;
-
-        if ( (sm_1000 = sfp_rom_byte (14)) < 0
-             || (sm_100 = sfp_rom_byte (15)) < 0
-             || (mm50 = sfp_rom_byte (16)) < 0
-             || (mm62 = sfp_rom_byte (17)) < 0
-             || (cu = sfp_rom_byte (18)) < 0)
-                return 0;
-
-        if (sm_1000 > 0)
-                blobmsg_add_u32(b, "single-mode", sm_1000 * 1000);
-        else if (sm_100 > 0)
-                blobmsg_add_u32(b, "single-mode", sm_100 * 100);
-        if (mm50 > 0)
-                blobmsg_add_u32(b, "multi-mode-50", mm50 * 10);
-        if (mm62 > 0)
-                blobmsg_add_u32(b, "multi-mode-62.5", mm62 * 10);
-        if (cu > 0)
-                blobmsg_add_u32(b, "copper", cu);
-        return 1;
-}
-
-static int sfp_rom_get_length_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_length(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_vendor(struct blob_buf *b)
-{
-        char buf[17];
-        int i;
-        if (!sfp_rom_bytes(20, buf, 16))
-                return 0;
-
-        for (i = 16; i > 0 && buf[i-1] == ' '; i--)
-                ;
-        buf[i] = '\0';
-
-        blobmsg_add_string(b, "vendor", buf);
-        return 1;
-}
-
-static int sfp_rom_get_vendor_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_vendor(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_oui(struct blob_buf *b)
-{
-        char buf[3];
-        char value[9];
-        if (!sfp_rom_bytes(37, buf, 3))
-                return 0;
-
-        snprintf(value, sizeof(value), "%02x:%02x:%02x",
-                 (unsigned char) buf[0], (unsigned char) buf[1], (unsigned char) buf[2]);
-        blobmsg_add_string(b, "oui", value);
-        return 1;
-}
-
-static int sfp_rom_get_oui_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                  struct ubus_request_data *req, const char *method,
-                                  struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_oui(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_pn(struct blob_buf *b)
-{
-        char buf[17];
-        int i;
-        if (!sfp_rom_bytes(40, buf, 16))
-                return 0;
-
-        for (i = 16; i > 0 && buf[i-1] == ' '; i--)
-                ;
-        buf[i] = '\0';
-
-        blobmsg_add_string(b, "pn", buf);
-        return 1;
-}
-
-static int sfp_rom_get_pn_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                 struct ubus_request_data *req, const char *method,
-                                 struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_pn(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_rev(struct blob_buf *b)
-{
-        char buf[5];
-        int i;
-        if (!sfp_rom_bytes(56, buf, 4))
-                return 0;
-
-        for (i = 4; i > 0 && buf[i-1] == ' '; i--)
-                ;
-        buf[i] = '\0';
-
-        blobmsg_add_string(b, "rev", buf);
-        return 1;
-}
-
-static int sfp_rom_get_rev_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                  struct ubus_request_data *req, const char *method,
-                                  struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_rev(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_sn(struct blob_buf *b)
-{
-        char buf[17];
-        int i;
-        if (!sfp_rom_bytes(68, buf, 16))
-                return 0;
-
-        for (i = 16; i > 0 && buf[i-1] == ' '; i--)
-                ;
-        buf[i] = '\0';
-
-        blobmsg_add_string(b, "sn", buf);
-        return 1;
-}
-static int sfp_rom_get_sn_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                 struct ubus_request_data *req, const char *method,
-                                 struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_sn(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_date(struct blob_buf *b)
-{
-        char buf[8];
-        char value[14];
-        int i;
-        if (!sfp_rom_bytes(84, buf, 8))
-                return 0;
-
-        value[0] = '2';
-        value[1] = '0';
-        value[2] = buf[0];
-        value[3] = buf[1];
-        value[4] = '-';
-        value[5] = buf[2];
-        value[6] = buf[3];
-        value[7] = '-';
-        value[8] = buf[4];
-        value[9] = buf[5];
-        for (i = 8; i > 6 && buf[i-1] == ' '; i--)
-                ;
-        memset(value+10, 0, 4);
-        if (i > 6) {
-                value[10] = ' ';
-                value[11] = buf[6];
-                if (i > 7)
-                        value[12] = buf[7];
-        }
-
-        blobmsg_add_string(b, "date", value);
-        return 1;
-}
-
-static int sfp_rom_get_date_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                   struct ubus_request_data *req, const char *method,
-                                   struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_date(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_ddm(struct blob_buf *b)
-{
-        int byte = sfp_rom_byte(94);
-        char buf[20];
-        const char *value;
-
-        if (byte < 0)
-                return 0;
-
-        switch (byte) {
-        case 0:
-                value = "none";
-                break;
-        case 1:
-                value = "9.3";
-                break;
-        case 2:
-                value = "9.5";
-                break;
-        case 3:
-                value = "10.2";
-                break;
-        case 4:
-                value = "10.4";
-                break;
-        case 5:
-                value = "11.0";
-                break;
-        case 6:
-                value = "11.3";
-                break;
-        default:
-                snprintf(buf, sizeof(buf), "%s %d",
-                         "reserved", byte);
-                value = buf;
-        }
-        blobmsg_add_string(b, "ddm", value);
-        return 1;
-};
-
-static int sfp_rom_get_ddm_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                  struct ubus_request_data *req, const char *method,
-                                  struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_ddm(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_rom_get_all_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                  struct ubus_request_data *req, const char *method,
-                                  struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_rom_get_connector(&b);
-	sfp_rom_get_ethernet(&b);
-	sfp_rom_get_encoding(&b);
-	sfp_rom_get_rate(&b);
-	sfp_rom_get_length(&b);
-	sfp_rom_get_vendor(&b);
-	sfp_rom_get_oui(&b);
-	sfp_rom_get_pn(&b);
-	sfp_rom_get_rev(&b);
-	sfp_rom_get_sn(&b);
-	sfp_rom_get_date(&b);
-	sfp_rom_get_ddm(&b);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-struct sfp_ddm {
-        /* For checking when to reread calibration data. */
-        time_t timestamp;
-        unsigned type; /* From address 92 */
-        unsigned version; /* From address 94 */
-        /* Calibration constants, read from addresses 56-91 if bit 4 is
-           set in ddm_type */
-        float rx_pwr[5];
-        float tx_i_slope;
-        float tx_i_offset;
-        float tx_pwr_slope;
-        float tx_pwr_offset;
-        float t_slope;
-        float t_offset;
-        float v_slope;
-        float v_offset;
-};
-static struct sfp_ddm sfp_ddm;
-
-static int sfp_ddm_read_float(float *x, unsigned addr)
-{
-        uint8_t buf[4];
-        int32_t m;
-        int e;
-        unsigned i;
-
-        if (!i2c_sfp || sfp_ddm_fd < 0)
-                return 0;
-        /* Used only for constant data, so byte accesses should be ok. And
-           there should only be regular normalized numbers (or zero).
-        */
-        for (i = 0; i < 4; i++) {
-                int byte = i2c_smbus_read_byte_data(sfp_ddm_fd, addr + i);
-                if (byte < 0)
-                        return 0;
-                buf[i] = byte;
-        }
-        e = (buf[0] & 0x7f) << 1 | buf[1] >> 7;
-        m = (((int32_t) buf[1] & 0x7f) << 16) | ((int32_t) buf[2] << 8) | buf[3];
-        if (e == 0 && m == 0) {
-                *x = 0.0;
-                return 1;
-        }
-        if (e == 0 || e == 0xff)
-                /* NaN or infinity */
-                return 0;
-        m |= (1U << 23);
-        if (buf[0] & 0x80)
-                m = -m;
-        *x = ldexpf ((float) m, e - (127 + 23));
-
-        return 1;
-}
-
-/* Plain i2c_smbus_read_word_data use little-endian byteorder. We have
-   msb first, so swap it. The swap should be a nop for the failure
-   case w == -1. */
-static int i2c_smbus_read_word_swapped(int fd, unsigned addr)
-{
-        int w = i2c_smbus_read_word_data(fd, addr);
-        return (w >> 8) | ((w & 0xff) << 8);
-
-}
-static int sfp_ddm_read_fp(float *x, unsigned addr)
-{
-        int w;
-        if (!i2c_sfp || sfp_ddm_fd < 0)
-                return 0;
-        w = i2c_smbus_read_word_swapped(sfp_ddm_fd, addr);
-        if (w < 0)
-                return 0;
-        *x = (float) w / 0x100;
-        return 1;
-}
-
-static int sfp_ddm_read_si(float *x, unsigned addr)
-{
-        int w;
-
-        if (!i2c_sfp || sfp_ddm_fd < 0)
-                return 0;
-        w = i2c_smbus_read_word_swapped(sfp_ddm_fd, addr);
-        if (w < 0)
-                return 0;
-        *x = (float) (int16_t) w;
-        return 1;
-}
-
-static int sfp_ddm_read_ui(float *x, unsigned addr)
-{
-        int w;
-
-        if (!i2c_sfp || sfp_ddm_fd < 0)
-                return 0;
-        w = i2c_smbus_read_word_swapped(sfp_ddm_fd, addr);
-        if (w < 0)
-                return 0;
-        *x = (float) w;
-        return 1;
-}
-
-static int ddm_prepare(void)
-{
-        int byte;
-        int reread;
-        time_t now = time(NULL);
-
-
-        byte = sfp_rom_byte(92);
-        if (byte < 0) {
-        fail:
-                if (sfp_ddm_fd >= 0)
-                        close(sfp_ddm_fd);
-                sfp_ddm_fd = -1;
-                return 0;
-        }
-        if ( (byte & 0xc0) != 0x40)
-                goto fail;
-
-        if (byte & 4) {
-                syslog(LOG_INFO, "sfp: ddm requires address change, not implemented.");
-                goto fail;
-        }
-        sfp_ddm.type = byte;
-        byte = sfp_rom_byte(94);
-        if (byte <= 0)
-                goto fail;
-        sfp_ddm.version = byte;
-        if (sfp_ddm_fd < 0) {
-                sfp_ddm_fd = i2c_open_dev(i2c_sfp->bus, i2c_sfp->ddm_addr,
-                                          I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_READ_WORD_DATA);
-                if (sfp_ddm_fd < 0)
-                        return 0;
-
-                reread = 1;
-        }
-        else if (sfp_ddm.type & 0x10)
-                /* External calibration */
-
-                /* We could check vendor, sn, etc, to try to figure out if the
-                   SFP has been replaced, but it's less work to just reread
-                   the calibration data. */
-                reread = (now > sfp_ddm.timestamp + 120 || sfp_ddm.timestamp > now);
-        else
-                reread = 0;
-
-        if (reread) {
-                if (sfp_ddm.type & 0x10) {
-                        unsigned i;
-                        for (i = 0; i < 5; i++)
-                                if (!sfp_ddm_read_float(&sfp_ddm.rx_pwr[4-i], 56+4*i))
-                                        goto fail;
-                        if (! (sfp_ddm_read_fp(&sfp_ddm.tx_i_slope, 76)
-                               && sfp_ddm_read_si(&sfp_ddm.tx_i_offset, 78)
-                               && sfp_ddm_read_fp(&sfp_ddm.tx_pwr_slope, 80)
-                               && sfp_ddm_read_si(&sfp_ddm.tx_pwr_offset, 82)
-                               && sfp_ddm_read_fp(&sfp_ddm.t_slope, 84)
-                               && sfp_ddm_read_si(&sfp_ddm.t_offset, 86)
-                               && sfp_ddm_read_fp(&sfp_ddm.v_slope, 88)
-                               && sfp_ddm_read_si(&sfp_ddm.v_offset, 89))) {
-                                syslog(LOG_INFO, "sfp: Reading ddm calibration data failed.");
-                                goto fail;
-                        }
-                        DBG(1,"Read ddm calibration data:\n"
-                            "rx_pwr: %g %g %g %g %g\n"
-                            "tx_i: %g %g\n"
-                            "tx_pwr: %g %g\n"
-                            "T: %g %g\n"
-                            "V: %g %g\n",
-                            sfp_ddm.rx_pwr[0], sfp_ddm.rx_pwr[1],
-                            sfp_ddm.rx_pwr[2], sfp_ddm.rx_pwr[3],
-                            sfp_ddm.rx_pwr[4],
-                            sfp_ddm.tx_i_slope, sfp_ddm.tx_i_offset,
-                            sfp_ddm.tx_pwr_slope, sfp_ddm.tx_pwr_offset,
-                            sfp_ddm.t_slope, sfp_ddm.t_offset,
-                            sfp_ddm.v_slope, sfp_ddm.v_offset);
-
-                }
-                else {
-                        sfp_ddm.rx_pwr[0] = sfp_ddm.rx_pwr[2]
-                                = sfp_ddm.rx_pwr[3] = sfp_ddm.rx_pwr[4] = 0.0;
-                        sfp_ddm.rx_pwr[1] = 1.0;
-
-                        sfp_ddm.tx_i_slope = sfp_ddm.tx_pwr_slope
-                                = sfp_ddm.t_slope = sfp_ddm.v_slope = 1.0;
-                        sfp_ddm.tx_i_offset = sfp_ddm.tx_pwr_offset
-                                = sfp_ddm.t_offset = sfp_ddm.v_offset = 0.0;
-                }
-                sfp_ddm.timestamp = now;
-        }
-        return 1;
-};
-
-#if 0
-static int sfp_ddm_get_temperature(struct blob_buf *b, int raw)
-{
-        float x;
-        char buf[15];
-
-        if (!ddm_prepare())
-                return 0;
-
-        if (!sfp_ddm_read_si(&x, 96))
-                return 0;
-
-        x = sfp_ddm.t_slope * x + sfp_ddm.t_offset;
-        if (raw) {
-                blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5));
-                blobmsg_add_string(b, "unit", "1/256 °C");
-        }
-
-        snprintf(buf, sizeof(buf), "%.2f °C", x * (1.0/256));
-        blobmsg_add_string(b, "temperature", buf);
-        return 1;
-}
-
-static int sfp_ddm_get_temperature_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                          struct ubus_request_data *req, const char *method,
-                                          struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_ddm_get_temperature(&b, 1);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-#endif
-
-static int sfp_ddm_get_voltage(struct blob_buf *b, int raw)
-{
-        float x;
-        char buf[10];
-        if (!ddm_prepare())
-                return 0;
-
-        if (!sfp_ddm_read_ui(&x, 98))
-                return 0;
-
-        x = sfp_ddm.v_slope * x + sfp_ddm.v_offset;
-        if (raw) {
-                blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5));
-                blobmsg_add_string(b, "unit", "100uV");
-        }
-        snprintf(buf, sizeof(buf), "%.4f V", x * (1.0/10000));
-        blobmsg_add_string(b, "voltage", buf);
-        return 1;
-}
-
-static int sfp_ddm_get_voltage_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                      struct ubus_request_data *req, const char *method,
-                                      struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_ddm_get_voltage(&b, 1);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_ddm_get_current(struct blob_buf *b, int raw)
-{
-        float x;
-        char buf[10];
-        if (!ddm_prepare())
-                return 0;
-
-        if (!sfp_ddm_read_ui(&x, 100))
-                return 0;
-
-        x = sfp_ddm.tx_i_slope * x + sfp_ddm.tx_i_offset;
-        if (raw) {
-                blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5));
-                blobmsg_add_string(b, "unit", "2 uA");
-        }
-        snprintf(buf, sizeof(buf), "%.3f mA", x * (1.0/500));
-        blobmsg_add_string(b, "current", buf);
-        return 1;
-}
-
-static int sfp_ddm_get_current_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                      struct ubus_request_data *req, const char *method,
-                                      struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_ddm_get_current(&b, 1);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static int sfp_ddm_get_tx_pwr(struct blob_buf *b, int raw)
-{
-        float x;
-        char buf[16];
-        if (!ddm_prepare())
-                return 0;
-
-        if (!sfp_ddm_read_ui(&x, 102))
-                return 0;
-
-        x = sfp_ddm.tx_pwr_slope * x + sfp_ddm.tx_pwr_offset;
-        if (raw) {
-                blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5));
-                blobmsg_add_string(b, "unit", "0.1uW");
-        }
-        snprintf(buf, sizeof(buf), "%.4f mW", x * (1.0/10000));
-        blobmsg_add_string(b, "tx-pwr", buf);
-        snprintf(buf, sizeof(buf), "%.4f dBm", 
-                10.0f * log10f(x * 1e-7) + 30.0f);
-        blobmsg_add_string(b, "tx-pwr-dBm", buf);
-        return 1;
-}
-
-static int sfp_ddm_get_tx_pwr_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_ddm_get_tx_pwr(&b, 1);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-
-static int sfp_ddm_get_rx_pwr(struct blob_buf *b, int raw)
-{
-        unsigned i;
-        float x;
-        char buf[16];
-
-        if (!ddm_prepare())
-                return 0;
-
-        for (x = sfp_ddm.rx_pwr[0], i = 1; i < 5; i++) {
-                float v;
-                /* NOTE: There's only a single word to read. It's unclear how
-                   to get several values. However, typically, rx_pwr[2,3,4]
-                   are zero. */
-                if (sfp_ddm.rx_pwr[i] > 0.0 || sfp_ddm.rx_pwr[i] < 0.0) { /* sfp_ddm.rx_pwr[i] != 0.0 */
-                        if (!sfp_ddm_read_ui(&v, 104))
-                                return 0;
-                        x += v*sfp_ddm.rx_pwr[i];
-                }
-        }
-        if (raw) {
-                blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5));
-                blobmsg_add_string(b, "unit", "0.1uW");
-        }
-
-        snprintf(buf, sizeof(buf), "%.4f mW", x * (1.0/10000));
-        blobmsg_add_string(b, "rx-pwr", buf);
-        snprintf(buf, sizeof(buf), "%.4f dBm",
-                10.0 * log10(x * 1e-7) + 30.0);
-        blobmsg_add_string(b, "rx-pwr-dBm", buf);
-        blobmsg_add_string(b, "rx-pwr-type",
-                           (sfp_ddm.type & 8) ? "average" : "OMA");
-        return 1;
-}
-
-static int sfp_ddm_get_rx_pwr_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                     struct ubus_request_data *req, const char *method,
-                                     struct blob_attr *msg)
-{
-	struct blob_buf b;
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-	sfp_ddm_get_rx_pwr(&b, 1);
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-static int sfp_ddm_get_all_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                                  struct ubus_request_data *req, const char *method,
-                                  struct blob_attr *msg)
-{
-	struct blob_buf b;
-
-        memset(&b, 0, sizeof(struct blob_buf));
-	blob_buf_init (&b, 0);
-
-	//sfp_ddm_get_temperature(&b, 0);
-	sfp_ddm_get_voltage(&b, 0);
-	sfp_ddm_get_current(&b, 0);
-	sfp_ddm_get_tx_pwr(&b, 0);
-	sfp_ddm_get_rx_pwr(&b, 0);
-
-	ubus_send_reply(ubus_ctx, req, b.head);
-	return 0;
-}
-
-static const struct ubus_method sfp_rom_methods[] = {
-        { .name = "get-type", .handler = sfp_rom_get_type_method },
-        { .name = "get-connector", .handler = sfp_rom_get_connector_method },
-        { .name = "get-ethernet", .handler = sfp_rom_get_ethernet_method },
-        { .name = "get-encoding", .handler = sfp_rom_get_encoding_method },
-        { .name = "get-rate", .handler = sfp_rom_get_rate_method },
-        { .name = "get-length", .handler = sfp_rom_get_length_method },
-        { .name = "get-vendor", .handler = sfp_rom_get_vendor_method },
-        { .name = "get-oui", .handler = sfp_rom_get_oui_method },
-        { .name = "get-pn", .handler = sfp_rom_get_pn_method },
-        { .name = "get-rev", .handler = sfp_rom_get_rev_method },
-        { .name = "get-sn", .handler = sfp_rom_get_sn_method },
-        { .name = "get-date", .handler = sfp_rom_get_date_method },
-        { .name = "get-ddm", .handler = sfp_rom_get_ddm_method },
-        { .name = "get-all", .handler = sfp_rom_get_all_method },
-};
-
-static struct ubus_object_type sfp_rom_type =
-        UBUS_OBJECT_TYPE("sfp.rom", sfp_rom_methods);
-
-static const struct ubus_method sfp_ddm_methods[] = {
-        { .name = "get-rx-pwr", .handler = sfp_ddm_get_rx_pwr_method },
-        { .name = "get-tx-pwr", .handler = sfp_ddm_get_tx_pwr_method },
-        //{ .name = "get-temperature", .handler = sfp_ddm_get_temperature_method },
-        { .name = "get-current", .handler = sfp_ddm_get_current_method },
-        { .name = "get-voltage", .handler = sfp_ddm_get_voltage_method },
-        { .name = "get-all", .handler = sfp_ddm_get_all_method },
-};
-
-static struct ubus_object_type sfp_ddm_type =
-        UBUS_OBJECT_TYPE("sfp.ddm", sfp_ddm_methods);
-
-static struct ubus_object sfp_objects[] = {
-        { .name = "sfp.rom", .type = &sfp_rom_type,
-          .methods = sfp_rom_methods, ARRAY_SIZE(sfp_rom_methods) },
-        { .name = "sfp.ddm", .type = &sfp_ddm_type,
-          .methods = sfp_ddm_methods, ARRAY_SIZE(sfp_ddm_methods) },
-};
-
-struct sfp_handler * sfp_init( struct uci_context *uci_ctx)
-{
-        const char *p;
-        unsigned int i;
-
-        p = ucix_get_option(uci_ctx, "hw", "board", "hardware");
-        if (p == 0){
-                syslog(LOG_INFO, "%s: Missing Hardware identifier in configuration. I2C is not started",__func__);
-                return 0;
-        }
-
-        /* Here we match the hardware name to a init table, and get the
-           i2c chip address */
-        i2c_sfp = NULL;
-        for (i = 0; i < sizeof(i2c_sfp_list) / sizeof(i2c_sfp_list[0]); i++) {
-                DBG(1,"I2C hardware platform %s tested.", i2c_sfp_list[i].name);
-                if (!strcmp(i2c_sfp_list[i].name, p)) {
-                        DBG(1,"I2C hardware platform %s found.", p);
-                        i2c_sfp = &i2c_sfp_list[i];
-                        break;
-                }
-        }
-        if (!i2c_sfp) {
-                DBG(1,"No sfp I2C hardware found: %s.", p);
-                return 0;
-        }
-
-        /* just return something not NULL */
-        return (struct sfp_handler *)4;
-}
-
-int sfp_ubus_populate( struct sfp_handler *h, struct ubus_context *ubus_ctx)
-{
-        unsigned int i;
-        int ret;
-
-        for (i = 0; i < ARRAY_SIZE(sfp_objects); i++) {
-                ret = ubus_add_object (ubus_ctx, &sfp_objects[i]);
-                if (ret)
-                        DBG(1,"Failed to add sfp object: %s", ubus_strerror(ret));
-        }
-        return 0;
-}
diff --git a/peripheral_manager/src/src/sfp.h b/peripheral_manager/src/src/sfp.h
deleted file mode 100644
index 040c5d694a52a09ed362d225ea74d880be365eb6..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/sfp.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef SFP_H
-#include "libubus.h"
-#include "ucix.h"
-
-struct sfp_handler;
-
-struct sfp_handler * sfp_init(struct uci_context *uci_ctx);
-int sfp_ubus_populate(struct sfp_handler *h, struct ubus_context *ubus_ctx);
-void sfp_destroy(struct sfp_handler *h);
-
-#endif /*SFP_H*/
diff --git a/peripheral_manager/src/src/sim_button.c b/peripheral_manager/src/src/sim_button.c
deleted file mode 100644
index 716d35e3008e7fbde842fd2e12df4a3f0017ffc2..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/sim_button.c
+++ /dev/null
@@ -1,191 +0,0 @@
-#include <syslog.h>
-#include <string.h>
-#include "button.h"
-#include "log.h"
-#include "server.h"
-
-
-void sim_button_init(struct server_ctx *s_ctx);
-
-struct sim_data {
-	int addr;
-	int active;
-	int state;
-	struct button_drv button;
-};
-
-struct drv_button_list{
-	struct list_head list;
-	struct button_drv *drv;
-};
-
-static button_state_t sim_get_state(struct button_drv *drv)
-{
-//	DBG(1, "state for %s",  drv->name);
-	struct sim_data *p = (struct sim_data *)drv->priv;
-
-	return p->state;
-}
-
-static struct button_drv_func func = {
-	.get_state = sim_get_state,
-};
-
-static LIST_HEAD(sim_buttons);
-
-
-enum {
-	SIM_NAME,
-	SIM_STATE,
-	__SIM_MAX
-};
-
-static const struct blobmsg_policy sim_policy[] = {
-	[SIM_NAME] =  { .name = "name",  .type = BLOBMSG_TYPE_STRING },
-	[SIM_STATE] = { .name = "state", .type = BLOBMSG_TYPE_STRING },
-};
-
-static struct button_drv *get_drv_button(char *name)
-{
-	struct list_head *i;
-	list_for_each(i, &sim_buttons) {
-		struct drv_button_list *node = list_entry(i, struct drv_button_list, list);
-                if (! strcmp(node->drv->name, name))
-                        return node->drv;
-	}
-        return NULL;
-}
-
-static int sim_set_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                          struct ubus_request_data *req, const char *method,
-                          struct blob_attr *msg)
-{
-	struct blob_attr *tb[__SIM_MAX];
-	DBG(1, "");
-
-	blobmsg_parse(sim_policy, ARRAY_SIZE(sim_policy), tb, blob_data(msg), blob_len(msg));
-
-	if ( tb[SIM_NAME] ) {
-		if ( tb[SIM_STATE] ) {
-			struct button_drv *bt = get_drv_button((char *)blobmsg_data(tb[SIM_NAME]));
-			DBG(1," name = %s",(char *)blobmsg_data(tb[SIM_NAME]));
-			DBG(1," state = %s",(char *)blobmsg_data(tb[SIM_STATE]));
-
-			if (bt) {
-				struct sim_data *p = (struct sim_data *)bt->priv;
-
-				if(!strcasecmp("pressed", (char *)blobmsg_data(tb[SIM_STATE]))){
-					p->state = BUTTON_PRESSED;
-				}
-				if(!strcasecmp("released", (char *)blobmsg_data(tb[SIM_STATE]))){
-					p->state = BUTTON_RELEASED;
-				}
-			}else
-			DBG(1," button = %s not found",(char *)blobmsg_data(tb[SIM_NAME]));
-		}
-	}
-	return 0;
-}
-
-static int sim_status_method(struct ubus_context *ubus_ctx, struct ubus_object *obj,
-                             struct ubus_request_data *req, const char *method,
-                             struct blob_attr *msg)
-{
-	struct blob_buf blob;
-	struct list_head *i;
-
-	DBG(1, "");
-
-	memset(&blob,0,sizeof(struct blob_buf));
-	blob_buf_init(&blob, 0);
-
-	list_for_each(i, &sim_buttons) {
-		struct drv_button_list *node = list_entry(i, struct drv_button_list, list);
-		const char *state;
-		struct sim_data *p = (struct sim_data *)node->drv->priv;
-
-		if(p->state == 	BUTTON_RELEASED)
-			state = "Released";
-		else
-			state = "Pressed";
-
-		blobmsg_add_string(&blob, node->drv->name, state);
-	}
-	ubus_send_reply(ubus_ctx, req, blob.head);
-	return 0;
-}
-
-
-static const struct ubus_method sim_methods[] = {
-	UBUS_METHOD("set", sim_set_method, sim_policy),
-	{ .name = "status",
-	  .handler = sim_status_method },
-};
-
-static struct ubus_object_type sim_object_type =
-	UBUS_OBJECT_TYPE("sim", sim_methods);
-
-#define SIM_OBJECTS 1
-static struct ubus_object sim_objects[SIM_OBJECTS] = {
-    { .name = "button",
-      .type = &sim_object_type,
-      .methods = sim_methods,
-      .n_methods = ARRAY_SIZE(sim_methods),
-    },
-};
-
-void sim_button_init(struct server_ctx *s_ctx) {
-	int i,ret;
-	struct ucilist *node;
-	LIST_HEAD(buttons);
-
-	DBG(1, "");
-
-	ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"sim_buttons", "buttons", &buttons);
-	list_for_each_entry(node, &buttons, list) {
-		struct sim_data *data;
-		const char *s;
-
-		DBG(1, "value = [%s]",node->val);
-
-		data = malloc(sizeof(struct sim_data));
-		memset(data,0,sizeof(struct sim_data));
-
-		data->button.name = node->val;
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "addr");
-		DBG(1, "addr = [%s]", s);
-		if (s){
-			data->addr =  strtol(s,0,0);
-		}
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "active");
-		data->active = -1;
-		if (s){
-			if (!strncasecmp("hi",s,2))
-				data->active =  1;
-			else if (!strncasecmp("low",s,3))
-				data->active =  0;
-
-		}
-		DBG(1, "active = %d", data->active);
-
-		data->button.func = &func;
-		data->button.priv = data;
-
-		button_add(&data->button);
-
-		{ /* save button in internal list, we need this for ubus set/status */
-			struct drv_button_list *bt = malloc(sizeof(struct drv_button_list));
-			memset(bt, 0, sizeof(struct drv_button_list));
-			bt->drv = &data->button;
-			list_add(&bt->list, &sim_buttons);
-		}
-	}
-
-	for (i=0 ; i<SIM_OBJECTS ; i++) {
-		ret = ubus_add_object(s_ctx->ubus_ctx, &sim_objects[i]);
-		if (ret)
-			DBG(1,"Failed to add object: %s", ubus_strerror(ret));
-	}
-}
diff --git a/peripheral_manager/src/src/sim_led.c b/peripheral_manager/src/src/sim_led.c
deleted file mode 100644
index fb0308bc9090669f50b130f844e4f59e9541c2a3..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/sim_led.c
+++ /dev/null
@@ -1,98 +0,0 @@
-#include <syslog.h>
-#include <string.h>
-#include "led.h"
-#include "log.h"
-#include "server.h"
-
-void sim_led_init(struct server_ctx *s_ctx);
-
-static int sim_set_state(struct led_drv *drv, led_state_t state)
-{
-	DBG(1, "state %x on %s", state, drv->name);
-	return 0;
-}
-
-static led_state_t sim_get_state(struct led_drv *drv)
-{
-	DBG(1, "state for %s",  drv->name);
-	return 0;
-}
-
-static int sim_set_color(struct led_drv *drv, led_color_t color)
-{
-	DBG(1, "color %d on %s", color, drv->name);
-	return 0;
-}
-
-static led_color_t sim_get_color(struct led_drv *drv)
-{
-	DBG(1, "color for %s", drv->name);
-	return 0;
-}
-
-static struct led_drv_func func = {
-	.set_state = sim_set_state,
-	.get_state = sim_get_state,
-	.set_color = sim_set_color,
-	.get_color = sim_get_color,
-};
-
-struct sim_data {
-	int addr;
-	led_color_t color;
-	int state;
-	int pulsing;
-	struct led_drv led;
-};
-
-void sim_led_init(struct server_ctx *s_ctx) {
-
-	LIST_HEAD(leds);
-	struct ucilist *node;
-
-	DBG(1, "");
-
-	ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"sim_leds", "leds", &leds);
-	list_for_each_entry(node,&leds,list){
-		struct sim_data *data;
-		const char *s;
-
-		DBG(1, "value = [%s]",node->val);
-
-		data = malloc(sizeof(struct sim_data));
-		memset(data,0,sizeof(struct sim_data));
-
-		data->led.name = node->val;
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "addr");
-		DBG(1, "addr = [%s]", s);
-		if (s){
-			data->addr =  strtol(s,0,0);
-		}
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "color");
-		if (s){
-			if (!strncasecmp("red",s,3))
-				data->color =  RED;
-			else if (!strncasecmp("green",s,5))
-				data->color =  GREEN;
-			else if (!strncasecmp("blue",s,4))
-				data->color =  BLUE;
-			else if (!strncasecmp("yellow",s,6))
-				data->color =  YELLOW;
-			else if (!strncasecmp("white",s,5))
-				data->color =  WHITE;
-		}
-		DBG(1, "color = [%s]=(%d)", s,data->color);
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "pulsing");
-		DBG(1, "pulsing = [%s]", s);
-		if (s){
-			if (!strncasecmp("yes",s,3))
-				data->pulsing = 1;
-		}
-		data->led.func = &func;
-		data->led.priv = data;
-		led_add(&data->led);
-	}
-}
diff --git a/peripheral_manager/src/src/smbus.c b/peripheral_manager/src/src/smbus.c
deleted file mode 100644
index a85d727edf4a111d0489125ecd33e5242b0fab3e..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/smbus.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
-    smbus.c - SMBus level access helper functions
-
-    Copyright (C) 1995-1997  Simon G. Vogl
-    Copyright (C) 1998-1999  Frodo Looijaard <frodol@dds.nl>
-    Copyright (C) 2012-2013  Jean Delvare <jdelvare@suse.de>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-    MA 02110-1301 USA.
-*/
-
-#include <errno.h>
-#include <stddef.h>
-#include "smbus.h"
-#include <sys/ioctl.h>
-#include <linux/types.h>
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-
-/* Compatibility defines */
-#ifndef I2C_SMBUS_I2C_BLOCK_BROKEN
-#define I2C_SMBUS_I2C_BLOCK_BROKEN I2C_SMBUS_I2C_BLOCK_DATA
-#endif
-#ifndef I2C_FUNC_SMBUS_PEC
-#define I2C_FUNC_SMBUS_PEC I2C_FUNC_SMBUS_HWPEC_CALC
-#endif
-
-__s32 i2c_smbus_access(int file, char read_write, __u8 command,
-		       int size, union i2c_smbus_data *data)
-{
-	struct i2c_smbus_ioctl_data args;
-	__s32 err;
-
-	args.read_write = read_write;
-	args.command = command;
-	args.size = size;
-	args.data = data;
-
-	err = ioctl(file, I2C_SMBUS, &args);
-	if (err == -1)
-		err = -errno;
-	return err;
-}
-
-
-__s32 i2c_smbus_write_quick(int file, __u8 value)
-{
-	return i2c_smbus_access(file, value, 0, I2C_SMBUS_QUICK, NULL);
-}
-
-__s32 i2c_smbus_read_byte(int file)
-{
-	union i2c_smbus_data data;
-	int err;
-
-	err = i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data);
-	if (err < 0)
-		return err;
-
-	return 0x0FF & data.byte;
-}
-
-__s32 i2c_smbus_write_byte(int file, __u8 value)
-{
-	return i2c_smbus_access(file, I2C_SMBUS_WRITE, value,
-				I2C_SMBUS_BYTE, NULL);
-}
-
-__s32 i2c_smbus_read_byte_data(int file, __u8 command)
-{
-	union i2c_smbus_data data;
-	int err;
-
-	err = i2c_smbus_access(file, I2C_SMBUS_READ, command,
-			       I2C_SMBUS_BYTE_DATA, &data);
-	if (err < 0)
-		return err;
-
-	return 0x0FF & data.byte;
-}
-
-__s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value)
-{
-	union i2c_smbus_data data;
-	data.byte = value;
-	return i2c_smbus_access(file, I2C_SMBUS_WRITE, command,
-				I2C_SMBUS_BYTE_DATA, &data);
-}
-
-__s32 i2c_smbus_read_word_data(int file, __u8 command)
-{
-	union i2c_smbus_data data;
-	int err;
-
-	err = i2c_smbus_access(file, I2C_SMBUS_READ, command,
-			       I2C_SMBUS_WORD_DATA, &data);
-	if (err < 0)
-		return err;
-
-	return 0x0FFFF & data.word;
-}
-
-__s32 i2c_smbus_write_word_data(int file, __u8 command, __u16 value)
-{
-	union i2c_smbus_data data;
-	data.word = value;
-	return i2c_smbus_access(file, I2C_SMBUS_WRITE, command,
-				I2C_SMBUS_WORD_DATA, &data);
-}
-
-__s32 i2c_smbus_process_call(int file, __u8 command, __u16 value)
-{
-	union i2c_smbus_data data;
-	data.word = value;
-	if (i2c_smbus_access(file, I2C_SMBUS_WRITE, command,
-			     I2C_SMBUS_PROC_CALL, &data))
-		return -1;
-	else
-		return 0x0FFFF & data.word;
-}
-
-/* Returns the number of read bytes */
-__s32 i2c_smbus_read_block_data(int file, __u8 command, __u8 *values)
-{
-	union i2c_smbus_data data;
-	int i, err;
-
-	err = i2c_smbus_access(file, I2C_SMBUS_READ, command,
-			       I2C_SMBUS_BLOCK_DATA, &data);
-	if (err < 0)
-		return err;
-
-	for (i = 1; i <= data.block[0]; i++)
-		values[i-1] = data.block[i];
-	return data.block[0];
-}
-
-__s32 i2c_smbus_write_block_data(int file, __u8 command, __u8 length,
-				 const __u8 *values)
-{
-	union i2c_smbus_data data;
-	int i;
-	if (length > I2C_SMBUS_BLOCK_MAX)
-		length = I2C_SMBUS_BLOCK_MAX;
-	for (i = 1; i <= length; i++)
-		data.block[i] = values[i-1];
-	data.block[0] = length;
-	return i2c_smbus_access(file, I2C_SMBUS_WRITE, command,
-				I2C_SMBUS_BLOCK_DATA, &data);
-}
-
-/* Returns the number of read bytes */
-/* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you
-   ask for less than 32 bytes, your code will only work with kernels
-   2.6.23 and later. */
-__s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 length,
-				    __u8 *values)
-{
-	union i2c_smbus_data data;
-	int i, err;
-
-	if (length > I2C_SMBUS_BLOCK_MAX)
-		length = I2C_SMBUS_BLOCK_MAX;
-	data.block[0] = length;
-
-	err = i2c_smbus_access(file, I2C_SMBUS_READ, command,
-			       length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN :
-				I2C_SMBUS_I2C_BLOCK_DATA, &data);
-	if (err < 0)
-		return err;
-
-	for (i = 1; i <= data.block[0]; i++)
-		values[i-1] = data.block[i];
-	return data.block[0];
-}
-
-__s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, __u8 length,
-				     const __u8 *values)
-{
-	union i2c_smbus_data data;
-	int i;
-	if (length > I2C_SMBUS_BLOCK_MAX)
-		length = I2C_SMBUS_BLOCK_MAX;
-	for (i = 1; i <= length; i++)
-		data.block[i] = values[i-1];
-	data.block[0] = length;
-	return i2c_smbus_access(file, I2C_SMBUS_WRITE, command,
-				I2C_SMBUS_I2C_BLOCK_BROKEN, &data);
-}
-
-/* Returns the number of read bytes */
-__s32 i2c_smbus_block_process_call(int file, __u8 command, __u8 length,
-				   __u8 *values)
-{
-	union i2c_smbus_data data;
-	int i, err;
-
-	if (length > I2C_SMBUS_BLOCK_MAX)
-		length = I2C_SMBUS_BLOCK_MAX;
-	for (i = 1; i <= length; i++)
-		data.block[i] = values[i-1];
-	data.block[0] = length;
-
-	err = i2c_smbus_access(file, I2C_SMBUS_WRITE, command,
-			       I2C_SMBUS_BLOCK_PROC_CALL, &data);
-	if (err < 0)
-		return err;
-
-	for (i = 1; i <= data.block[0]; i++)
-		values[i-1] = data.block[i];
-	return data.block[0];
-}
diff --git a/peripheral_manager/src/src/smbus.h b/peripheral_manager/src/src/smbus.h
deleted file mode 100644
index b7facf6b8105a2981aa44e232f467d4ad6cf3d6e..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/smbus.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-    smbus.h - SMBus level access helper functions
-
-    Copyright (C) 1995-97 Simon G. Vogl
-    Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-    MA 02110-1301 USA.
-*/
-
-#ifndef LIB_I2C_SMBUS_H
-#define LIB_I2C_SMBUS_H
-
-#include <linux/types.h>
-#include <linux/i2c.h>
-
-extern __s32 i2c_smbus_access(int file, char read_write, __u8 command,
-			      int size, union i2c_smbus_data *data);
-
-extern __s32 i2c_smbus_write_quick(int file, __u8 value);
-extern __s32 i2c_smbus_read_byte(int file);
-extern __s32 i2c_smbus_write_byte(int file, __u8 value);
-extern __s32 i2c_smbus_read_byte_data(int file, __u8 command);
-extern __s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value);
-extern __s32 i2c_smbus_read_word_data(int file, __u8 command);
-extern __s32 i2c_smbus_write_word_data(int file, __u8 command, __u16 value);
-extern __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value);
-
-/* Returns the number of read bytes */
-extern __s32 i2c_smbus_read_block_data(int file, __u8 command, __u8 *values);
-extern __s32 i2c_smbus_write_block_data(int file, __u8 command, __u8 length,
-					const __u8 *values);
-
-/* Returns the number of read bytes */
-/* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you
-   ask for less than 32 bytes, your code will only work with kernels
-   2.6.23 and later. */
-extern __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 length,
-					   __u8 *values);
-extern __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, __u8 length,
-					    const __u8 *values);
-
-/* Returns the number of read bytes */
-extern __s32 i2c_smbus_block_process_call(int file, __u8 command, __u8 length,
-					  __u8 *values);
-
-#endif /* LIB_I2C_SMBUS_H */
diff --git a/peripheral_manager/src/src/sx9512.c b/peripheral_manager/src/src/sx9512.c
deleted file mode 100755
index 85ed74ec05ddf95c2e0a8a8e341fcb6acaf7dedd..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/sx9512.c
+++ /dev/null
@@ -1,348 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <error.h>
-#include <errno.h>
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-#include "sx9512.h"
-#include "smbus.h"
-#include "i2c.h"
-#include "gpio.h"
-
-
-#define X(name, reserved, default) { #name, reserved, default },
-const struct sx9512_reg_data sx9512_reg_data[] = { SX9512_REGS };
-#undef X
-
-
-//! init the sx9512 and optionally program the registers
-
-//! @param addr I2C address (0=0x2c)
-//! @param nvm compare and if different program the registers and flash the NVM with these contents
-//! @return file descriptor for SX9512 I2C device
-//! @retval -1 error
-int sx9512_init(const char *dev, int addr, struct sx9512_reg_nvm *nvm)
-{
-	int fd, i;
-	struct sx9512_reg_nvm nvm_read;
-	if(!addr)
-		addr=SX9512_I2C_ADDRESS;
-	if((fd=i2c_open_dev(dev, addr, I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE))<0)
-		return -1;
-	/*fd = open(dev, O_RDWR);
-	if(fd < 0) {
-		error(0, errno, "could not open %s", dev);
-		return -1;
-	}
-	if(ioctl(fd, I2C_SLAVE, addr) < 0) {
-		error(0, errno, "could not set address %x for i2c chip", SX9512_I2C_ADDRESS);
-		close(fd);
-		return -1;
-	}*/
-	if(nvm) {
-		if(sx9512_reg_nvm_read(fd, &nvm_read)) {
-			close(fd);
-			return -1;
-		}
-		for(i=0;(unsigned int)i<sizeof(struct sx9512_reg_nvm);i++) {
-			if(sx9512_reg_reserved(i+SX9512_REG_NVM_AREA_START))
-				continue;
-			if(((uint8_t *)nvm)[i] != ((uint8_t *)&nvm_read)[i]) {
-				fprintf(stderr, "sx9512_init: register mismatch, setting default values and burning to NVM\n");
-				if(sx9512_reg_nvm_write(fd, nvm)) {
-					close(fd);
-					return -1;
-				}
-				sx9512_reg_nvm_store(fd); //store to NVM
-				break;
-			}
-		}
-	}
-	return fd;
-}
-
-
-const char *sx9512_reg_name(sx9512_reg_t reg)
-{
-	return sx9512_reg_data[reg].name;
-}
-
-
-//! SX9512 check if reg is reserved
-int sx9512_reg_reserved(sx9512_reg_t reg)
-{
-	if(reg==SX9512_REG_I2C_SOFT_RESET)
-		return 0;
-	if(reg>=SX9512_REGS_AMOUNT)
-		return 1;
-	return sx9512_reg_data[reg].reserved;
-}
-
-
-//! send reset command
-
-//! @retval 0 ok
-int sx9512_reset(int fd)
-{
-	if(i2c_smbus_write_byte_data(fd, SX9512_REG_I2C_SOFT_RESET, 0xde)<0)
-		return -1;
-	if(i2c_smbus_write_byte_data(fd, SX9512_REG_I2C_SOFT_RESET, 0x00)<0)
-		return -1;
-	return 0;
-}
-
-
-//! send reset command but retain LED values
-
-//! @retval 0 ok
-int sx9512_reset_restore_led_state(int fd)
-{
-	int r;
-	uint8_t p[4];
-	if((r=i2c_smbus_read_i2c_block_data(fd, SX9512_REG_LED1_ON, 4, (__u8 *)&p))<0)
-		return r;
-	if(sx9512_reset(fd))
-		return -1;
-	if((r=i2c_smbus_write_i2c_block_data(fd, SX9512_REG_LED1_ON, 4, (__u8 *)&p))<0)
-		return r;
-	return 0;
-}
-
-
-//! read interrupt reg
-
-//! @retval -1 error
-int sx9512_read_interrupt(int fd)
-{
-	int r;
-	if((r=i2c_smbus_read_byte_data(fd, SX9512_REG_IRQ_SRC))<0)
-		return -1;
-	return r;
-}
-
-
-//! read touch reg
-
-//! @retval -1 error
-int sx9512_read_buttons(int fd)
-{
-	int r;
-	if((r=i2c_smbus_read_byte_data(fd, SX9512_REG_TOUCH_STATUS))<0)
-		return -1;
-	return r;
-}
-
-
-//! read prox reg
-
-//! @retval -1 error
-int sx9512_read_proximity(int fd)
-{
-	int r;
-	if((r=i2c_smbus_read_byte_data(fd, SX9512_REG_PROX_STATUS))<0)
-		return -1;
-	return r;
-}
-
-
-//! read status regs
-
-//! @retval 0 ok
-int sx9512_read_status(int fd, struct sx9512_reg_status *status)
-{
-	//REG_IRQ_SRC not working if using block read for some reason.
-	//if(i2c_smbus_read_i2c_block_data(fd, SX9512_REG_IRQ_SRC, sizeof(struct sx9512_reg_status), (uint8_t *)status)<0)
-		//return -1;
-	int r;
-	if((r=i2c_smbus_read_byte_data(fd, SX9512_REG_IRQ_SRC))<0)
-		return -1;
-	((uint8_t *)status)[0]=r;
-	if((r=i2c_smbus_read_byte_data(fd, SX9512_REG_TOUCH_STATUS))<0)
-		return -1;
-	((uint8_t *)status)[1]=r;
-	if((r=i2c_smbus_read_byte_data(fd, SX9512_REG_PROX_STATUS))<0)
-		return -1;
-	((uint8_t *)status)[2]=r;
-	return 0;
-}
-
-
-//! read status cached
-
-//! @retval 0 ok
-int sx9512_read_status_cached(int fd, struct sx9512_touch_state *touch_state)
-{
-	static uint8_t last_state=0;
-	struct sx9512_reg_status status;
-	touch_state->touched=0;
-	touch_state->released=0;
-	if(sx9512_read_status(fd, &status))
-		error(-1, errno, "I2C read error");
-	touch_state->state=status.touch_status | !!((*(uint8_t *)&status.prox_status) & 0xc0);
-	if(*(uint8_t *)&status.irq_src) {
-		if(status.irq_src.touch || status.irq_src.prox_near)
-			touch_state->touched = (last_state ^ touch_state->state) & touch_state->state;
-		if(status.irq_src.release || status.irq_src.prox_far)
-			touch_state->released = (last_state ^ touch_state->state) & last_state;
-	}
-	last_state=touch_state->state;
-	return 0;
-}
-
-
-//! send cmd to load values from NVM to RAM
-
-//! @retval 0 ok
-int sx9512_reg_nvm_load(int fd)
-{
-	if(i2c_smbus_write_byte_data(fd, SX9512_REG_NVM_CTRL, 0x08)<0)
-		return -1;
-	return 0;
-}
-
-
-//! send cmd to store RAM to NVM
-
-//! @retval 0 ok
-int sx9512_reg_nvm_store(int fd)
-{
-	if(i2c_smbus_write_byte_data(fd, SX9512_REG_NVM_CTRL, 0x50)<0)
-		return -1;
-	if(i2c_smbus_write_byte_data(fd, SX9512_REG_NVM_CTRL, 0xa0)<0)
-		return -1;
-	//Wait 500ms then power off/on
-	sleep(1);
-	return 0;
-}
-
-
-//! read whole NVM region
-
-//! @retval 0 ok
-int sx9512_reg_nvm_read(int fd, struct sx9512_reg_nvm *p)
-{
-	int r, s, i, rl;
-	s=sizeof(struct sx9512_reg_nvm);
-	for(i=0; i<s; i+=32) {
-		rl=s-i;
-		if(rl>32)
-			rl=32;
-		if((r=i2c_smbus_read_i2c_block_data(fd, SX9512_REG_NVM_AREA_START+i, rl, (uint8_t *)p+i))<0)
-			return -1;
-	}
-	return 0;
-}
-
-
-//! write whole NVM region
-
-//! @retval 0 ok
-int sx9512_reg_nvm_write(int fd, struct sx9512_reg_nvm *p)
-{
-	int r, s, i, rl;
-	s=sizeof(struct sx9512_reg_nvm);
-	for(i=0; i<s; i+=32) {
-		rl=s-i;
-		if(rl>32)
-			rl=32;
-		if((r=i2c_smbus_write_i2c_block_data(fd, SX9512_REG_NVM_AREA_START+i, rl, (uint8_t *)p+i))<0)
-			return -1;
-	}
-	return 0;
-}
-
-
-//! init NVM struct
-void sx9512_reg_nvm_init(struct sx9512_reg_nvm *p)
-{
-	memset(p, 0, sizeof(struct sx9512_reg_nvm));
-	p->cap_sense_op.set_to_0x14=0x14;
-}
-
-
-//! init NVM struct to defaults
-void sx9512_reg_nvm_init_defaults(struct sx9512_reg_nvm *p, uint8_t capsense_channels, uint8_t led_channels)
-{
-	int i;
-	sx9512_reg_nvm_init(p);
-	p->irq_mask.touch=1;
-	p->irq_mask.release=1;
-	p->irq_mask.prox_near=1;
-	p->irq_mask.prox_far=1;
-	if(led_channels) {
-		p->led_map[0]=0x00;
-		//p->led_map[1]=led_channels;
-		p->led_map[1]=0x00; //default all leds off
-		p->led_pwm_freq=0x10;
-		p->led_idle=0xff;
-		p->led1_on=0xff;
-		p->led2_on=0xff;
-		p->led_pwr_idle=0xff;
-		p->led_pwr_on=0xff;
-	}
-	p->cap_sense_enable=capsense_channels;
-	for(i=0;i<SX9512_CHANNELS+1;i++) {
-		p->cap_sense_range[i].ls_control=0x01;
-		p->cap_sense_range[i].delta_cin_range=0x03;
-		p->cap_sense_thresh[i]=0x04;
-	}
-	p->cap_sense_thresh[0]=0x02;
-	p->cap_sense_op.auto_compensation=0;
-	p->cap_sense_op.proximity_bl0=1;
-	p->cap_sense_op.proximity_combined_channels=0;
-	p->cap_sense_mode.raw_filter=0x03;
-	p->cap_sense_mode.touch_reporting=1;
-	p->cap_sense_mode.cap_sense_digital_gain=0;
-	p->cap_sense_mode.cap_sense_report_mode=0;
-	p->cap_sense_debounce.cap_sense_prox_near_debounce=0;
-	p->cap_sense_debounce.cap_sense_prox_far_debounce=0;
-	p->cap_sense_debounce.cap_sense_touch_debounce=0;
-	p->cap_sense_debounce.cap_sense_release_debounce=1;
-	p->cap_sense_neg_comp_thresh=0x80;
-	p->cap_sense_pos_comp_thresh=0x80;
-	p->cap_sense_pos_filt.cap_sense_prox_hyst=0;
-	p->cap_sense_pos_filt.cap_sense_pos_comp_debounce=2;
-	p->cap_sense_pos_filt.cap_sense_avg_pos_filt_coef=7;
-	p->cap_sense_neg_filt.cap_sense_touch_hyst=0;
-	p->cap_sense_neg_filt.cap_sense_neg_comp_debounce=2;
-	p->cap_sense_neg_filt.cap_sense_avg_neg_filt_coef=5;
-	p->spo_chan_map=0xff;
-}
-
-
-void sx9512_reg_nvm_init_cg300(struct sx9512_reg_nvm *p)
-{
-	int i;
-	sx9512_reg_nvm_init_defaults(p, 0x0f, 0x3c);
-	p->led_map[0]=0x01;
-	p->led_map[1]=0x3c;
-	for(i=0;i<SX9512_CHANNELS+1;i++) {
-		p->cap_sense_range[i].delta_cin_range=0x01;
-	}
-}
-
-
-void sx9512_reg_nvm_init_cg301(struct sx9512_reg_nvm *p)
-{
-	int i;
-	sx9512_reg_nvm_init_defaults(p, 0x3b, 0x7f);
-	p->led_map[1]=0x7f;
-	for(i=0;i<SX9512_CHANNELS+1;i++) {
-		p->cap_sense_range[i].delta_cin_range=0x01;
-	}
-}
-
-
-void sx9512_reg_nvm_init_eg300(struct sx9512_reg_nvm *p)
-{
-	sx9512_reg_nvm_init_defaults(p, 0x0f, 0xff);
-}
-
-
-void sx9512_reg_nvm_init_dg400(struct sx9512_reg_nvm *p)
-{
-	sx9512_reg_nvm_init_defaults(p, 0x3f, 0x00);
-}
diff --git a/peripheral_manager/src/src/sx9512.h b/peripheral_manager/src/src/sx9512.h
deleted file mode 100755
index bfc365090a64e3142161fc945e6c70182ca743eb..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/sx9512.h
+++ /dev/null
@@ -1,605 +0,0 @@
-#ifndef _SX9512_H
-#define _SX9512_H
-
-#include <stdint.h>
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define BIT_ORDER_BIG_ENDIAN
-#endif
-
-#define SX9512_I2C_ADDRESS  0x2b
-#define SX9512B_I2C_ADDRESS 0x2d
-#define SX9512_CHANNELS 8
-
-#define SX9512_REG_NVM_AREA_START 0x07
-#define SX9512_REG_NVM_AREA_END   0x62
-
-#define SX9512_REG_I2C_SOFT_RESET 0xff
-
-//Name,                reserved, default value
-#define SX9512_REGS \
-X(IRQ_SRC,                    0, 0x00) \
-X(TOUCH_STATUS,               0, 0x00) \
-X(PROX_STATUS,                0, 0x00) \
-X(COMP_STATUS,                0, 0x00) \
-X(NVM_CTRL,                   0, 0x00) \
-X(R_05,                       1, 0x00) \
-X(R_06,                       1, 0x00) \
-X(SPO2_MODE,                  0, 0x00) \
-X(PWR_KEY,                    0, 0x00) \
-X(IRQ_MASK,                   0, 0x00) \
-X(R_0A,                       1, 0x00) \
-X(R_0B,                       1, 0x00) \
-X(LED_MAP1,                   0, 0x00) \
-X(LED_MAP2,                   0, 0x00) \
-X(LED_PWM_FREQ,               0, 0x00) \
-X(LED_MODE,                   0, 0x00) \
-X(LED_IDLE,                   0, 0x00) \
-X(LED_OFF_DELAY,              0, 0x00) \
-X(LED1_ON,                    0, 0x00) \
-X(LED1_FADE,                  0, 0x00) \
-X(LED2_ON,                    0, 0x00) \
-X(LED2_FADE,                  0, 0x00) \
-X(LED_PWR_IDLE,               0, 0x00) \
-X(LED_PWR_ON,                 0, 0x00) \
-X(LED_PWR_OFF,                0, 0x00) \
-X(LED_PWR_FADE,               0, 0x00) \
-X(LED_PWR_ON_PW,              0, 0x00) \
-X(LED_PWR_MODE,               0, 0x00) \
-X(R_1C,                       1, 0x00) \
-X(R_1D,                       1, 0x00) \
-X(CAP_SENSE_ENABLE,           0, 0x00) \
-X(CAP_SENSE_RANGE0,           0, 0x00) \
-X(CAP_SENSE_RANGE1,           0, 0x00) \
-X(CAP_SENSE_RANGE2,           0, 0x00) \
-X(CAP_SENSE_RANGE3,           0, 0x00) \
-X(CAP_SENSE_RANGE4,           0, 0x00) \
-X(CAP_SENSE_RANGE5,           0, 0x00) \
-X(CAP_SENSE_RANGE6,           0, 0x00) \
-X(CAP_SENSE_RANGE7,           0, 0x00) \
-X(CAP_SENSE_RANGE_ALL,        0, 0x00) \
-X(CAP_SENSE_THRESH0,          0, 0x00) \
-X(CAP_SENSE_THRESH1,          0, 0x00) \
-X(CAP_SENSE_THRESH2,          0, 0x00) \
-X(CAP_SENSE_THRESH3,          0, 0x00) \
-X(CAP_SENSE_THRESH4,          0, 0x00) \
-X(CAP_SENSE_THRESH5,          0, 0x00) \
-X(CAP_SENSE_THRESH6,          0, 0x00) \
-X(CAP_SENSE_THRESH7,          0, 0x00) \
-X(CAP_SENSE_THRESH_COMB,      0, 0x00) \
-X(CAP_SENSE_OP,               0, 0x00) \
-X(CAP_SENSE_MODE,             0, 0x00) \
-X(CAP_SENSE_DEBOUNCE,         0, 0x00) \
-X(CAP_SENSE_NEG_COMP_THRESH,  0, 0x00) \
-X(CAP_SENSE_POS_COMP_THRESH,  0, 0x00) \
-X(CAP_SENSE_POS_FILT,         0, 0x00) \
-X(CAP_SENSE_NEG_FILT,         0, 0x00) \
-X(CAP_SENSE_STUCK,            0, 0x00) \
-X(CAP_SENSE_FRAME_SKIP,       0, 0x00) \
-X(CAP_SENSE_MISC,             0, 0x00) \
-X(PROX_COMB_CHAN_MASK,        0, 0x00) \
-X(R_3C,                       1, 0x00) \
-X(R_3D,                       1, 0x00) \
-X(SPO_CHAN_MAP,               0, 0x00) \
-X(SPO_LEVEL_BL0,              0, 0x00) \
-X(SPO_LEVEL_BL1,              0, 0x00) \
-X(SPO_LEVEL_BL2,              0, 0x00) \
-X(SPO_LEVEL_BL3,              0, 0x00) \
-X(SPO_LEVEL_BL4,              0, 0x00) \
-X(SPO_LEVEL_BL5,              0, 0x00) \
-X(SPO_LEVEL_BL6,              0, 0x00) \
-X(SPO_LEVEL_BL7,              0, 0x00) \
-X(SPO_LEVEL_IDLE,             0, 0x00) \
-X(SPO_LEVEL_PROX,             0, 0x00) \
-X(R_49,                       1, 0x00) \
-X(R_4A,                       1, 0x00) \
-X(BUZZER_TRIGGER,             0, 0x00) \
-X(BUZZER_FREQ,                0, 0x00) \
-X(R_4D,                       1, 0x00) \
-X(R_4E,                       1, 0x00) \
-X(R_4F,                       1, 0x00) \
-X(R_50,                       1, 0x00) \
-X(R_51,                       1, 0x00) \
-X(R_52,                       1, 0x00) \
-X(R_53,                       1, 0x00) \
-X(R_54,                       1, 0x00) \
-X(R_55,                       1, 0x00) \
-X(R_56,                       1, 0x00) \
-X(R_57,                       1, 0x00) \
-X(R_58,                       1, 0x00) \
-X(R_59,                       1, 0x00) \
-X(R_5A,                       1, 0x00) \
-X(R_5B,                       1, 0x00) \
-X(R_5C,                       1, 0x00) \
-X(R_5D,                       1, 0x00) \
-X(R_5E,                       1, 0x00) \
-X(R_5F,                       1, 0x00) \
-X(R_60,                       1, 0x00) \
-X(R_61,                       1, 0x00) \
-X(CAP_SENSE_CHAN_SELECT,      0, 0x00) \
-X(CAP_SENSE_USEFUL_DATA_MSB,  0, 0x00) \
-X(CAP_SENSE_USEFUL_DATA_LSB,  0, 0x00) \
-X(CAP_SENSE_AVERAGE_DATA_MSB, 0, 0x00) \
-X(CAP_SENSE_AVERAGE_DATA_LSB, 0, 0x00) \
-X(CAP_SENSE_DIFF_DATA_MSB,    0, 0x00) \
-X(CAP_SENSE_DIFF_DATA_LSB,    0, 0x00) \
-X(CAP_SENSE_COMP_MSB,         0, 0x00) \
-X(CAP_SENSE_COMP_LSB,         0, 0x00)
-
-
-#define X(name, reserved, default) SX9512_REG_##name,
-typedef enum { SX9512_REGS SX9512_REGS_AMOUNT } sx9512_reg_t;
-#undef X
-
-
-struct sx9512_reg_data {
-	const char *name;
-	uint8_t reserved, default_value;
-};
-
-
-//! Interrupt source
-
-//! The Irq Source register will indicate that the specified event has occurred since the last read of this register. If the
-//! NIRQ function is selected for SPO2 then it will indicate the occurrence of any of these events that are not masked
-//! out in register 0x09.
-//! The Irq mask in register 0x09 will prevent an Irq from being indicated by the NIRQ pin but it will not prevent the
-//! IRQ from being noted in this register.
-struct sx9512_reg_irq_src {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t reset:1;
-	uint8_t touch:1;
-	uint8_t release:1;
-	uint8_t prox_near:1;         //!< proximity on
-	uint8_t prox_far:1;          //!< proximity off
-	uint8_t compensation_done:1; //!< write 1 to trigger compensation on all channels
-	uint8_t conversion_done:1;
-	uint8_t :1;
-#else
-	uint8_t :1;
-	uint8_t conversion_done:1;
-	uint8_t compensation_done:1; //!< write 1 to trigger compensation on all channels
-	uint8_t prox_far:1;          //!< proximity off
-	uint8_t prox_near:1;         //!< proximity on
-	uint8_t release:1;
-	uint8_t touch:1;
-	uint8_t reset:1;
-#endif
-} __attribute__((__packed__));
-
-
-//! Proximity status
-struct sx9512_reg_prox_status {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t prox_bl0:1;                //!< proximity detected on BL0
-	uint8_t prox_multi:1;              //!< proximity detected on combined channels
-	uint8_t prox_multi_comp_pending:1; //!< compensation pending for combined channel prox sensing
-	uint8_t :5;
-#else
-	uint8_t :5;
-	uint8_t prox_multi_comp_pending:1; //!< compensation pending for combined channel prox sensing
-	uint8_t prox_multi:1;              //!< proximity detected on combined channels
-	uint8_t prox_bl0:1;                //!< proximity detected on BL0
-#endif
-} __attribute__((__packed__));
-
-
-//! NVM Control
-
-//! The NVM Area field indicates which of the user NVM areas are currently programmed and active (1, 2 or 3). The
-//! NVM Read bit gives the ability to manually request that the contents of the NVM be transferred to the registers
-//! and NVM Burn field gives the ability to burn the current registers to the next available NVM area.
-//! Normally, the transfer of data from the NVM to the registers is done automatically on power up and upon a reset
-//! but occasionally a user might want to force a read manually.
-//! Registers 0x07 through 0x62 are stored to NVM and loaded from NVM.
-//! After writing 0xA0 (ie NVM burn), wait for at least 500ms and then power off-on the IC for changes to be effective.
-//! Caution, there are only three user areas and attempts to burn values beyond user area 3 will be ignored. 
-struct sx9512_reg_nvm_ctrl {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t nvm_burn:4; //!< write 0x50 followed by 0xA0 to initiate transfer of reg 0x07-0x62 to NVM
-	uint8_t nvm_read:1; //!< trigger NVM read to registers
-	uint8_t nvm_area:3; //!< indicates current active NVM area
-#else
-	uint8_t nvm_area:3; //!< indicates current active NVM area
-	uint8_t nvm_read:1; //!< trigger NVM read to registers
-	uint8_t nvm_burn:4; //!< write 0x50 followed by 0xA0 to initiate transfer of reg 0x07-0x62 to NVM
-#endif
-} __attribute__((__packed__));
-
-
-//! SPO2 Mode Control
-
-//! The SPO2 Config field will specify the functionality of the SPO pin. When selected as NIRQ, the open drain output
-//! will go low whenever a non-masked Irq occurs and the NIRQ will go back high after a register 0x00 is read over
-//! the I2C. When selected as Buzzer, the SPO2 pin will drive a 2 phase 2 frequency signal onto an external buzzer
-//! for each specified event (see Buzzer section). When selected as SPO2, pin operates as an analog output similar
-//! to SPO1 (see SPO section). If selected as TV power state, the pin is driven from the system PMIC with a high
-//! (SPO2 = SVDD) indicating that the system power is on and a low (SPO2 = GND) when the system power is off.
-//! The TV Power State bit reads back the current state of SPO2 if SPO2 is selected for TV power state, otherwise
-//! the system should write to this bit to indicate the current system power state. The SX9512/12B/13/13B needs to
-//! know the current state in able to correctly process some of the LED modes for the Power Button (see LED
-//! modes). 
-struct sx9512_reg_spo2_mode {
-	#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t :1;
-	uint8_t spo2_config:2;    //!< set function of SPO2 pin
-	uint8_t tv_power_state:1; //!< if SPO2 set to TV power state input then TV power state indicated by this bit.
-	uint8_t :4;
-#else
-	uint8_t :4;
-	uint8_t tv_power_state:1; //!< if SPO2 set to TV power state input then TV power state indicated by this bit.
-	uint8_t spo2_config:2;    //!< set function of SPO2 pin
-	uint8_t :1;
-#endif
-} __attribute__((__packed__));
-
-
-//! Interrupt Request Mask
-
-//! Set which Irqs will trigger an NIRQ (if enabled on SPO2) and report in reg 0x00
-//! 0=Disable IRQ
-//! 1=Enable IRQ
-struct sx9512_reg_irq_mask {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t reset:1;
-	uint8_t touch:1;
-	uint8_t release:1;
-	uint8_t prox_near:1; //!< proximity on
-	uint8_t prox_far:1;  //!< proximity off
-	uint8_t compensation_done:1;
-	uint8_t :2;
-#else
-	uint8_t :2;
-	uint8_t compensation_done:1;
-	uint8_t prox_far:1;  //!< proximity off
-	uint8_t prox_near:1; //!< proximity on
-	uint8_t release:1;
-	uint8_t touch:1;
-	uint8_t reset:1;
-#endif
-} __attribute__((__packed__));
-
-
-//! LED Mode
-struct sx9512_reg_led_mode {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t led_fade_repeat:4;
-	uint8_t :1;
-	uint8_t led_fading:1;
-	uint8_t led_mode:2;
-#else
-	uint8_t led_mode:2;
-	uint8_t led_fading:1;
-	uint8_t :1;
-	uint8_t led_fade_repeat:4;
-#endif
-} __attribute__((__packed__));
-
-
-//! LED off delay
-struct sx9512_reg_led_off_delay {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t led_engine1_delay_off_time:4;
-	uint8_t led_engine2_delay_off_time:4;
-#else
-	uint8_t led_engine2_delay_off_time:4;
-	uint8_t led_engine1_delay_off_time:4;
-#endif
-} __attribute__((__packed__));
-
-
-//! LED Engine fade in/out timing
-struct sx9512_reg_led_fade {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t led_engine_fade_in_time:4;
-	uint8_t led_engine_fade_out_time:4;
-#else
-	uint8_t led_engine_fade_out_time:4;
-	uint8_t led_engine_fade_in_time:4;
-#endif
-} __attribute__((__packed__));
-
-
-//! LED power button mode
-struct sx9512_reg_led_pwr_mode {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t power_led_off_mode:1;
-	uint8_t power_led_max_level:1;
-	uint8_t power_led_breath_max:1;
-	uint8_t power_led_waveform:1;
-	uint8_t :2;
-	uint8_t power_button_enable:1;
-	uint8_t led_touch_poarity_invert:1;
-#else
-	uint8_t led_touch_poarity_invert:1;
-	uint8_t power_button_enable:1;
-	uint8_t :2;
-	uint8_t power_led_waveform:1;
-	uint8_t power_led_breath_max:1;
-	uint8_t power_led_max_level:1;
-	uint8_t power_led_off_mode:1;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense delta Cin range and LS control
-struct sx9512_reg_cap_sense_range {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t ls_control:2;
-	uint8_t :4;
-	uint8_t delta_cin_range:2;
-#else
-	uint8_t delta_cin_range:2;
-	uint8_t :4;
-	uint8_t ls_control:2;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense auto compensation, proximity on BL0 and combined channel proximity
-struct sx9512_reg_cap_sense_op {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t auto_compensation:1;
-	uint8_t proximity_bl0:1;
-	uint8_t proximity_combined_channels:1;
-	uint8_t set_to_0x14:5;
-#else
-	uint8_t set_to_0x14:5;
-	uint8_t proximity_combined_channels:1;
-	uint8_t proximity_bl0:1;
-	uint8_t auto_compensation:1;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense raw data filter coef, digital gain, I2C touch reporting and CapSense
-struct sx9512_reg_cap_sense_mode {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t raw_filter:3;
-	uint8_t touch_reporting:1;
-	uint8_t cap_sense_digital_gain:2;
-	uint8_t cap_sense_report_mode:2;
-#else
-	uint8_t cap_sense_report_mode:2;
-	uint8_t cap_sense_digital_gain:2;
-	uint8_t touch_reporting:1;
-	uint8_t raw_filter:3;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense debounce
-struct sx9512_reg_cap_sense_debounce {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t cap_sense_prox_near_debounce:2;
-	uint8_t cap_sense_prox_far_debounce:2;
-	uint8_t cap_sense_touch_debounce:2;
-	uint8_t cap_sense_release_debounce:2;
-#else
-	uint8_t cap_sense_release_debounce:2;
-	uint8_t cap_sense_touch_debounce:2;
-	uint8_t cap_sense_prox_far_debounce:2;
-	uint8_t cap_sense_prox_near_debounce:2;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense positive filter coef, positive auto compensation debounce and proximity hyst
-struct sx9512_reg_cap_sense_pos_filt {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t cap_sense_prox_hyst:3;
-	uint8_t cap_sense_pos_comp_debounce:2;
-	uint8_t cap_sense_avg_pos_filt_coef:3;
-#else
-	uint8_t cap_sense_avg_pos_filt_coef:3;
-	uint8_t cap_sense_pos_comp_debounce:2;
-	uint8_t cap_sense_prox_hyst:3;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense negative filter coef, negative auto compensation debounce and touch hyst
-struct sx9512_reg_cap_sense_neg_filt {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t cap_sense_touch_hyst:3;
-	uint8_t cap_sense_neg_comp_debounce:2;
-	uint8_t cap_sense_avg_neg_filt_coef:3;
-#else
-	uint8_t cap_sense_avg_neg_filt_coef:3;
-	uint8_t cap_sense_neg_comp_debounce:2;
-	uint8_t cap_sense_touch_hyst:3;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense stuck-at timer and periodic compensation timer
-struct sx9512_reg_cap_sense_stuck {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t cap_sense_stuck_at_timer:4;
-	uint8_t cap_sense_periodic_comp:4;
-#else
-	uint8_t cap_sense_periodic_comp:4;
-	uint8_t cap_sense_stuck_at_timer:4;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense frame skip setting from active and sleep
-struct sx9512_reg_cap_sense_frame_skip {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t cap_sense_active_frame_skip:4;
-	uint8_t cap_sense_sleep_frame_skip:4;
-#else
-	uint8_t cap_sense_sleep_frame_skip:4;
-	uint8_t cap_sense_active_frame_skip:4;
-#endif
-} __attribute__((__packed__));
-
-
-//! CapSense sleep enable, auto compensation channels threshold, inactive BL control
-struct sx9512_reg_cap_sense_misc {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t :2;
-	uint8_t comp_chan_num_thresh:2;
-	uint8_t cap_sense_sleep_mode_enable:1;
-	uint8_t :1;
-	uint8_t cap_sense_inactive_bl_mode:2;
-#else
-	uint8_t cap_sense_inactive_bl_mode:2;
-	uint8_t :1;
-	uint8_t cap_sense_sleep_mode_enable:1;
-	uint8_t comp_chan_num_thresh:2;
-	uint8_t :2;
-#endif
-} __attribute__((__packed__));
-
-
-//! SPO analog output for proximity
-struct sx9512_reg_spo_level_prox {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t spo_report_prox:1;
-	uint8_t spo_prox_channel_mapping:1;
-	uint8_t spo_level_prox:6;
-#else
-	uint8_t spo_level_prox:6;
-	uint8_t spo_prox_channel_mapping:1;
-	uint8_t spo_report_prox:1;
-#endif
-} __attribute__((__packed__));
-
-
-//! Buzzer trigger event selection
-struct sx9512_reg_buzzer_trigger {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t :3;
-	uint8_t buzzer_near:1;
-	uint8_t buzzer_far:1;
-	uint8_t buzzer_touch:1;
-	uint8_t buzzer_release:1;
-	uint8_t buzzer_idle_level:1;
-#else
-	uint8_t buzzer_idle_level:1;
-	uint8_t buzzer_release:1;
-	uint8_t buzzer_touch:1;
-	uint8_t buzzer_far:1;
-	uint8_t buzzer_near:1;
-	uint8_t :3;
-#endif
-} __attribute__((__packed__));
-
-
-//! Buzzer duration frequency
-struct sx9512_reg_buzzer_freq {
-#ifdef BIT_ORDER_BIG_ENDIAN
-	uint8_t buzzer_phase1_duration:2;
-	uint8_t buzzer_phase1_freq:2;
-	uint8_t buzzer_phase2_duration:2;
-	uint8_t buzzer_phase2_freq:2;
-#else
-	uint8_t buzzer_phase2_freq:2;
-	uint8_t buzzer_phase2_duration:2;
-	uint8_t buzzer_phase1_freq:2;
-	uint8_t buzzer_phase1_duration:2;
-#endif
-} __attribute__((__packed__));
-
-
-struct sx9512_reg_nvm {
-	struct sx9512_reg_spo2_mode       spo2_mode;            //!< SPO2 mode control
-	uint8_t                           pwr_key;              //!< Power key control
-	struct sx9512_reg_irq_mask        irq_mask;             //!< Interrupt request mask
-	uint8_t                           reserved_0a[2];
-	uint8_t                           led_map[2];           //!< LED map for engine 1/2
-	uint8_t                           led_pwm_freq;         //!< LED PWM frequency
-	struct sx9512_reg_led_mode        led_mode;             //!< LED mode
-	uint8_t                           led_idle;             //!< LED idle level
-	struct sx9512_reg_led_off_delay   led_off_delay;        //!< LED off delay
-	uint8_t                           led1_on;              //!< LED engine 1 on level
-	struct sx9512_reg_led_fade        led1_fade;            //!< LED engine 1 fade in/out time
-	uint8_t                           led2_on;              //!< LED engine 2 on level
-	struct sx9512_reg_led_fade        led2_fade;            //!< LED engine 2 fade in/out time
-	uint8_t                           led_pwr_idle;         //!< LED power button idle level
-	uint8_t                           led_pwr_on;           //!< LED power button on level
-	uint8_t                           led_pwr_off;          //!< LED power button off level
-	uint8_t                           led_pwr_fade;         //!< LED power button fade in/out time
-	uint8_t                           led_pwr_on_pw;        //!< LED power on pulse width
-	struct sx9512_reg_led_pwr_mode    led_pwr_mode;         //!< LED power button mode
-	uint8_t                           reserved_1c[2];
-	uint8_t                           cap_sense_enable;     //!< CapSense enable
-	struct sx9512_reg_cap_sense_range cap_sense_range[9];   //!< CapSense delta Cin range and LS control chan 0-7
-	//struct sx9512_reg_cap_sense_range cap_sense_range_all;  //!< CapSense delta Cin range and LS control for prox sensor (combined channels)
-	uint8_t                           cap_sense_thresh[9];  //!< CapSense detection threshold for chan 0-7
-	//uint8_t                           cap_sense_thesh_comb; //!< CapSense detection threshold for prox sensor (combined channels)
-	struct sx9512_reg_cap_sense_op    cap_sense_op;         //!< CapSense auto compensation, proximity on BL0 and combined channel proximity enable
-	struct sx9512_reg_cap_sense_mode  cap_sense_mode;       //!< CapSense raw data filter coef, digital gain, I2C touch reporting and CapSense reporting
-	struct sx9512_reg_cap_sense_debounce cap_sense_debounce; //!< CapSense debounce
-	uint8_t                           cap_sense_neg_comp_thresh; //!< CapSense negative auto compensation threshold
-	uint8_t                           cap_sense_pos_comp_thresh; //!< CapSense positive auto compensation threshold
-	struct sx9512_reg_cap_sense_pos_filt cap_sense_pos_filt; //!< CapSense positive filter coef, positive auto compensation debounce and proximity hyst
-	struct sx9512_reg_cap_sense_neg_filt cap_sense_neg_filt; //!< CapSense negative filter coef, negative auto compensation debounce and touch hyst
-	struct sx9512_reg_cap_sense_stuck cap_sense_stuck;      //!< CapSense stuck-at timer and periodic compensation timer
-	struct sx9512_reg_cap_sense_frame_skip cap_sense_frame_skip; //!< CapSense frame skip setting from active and sleep
-	struct sx9512_reg_cap_sense_misc  cap_sense_misc;       //!< CapSense sleep enable, auto compensation channels threshold, inactive BL control
-	uint8_t                           prox_comb_chan_mask;  //!< Proximity combined channel mode channel mapping
-	uint8_t                           reserved_3c[2];
-	uint8_t                           spo_chan_map;         //!< SPO channel mapping
-	uint8_t                           spo_level_bl[8];      //!< SPO analog output levels
-	uint8_t                           spo_level_idle;       //!< SPO analog output level for idle
-	struct sx9512_reg_spo_level_prox  spo_level_prox;       //!< SPO analog output for proximity
-	uint8_t                           reserved_49[2];
-	struct sx9512_reg_buzzer_trigger  buzzer_trigger;       //!< Buzzer trigger event selection
-	struct sx9512_reg_buzzer_freq     buzzer_freq;          //!< Buzzer duration frequency
-} __attribute__((__packed__));
-
-
-struct sx9512_reg {
-	struct sx9512_reg_irq_src     irq_src;                //!< Interrupt source
-	uint8_t                       touch_status;           //!< Touch status
-	struct sx9512_reg_prox_status prox_status;            //!< Proximity status
-	uint8_t                       comp_status;            //!< Compensation status
-	struct sx9512_reg_nvm_ctrl    nvm_ctrl;               //!< NVM control
-	struct sx9512_reg_nvm         nvm;                    //!< Non-volatile memory
-	uint8_t                       cap_sense_chan_select;  //!< CapSense channel select for readback
-	uint16_t                      cap_sense_useful_data;  //!< CapSense useful data
-	uint16_t                      cap_sense_average_data; //!< CapSense average data
-	uint16_t                      cap_sense_diff_data;    //!< CapSense diff data
-	uint16_t                      cap_sense_comp;         //!< CapSense compensation DAC value
-} __attribute__((__packed__));
-
-
-struct sx9512_reg_status {
-	struct sx9512_reg_irq_src     irq_src;                //!< Interrupt source
-	uint8_t                       touch_status;           //!< Touch status
-	struct sx9512_reg_prox_status prox_status;            //!< Proximity status
-} __attribute__((__packed__));
-
-
-struct sx9512_touch_state {
-	uint8_t state;
-	uint8_t touched;
-	uint8_t released;
-};
-
-
-int sx9512_init(const char *dev, int addr, struct sx9512_reg_nvm *nvm);
-const char *sx9512_reg_name(sx9512_reg_t reg);
-int sx9512_reg_reserved(sx9512_reg_t reg);
-int sx9512_reset(int fd);
-int sx9512_reset_restore_led_state(int fd);
-int sx9512_read_interrupt(int fd);
-int sx9512_read_buttons(int fd);
-int sx9512_read_proximity(int fd);
-int sx9512_read_status(int fd, struct sx9512_reg_status *status);
-int sx9512_read_status_cached(int fd, struct sx9512_touch_state *touch_state);
-int sx9512_reg_nvm_load(int fd);
-int sx9512_reg_nvm_store(int fd);
-int sx9512_reg_nvm_read(int fd, struct sx9512_reg_nvm *p);
-int sx9512_reg_nvm_write(int fd, struct sx9512_reg_nvm *p);
-void sx9512_reg_nvm_init(struct sx9512_reg_nvm *p);
-void sx9512_reg_nvm_init_defaults(struct sx9512_reg_nvm *p, uint8_t capsense_channels, uint8_t led_channels);
-void sx9512_reg_nvm_init_cg300(struct sx9512_reg_nvm *p);
-void sx9512_reg_nvm_init_cg301(struct sx9512_reg_nvm *p);
-void sx9512_reg_nvm_init_eg300(struct sx9512_reg_nvm *p);
-void sx9512_reg_nvm_init_dg400(struct sx9512_reg_nvm *p);
-
-#endif
diff --git a/peripheral_manager/src/src/touch_sx9512.c b/peripheral_manager/src/src/touch_sx9512.c
deleted file mode 100644
index cba719848f139e1b36cb7b6d541868e7cb041144..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/touch_sx9512.c
+++ /dev/null
@@ -1,447 +0,0 @@
-#include <syslog.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-
-#include <board.h>
-#include "button.h"
-#include "led.h"
-#include "log.h"
-#include "server.h"
-
-#include "smbus.h"
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-#include "ucix.h"
-#include "i2c.h"
-
-#include "touch_sx9512.h"
-#include "gpio.h"
-
-#define SX9512_IRQ_RESET		1<<7
-#define SX9512_IRQ_TOUCH		1<<6
-#define SX9512_IRQ_RELEASE		1<<5
-#define SX9512_IRQ_NEAR			1<<4
-#define SX9512_IRQ_FAR			1<<3
-#define SX9512_IRQ_COM			1<<2
-#define SX9512_IRQ_CONV			1<<1
-
-
-struct i2c_reg_tab {
-	char addr;
-	char value;
-	char range;  /* if set registers starting from addr to addr+range will be set to the same value */
-};
-
-struct i2c_touch{
-	int dev;
-	int shadow_irq;
-	int shadow_touch;
-	int shadow_proximity;
-	int addr;
-	int irq_button;
-};
-
-struct led_data {
-	int addr;
-	led_state_t state;
-	struct led_drv led;
-};
-
-struct sx9512_list{
-	struct list_head list;
-	struct led_data *drv;
-};
-
-/* holds all leds that is configured to be used. needed for reset */
-static LIST_HEAD(sx9512_leds);
-static struct i2c_touch i2c_touch_current;	/* pointer to current active table */
-static int sx9512_led_set_state(struct led_drv *drv, led_state_t state);
-static led_state_t sx9512_led_get_state(struct led_drv *drv);
-static int sx9512_set_state(struct led_data *p, led_state_t state);
-extern struct uloop_timeout i2c_touch_reset_timer;
-
-
-/* sx9512 needs a reset every 30 minutes. to recalibrate the touch detection */
-#define I2C_RESET_TIME (1000 * 60 * 30) /* 30 min in ms */
-static void sx9512_reset_handler(struct uloop_timeout *timeout);
-struct uloop_timeout i2c_touch_reset_timer = { .cb = sx9512_reset_handler };
-
-static void sx9512_reset_handler(struct uloop_timeout *timeout)
-{
-	struct list_head *i;
-	//do_init_tab(i2c_touch_current);
-	sx9512_reset_restore_led_state(i2c_touch_current.dev);
-
-	list_for_each(i, &sx9512_leds) {
-		struct sx9512_list *node = list_entry(i, struct sx9512_list, list);
-		sx9512_set_state(node->drv, node->drv->state);
-	}
-
-	uloop_timeout_set(&i2c_touch_reset_timer, I2C_RESET_TIME);
-}
-
-/* set state regardless of previous state */
-static int sx9512_set_state(struct led_data *p, led_state_t state)
-{
-	int ret;
-	int bit = 1 << p->addr;
-
-	ret = i2c_smbus_read_byte_data(i2c_touch_current.dev, SX9512_REG_LED_MAP2);
-	if (ret < 0 )
-		syslog(LOG_ERR, "Could not read from i2c device, LedMap2 register\n");
-
-	if (state == ON)
-		ret = ret | bit;
-	else if (state == OFF)
-		ret = ret & ~bit;
-	else{
-		syslog(LOG_ERR,"%s: Led %s: Set to not supported state %d\n",__func__, p->led.name, state);
-		return -1;
-	}
-
-	p->state = state;
-
-	ret = i2c_smbus_write_byte_data(i2c_touch_current.dev, SX9512_REG_LED_MAP2, ret);
-	if (ret < 0 ) {
-		syslog(LOG_ERR, "Could not write to i2c device, LedMap2 register\n");
-		return -1;
-	}
-	return state;
-}
-
-/* set state if not same as current state  */
-static int sx9512_led_set_state(struct led_drv *drv, led_state_t state)
-{
-	struct led_data *p = (struct led_data *)drv->priv;
-
-	if (!i2c_touch_current.dev)
-		return -1;
-
-	if (p->addr > 7){
-		DBG(1,"Led %s:with address %d outside range 0-7\n",drv->name, p->addr);
-		return -1;
-	}
-
-	if (state == p->state ) {
-		DBG(3,"skipping set");
-		return state;
-	}
-
-	return sx9512_set_state(p, state);
-}
-
-static led_state_t sx9512_led_get_state(struct led_drv *drv)
-{
-	struct led_data *p = (struct led_data *)drv->priv;
-	DBG(1, "state for %s",  drv->name);
-	return p->state;
-}
-
-static struct led_drv_func led_func = {
-	.set_state = sx9512_led_set_state,
-	.get_state = sx9512_led_get_state,
-};
-
-struct button_data {
-	int addr;
-	int state;
-	struct button_drv button;
-};
-
-void sx9512_check(void)
-{
-//	DBG(1, "state for %s",  drv->name);
-
-	int got_irq = 0;
-	int ret;
-
-	if (!i2c_touch_current.dev)
-		return;
-
-	if (i2c_touch_current.irq_button) {
-		int button;
-		button = board_ioctl( BOARD_IOCTL_GET_GPIO, 0, 0, NULL, i2c_touch_current.irq_button, 0);
-		if (button == 0)
-			got_irq = 1;
-	}
-	if ( got_irq ) {
-
-		ret = i2c_smbus_read_byte_data(i2c_touch_current.dev, SX9512_REG_IRQ_SRC);
-		if (ret < 0 )
-			syslog(LOG_ERR, "Could not read from i2c device, irq status register\n");
-		i2c_touch_current.shadow_irq = ret;
-
-		ret = i2c_smbus_read_byte_data(i2c_touch_current.dev, SX9512_REG_TOUCH_STATUS);
-		if (ret < 0 )
-			syslog(LOG_ERR, "Could not read from i2c device, touch register\n");
-		i2c_touch_current.shadow_touch = ret;
-
-
-		ret = i2c_smbus_read_byte_data(i2c_touch_current.dev, SX9512_REG_PROX_STATUS);
-		if (ret < 0 )
-			syslog(LOG_ERR, "Could not read from i2c device, proximity register\n");
-		i2c_touch_current.shadow_proximity = ret;
-	}
-#if 0
-    DEBUG_PRINT("%02x %02x %02x: irq ->",
-                i2c_touch->shadow_irq ,
-                i2c_touch->shadow_touch,
-                i2c_touch->shadow_proximity);
-
-    if (i2c_touch->shadow_irq & SX9512_IRQ_RESET )
-        DEBUG_PRINT_RAW(" Reset ");
-    if (i2c_touch->shadow_irq & SX9512_IRQ_TOUCH )
-        DEBUG_PRINT_RAW(" Touch ");
-    if (i2c_touch->shadow_irq & SX9512_IRQ_RELEASE )
-        DEBUG_PRINT_RAW(" Release ");
-    if (i2c_touch->shadow_irq & SX9512_IRQ_NEAR )
-        DEBUG_PRINT_RAW(" Near ");
-    if (i2c_touch->shadow_irq & SX9512_IRQ_FAR )
-        DEBUG_PRINT_RAW(" Far ");
-    if (i2c_touch->shadow_irq & SX9512_IRQ_COM )
-        DEBUG_PRINT_RAW(" Com ");
-    if (i2c_touch->shadow_irq & SX9512_IRQ_CONV )
-        DEBUG_PRINT_RAW(" Conv ");
-
-    DEBUG_PRINT_RAW("\n");
-#endif
-
-	return ;
-}
-/*
-  button address  0- 7 maps to touch event 0-7
-  button address 8 proximity BL0 NEAR
-  button address 9 proximity BL0 FAR
-
-  return BUTTON_RELEASED = no action on this button
-  return BUTTON_PRESSED = button pressed
-  return -1 = error
-*/
-
-static button_state_t sx9512_button_get_state(struct button_drv *drv)
-{
-	struct button_data *p = (struct button_data *)drv->priv;
-	int bit = 1 << p->addr;
-
-	if (!i2c_touch_current.dev)
-		return -1;
-
-	if (p->addr < 8) {
-		if ( bit & i2c_touch_current.shadow_touch ) {
-			i2c_touch_current.shadow_touch = i2c_touch_current.shadow_touch & ~bit;
-			return p->state = BUTTON_PRESSED;
-		}
-
-		/* if the button was already pressed and we don't have a release irq report it as still pressed */
-		if( p->state == BUTTON_PRESSED){
-			if (! (i2c_touch_current.shadow_irq & SX9512_IRQ_RELEASE) ) {
-				return BUTTON_PRESSED;
-			}
-		}
-		return p->state = BUTTON_RELEASED;
-
-		/* proximity NEAR */
-	}else if (p->addr == 8 ) {
-		bit = 1<<7;
-		if( i2c_touch_current.shadow_irq & SX9512_IRQ_NEAR ) {
-			i2c_touch_current.shadow_irq &=  ~SX9512_IRQ_NEAR;
-			if ( bit & i2c_touch_current.shadow_proximity ) {
-				i2c_touch_current.shadow_proximity = i2c_touch_current.shadow_proximity & ~bit;
-				return p->state = BUTTON_PRESSED;
-			}
-		}
-		return BUTTON_RELEASED;
-
-		/* proximity FAR */
-	}else if (p->addr == 9) {
-		if( i2c_touch_current.shadow_irq & SX9512_IRQ_FAR ) {
-			i2c_touch_current.shadow_irq &=  ~SX9512_IRQ_FAR;
-			return p->state = BUTTON_PRESSED;
-		}
-		return BUTTON_RELEASED;
-	}else {
-		DBG(1,"Button address out of range %d\n",p->addr);
-		return BUTTON_RELEASED;
-	}
-}
-
-static struct button_drv_func button_func = {
-	.get_state = sx9512_button_get_state,
-};
-
-
-static void sx9512_button_init(struct server_ctx *s_ctx)
-{
-	struct ucilist *node;
-	LIST_HEAD(buttons);
-
-	DBG(1, "");
-
-	ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"9512_buttons", "buttons", &buttons);
-	list_for_each_entry(node, &buttons, list) {
-		struct button_data *data;
-		const char *s;
-
-		DBG(1, "value = [%s]",node->val);
-
-		data = malloc(sizeof(struct button_data));
-		memset(data,0,sizeof(struct button_data));
-
-		data->button.name = node->val;
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "addr");
-		DBG(1, "addr = [%s]", s);
-		if (s){
-			data->addr =  strtol(s,0,0);
-		}
-
-		data->button.func = &button_func;
-		data->button.priv = data;
-
-		button_add(&data->button);
-	}
-}
-
-static void sx9512_led_init(struct server_ctx *s_ctx) {
-
-	LIST_HEAD(leds);
-	struct ucilist *node;
-
-	DBG(1, "");
-
-	ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"9512_leds", "leds", &leds);
-	list_for_each_entry(node,&leds,list){
-		struct led_data *data;
-		const char *s;
-
-		DBG(1, "value = [%s]",node->val);
-
-		data = malloc(sizeof(struct led_data));
-		memset(data,0,sizeof(struct led_data));
-
-		data->led.name = node->val;
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "addr");
-		DBG(1, "addr = [%s]", s);
-		if (s) {
-			data->addr =  strtol(s,0,0);
-		}
-
-		data->led.func = &led_func;
-		data->led.priv = data;
-		led_add(&data->led);
-
-		{ /* save leds in internal list, we need this for handling reset, we need to restore state */
-			struct sx9512_list *ll = malloc(sizeof(struct sx9512_list));
-			memset(ll, 0, sizeof( struct sx9512_list));
-			ll->drv = data;
-			list_add(&ll->list, &sx9512_leds);
-		}
-
-
-	}
-}
-
-void sx9512_handler_init(struct server_ctx *s_ctx)
-{
-	char *s, *sx9512_i2c_device;
-	int i, fd, sx9512_i2c_address, sx9512_irq_pin, sx9512_active_capsense_channels, sx9512_active_led_channels;
-	struct sx9512_reg_nvm nvm;
-	struct list_head *il;
-	
-	if(!(sx9512_i2c_device = ucix_get_option(s_ctx->uci_ctx, "hw", "board", "sx9512_i2c_device"))) {
-		DBG(0, "Error: option is missing: sx9512_i2c_device");
-		return;
-	}
-	DBG(1, "sx9512_i2c_device = [%s]", sx9512_i2c_device);
-
-	if(!(s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "sx9512_i2c_address"))) {
-		DBG(0, "Warning: option is missing: sx9512_i2c_address, setting to default (%02X)", SX9512_I2C_ADDRESS);
-		sx9512_i2c_address = SX9512_I2C_ADDRESS;
-	} else
-		sx9512_i2c_address = strtol(s,0,16);
-	DBG(1, "sx9512_i2c_address = [%02X]", sx9512_i2c_address);
-
-	if(!(s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "sx9512_irq_pin"))) {
-		DBG(0, "Error: option is missing: sx9512_irq_pin");
-		return;
-	}
-	sx9512_irq_pin = strtol(s,0,0);
-	DBG(1, "sx9512_irq_pin = [%d]", sx9512_irq_pin);
-	
-	if(!(s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "sx9512_active_capsense_channels"))) {
-		DBG(0, "Error: option is missing: sx9512_active_capsense_channels");
-		return;
-	}
-	sx9512_active_capsense_channels = strtol(s,0,16);
-	DBG(1, "sx9512_active_capsense_channels = [%02X]", sx9512_active_capsense_channels);
-	
-	if(!(s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "sx9512_active_led_channels"))) {
-		DBG(0, "Error: option is missing: sx9512_active_led_channels");
-		return;
-	}
-	sx9512_active_led_channels = strtol(s,0,16);
-	DBG(1, "sx9512_active_led_channels = [%02X]", sx9512_active_led_channels);
-
-	sx9512_reg_nvm_init_defaults(&nvm, sx9512_active_capsense_channels, sx9512_active_led_channels);
-
-	if((s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", "sx9512_led_intensity"))) {
-		nvm.led2_on = nvm.led1_on = strtol(s,0,16);
-		DBG(1, "sx9512_led_intensity = [%02X]", nvm.led1_on);
-	}
-
-	for(i=0;i<8;i++) {
-		char tmpstr[22];
-		sprintf(tmpstr, "sx9512_threshold_bl%d", i);
-		if((s=ucix_get_option(s_ctx->uci_ctx, "hw", "board", tmpstr))) {
-			nvm.cap_sense_thresh[i] = strtol(s,0,16);
-			DBG(1, "sx9512_threshold_bl%d = [%02X]", i, nvm.cap_sense_thresh[i]);
-		}
-	}
-
-	LIST_HEAD(sx9512_init_regs);
-	struct ucilist *node;
-	ucix_get_option_list(s_ctx->uci_ctx, "hw","sx9512_init_regs", "regs", &sx9512_init_regs);
-	list_for_each_entry(node,&sx9512_init_regs,list) {
-		sx9512_reg_t reg;
-		uint8_t val;
-		int repeat;
-		reg = strtol(node->val,0,16);
-		if(sx9512_reg_reserved(reg)) {
-			DBG(0, "Error: invalid sx9512 reg [%02X]", reg);
-			return;
-		}
-		s = ucix_get_option(s_ctx->uci_ctx, "hw", node->val, "val");
-		val = strtol(s,0,16);
-		if(!(s = ucix_get_option(s_ctx->uci_ctx, "hw", node->val, "repeat")))
-			repeat=1;
-		else
-			repeat=strtol(s,0,0);
-		for(i=0;i<repeat;i++) {
-			DBG(1, "sx9512_init_reg[%02X:%s=%02X]", reg, sx9512_reg_name(reg), val);
-			((uint8_t *)&nvm)[reg-SX9512_REG_NVM_AREA_START] = val;
-			reg++;
-		}
-	}
-
-	if((fd = sx9512_init(sx9512_i2c_device, sx9512_i2c_address, &nvm))<1)
-		return;
-	i2c_touch_current.dev=fd;
-	i2c_touch_current.addr=sx9512_i2c_address;
-	i2c_touch_current.irq_button=sx9512_irq_pin;
-
-	sx9512_button_init(s_ctx);
-	sx9512_led_init(s_ctx);
-	/* Force set of initial state for leds. */
-	list_for_each(il, &sx9512_leds) {
-		struct sx9512_list *node = list_entry(il, struct sx9512_list, list);
-		sx9512_set_state(node->drv, node->drv->state);
-	}
-	/* start reset timer */
-	uloop_timeout_set(&i2c_touch_reset_timer, I2C_RESET_TIME);
-}
-
diff --git a/peripheral_manager/src/src/touch_sx9512.h b/peripheral_manager/src/src/touch_sx9512.h
deleted file mode 100644
index b494387c4f61df167571ddb166021ce9eda911dd..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/touch_sx9512.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef TOUCH_SX9512_H
-#define TOUCH_SX9512_H
-
-#include "server.h"
-#include "sx9512.h"
-
-void sx9512_handler_init(struct server_ctx *);
-void sx9512_check(void);
-
-#endif /* TOUCH_SX9512_H */
diff --git a/peripheral_manager/src/src/ucix.c b/peripheral_manager/src/src/ucix.c
deleted file mode 100644
index b49e8368086e37dcb04c5d6a1dd06731d2dc7947..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/ucix.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *   ucix
- *   Copyright (C) 2010 John Crispin <blogic@openwrt.org>
- *   Copyright (C) 2010 Steven Barth <steven@midlink.org>
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "ucix.h"
-
-struct uci_ptr uci_ptr;
-
-int ucix_get_ptr(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t)
-{
-	memset(&uci_ptr, 0, sizeof(uci_ptr));
-	uci_ptr.package = p;
-	uci_ptr.section = s;
-	uci_ptr.option = o;
-	uci_ptr.value = t;
-	return uci_lookup_ptr(ctx, &uci_ptr, NULL, true);
-}
-
-struct uci_context* ucix_init(const char *config_file, int state)
-{
-	struct uci_context *ctx = uci_alloc_context();
-	uci_set_confdir(ctx, "/etc/config");
-	if(state)
-		uci_set_savedir(ctx, "/var/state/");
-	else
-		uci_set_savedir(ctx, "/tmp/.uci/");
-	if(uci_load(ctx, config_file, NULL) != UCI_OK)
-	{
-		printf("%s/%s is missing or corrupt\n", ctx->confdir, config_file);
-		return NULL;
-	}
-	return ctx;
-}
-
-struct uci_context* ucix_init_path(const char *vpath, const char *config_file, int state)
-{
-	struct uci_context *ctx;
-	char buf[256];
-	if(!vpath)
-		return ucix_init(config_file, state);
-	ctx = uci_alloc_context();
-	buf[255] = '\0';
-	snprintf(buf, 255, "%s", vpath);
-	uci_set_confdir(ctx, buf);
-//	snprintf(buf, 255, "%s%s", vpath, (state)?("/var/state"):("/tmp/.uci"));
-//	uci_add_delta_path(ctx, buf);
-	if(uci_load(ctx, config_file, NULL) != UCI_OK)
-	{
-		printf("%s/%s is missing or corrupt\n", ctx->confdir, config_file);
-		return NULL;
-	}
-	return ctx;
-}
-
-int ucix_get_option_list(struct uci_context *ctx, const char *p,
-	const char *s, const char *o, struct list_head *l)
-{
-	struct uci_element *e = NULL;
-	if(ucix_get_ptr(ctx, p, s, o, NULL))
-		return 1;
-	if (!(uci_ptr.flags & UCI_LOOKUP_COMPLETE))
-		return 1;
-	e = uci_ptr.last;
-	switch (e->type)
-	{
-	case UCI_TYPE_OPTION:
-		switch(uci_ptr.o->type) {
-			case UCI_TYPE_LIST:
-				uci_foreach_element(&uci_ptr.o->v.list, e)
-				{
-					struct ucilist *ul = malloc(sizeof(struct ucilist));
-					ul->val = strdup((e->name)?(e->name):(""));
-					list_add_tail(&ul->list, l);
-				}
-				break;
-			default:
-				break;
-		}
-		break;
-	default:
-		return 1;
-	}
-
-	return 0;
-}
-
-char* ucix_get_option(struct uci_context *ctx, const char *p, const char *s, const char *o)
-{
-	struct uci_element *e = NULL;
-	const char *value = NULL;
-	if(ucix_get_ptr(ctx, p, s, o, NULL))
-		return NULL;
-	if (!(uci_ptr.flags & UCI_LOOKUP_COMPLETE))
-		return NULL;
-	e = uci_ptr.last;
-	switch (e->type)
-	{
-	case UCI_TYPE_SECTION:
-		value = uci_to_section(e)->type;
-		break;
-	case UCI_TYPE_OPTION:
-		switch(uci_ptr.o->type) {
-			case UCI_TYPE_STRING:
-				value = uci_ptr.o->v.string;
-				break;
-			default:
-				value = NULL;
-				break;
-		}
-		break;
-	default:
-		return 0;
-	}
-
-	return (value) ? (strdup(value)):(NULL);
-}
-
-void ucix_add_list(struct uci_context *ctx, const char *p, const char *s, const char *o, struct list_head *vals)
-{
-	struct list_head *q;
-	list_for_each(q, vals)
-	{
-		struct ucilist *ul = container_of(q, struct ucilist, list);
-		if(ucix_get_ptr(ctx, p, s, o, (ul->val)?(ul->val):("")))
-			return;
-		uci_add_list(ctx, &uci_ptr);
-	}
-}
-
-void ucix_for_each_section_type(struct uci_context *ctx,
-	const char *p, const char *t,
-	void (*cb)(const char*, void*), void *priv)
-{
-	struct uci_element *e;
-	if(ucix_get_ptr(ctx, p, NULL, NULL, NULL))
-		return;
-	uci_foreach_element(&uci_ptr.p->sections, e)
-		if (!strcmp(t, uci_to_section(e)->type))
-			cb(e->name, priv);
-}
-
-void ucix_for_each_section_option(struct uci_context *ctx,
-	const char *p, const char *s,
-	void (*cb)(const char*, const char*, void*), void *priv)
-{
-	struct uci_element *e;
-	if(ucix_get_ptr(ctx, p, s, NULL, NULL))
-		return;
-	uci_foreach_element(&uci_ptr.s->options, e)
-	{
-		struct uci_option *o = uci_to_option(e);
-		cb(o->e.name, o->v.string, priv);
-	}
-}
-
-
diff --git a/peripheral_manager/src/src/ucix.h b/peripheral_manager/src/src/ucix.h
deleted file mode 100644
index 52e70672da624e41e3ea6525973a41d9d30445af..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/ucix.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *   ucix
- *   Copyright (C) 2010 John Crispin <blogic@openwrt.org>
- *   Copyright (C) 2010 Steven Barth <steven@midlink.org>
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef _UCI_H__
-#define _UCI_H__
-#include <uci.h>
-#include <libubox/list.h>
-#include <stdlib.h>
-
-#ifndef uci_to_delta
-// Support older version of uci, where this function was named
-// differently
-#define uci_add_delta_path uci_add_history_path
-#endif
-
-struct ucilist {
-	struct list_head list;
-	char *val;
-};
-
-extern struct uci_ptr uci_ptr;
-
-int ucix_get_ptr(struct uci_context *ctx, const char *p,
-	const char *s, const char *o, const char *t);
-struct uci_context* ucix_init(const char *config_file, int state);
-struct uci_context* ucix_init_path(const char *vpath, const char *config_file, int state);
-int ucix_save_state(struct uci_context *ctx, const char *p);
-char* ucix_get_option(struct uci_context *ctx,
-	const char *p, const char *s, const char *o);
-int ucix_get_option_list(struct uci_context *ctx, const char *p,
-	const char *s, const char *o, struct list_head *l);
-void ucix_for_each_section_type(struct uci_context *ctx,
-	const char *p, const char *t,
-	void (*cb)(const char*, void*), void *priv);
-void ucix_for_each_section_option(struct uci_context *ctx,
-	const char *p, const char *s,
-	void (*cb)(const char*, const char*, void*), void *priv);
-void ucix_add_list(struct uci_context *ctx, const char *p,
-	const char *s, const char *o, struct list_head *vals);
-
-static inline void ucix_del(struct uci_context *ctx, const char *p, const char *s, const char *o)
-{
-	if (!ucix_get_ptr(ctx, p, s, o, NULL))
-		uci_delete(ctx, &uci_ptr);
-}
-
-static inline void ucix_revert(struct uci_context *ctx, const char *p, const char *s, const char *o)
-{
-	if (!ucix_get_ptr(ctx, p, s, o, NULL))
-		uci_revert(ctx, &uci_ptr);
-}
-
-static inline void ucix_add_list_single(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t)
-{
-	if (ucix_get_ptr(ctx, p, s, o, t))
-		return;
-	uci_add_list(ctx, &uci_ptr);
-}
-
-static inline void ucix_add_option(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t)
-{
-	if (ucix_get_ptr(ctx, p, s, o, t))
-		return;
-	uci_set(ctx, &uci_ptr);
-}
-
-static inline void ucix_add_section(struct uci_context *ctx, const char *p, const char *s, const char *t)
-{
-	if(ucix_get_ptr(ctx, p, s, NULL, t))
-		return;
-	uci_set(ctx, &uci_ptr);
-}
-
-static inline void ucix_add_option_int(struct uci_context *ctx, const char *p, const char *s, const char *o, int t)
-{
-	char tmp[64];
-	snprintf(tmp, 64, "%d", t);
-	ucix_add_option(ctx, p, s, o, tmp);
-}
-
-static inline void ucix_add_list_single_int(struct uci_context *ctx, const char *p, const char *s, const char *o, const int t)
-{
-	char tmp[64];
-	snprintf(tmp, 64, "%d", t);
-	ucix_add_list_single(ctx, p, s, o, tmp);
-}
-
-static inline int ucix_get_option_int(struct uci_context *ctx, const char *p, const char *s, const char *o, int def)
-{
-	char *tmp = ucix_get_option(ctx, p, s, o);
-	int ret = def;
-
-	if (tmp)
-	{
-		ret = atoi(tmp);
-		free(tmp);
-	}
-	return ret;
-}
-
-static inline int ucix_save(struct uci_context *ctx, const char *p)
-{
-	if(ucix_get_ptr(ctx, p, NULL, NULL, NULL))
-		return 1;
-	uci_save(ctx, uci_ptr.p);
-	return 0;
-}
-
-static inline int ucix_commit(struct uci_context *ctx, const char *p)
-{
-	if(ucix_get_ptr(ctx, p, NULL, NULL, NULL))
-		return 1;
-	return uci_commit(ctx, &uci_ptr.p, false);
-}
-
-static inline void ucix_cleanup(struct uci_context *ctx)
-{
-	uci_free_context(ctx);
-}
-
-
-#endif
diff --git a/peripheral_manager/src/src/vox.c b/peripheral_manager/src/src/vox.c
deleted file mode 100644
index f25aaa284746e8a104df60a3d0b90ac23a083783..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/vox.c
+++ /dev/null
@@ -1,176 +0,0 @@
-#include <syslog.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-
-#include <board.h>
-#include "log.h"
-#include "server.h"
-#include "led.h"
-#include "gpio.h"
-
-#define SPI_SLAVE_SELECT 1
-
-struct vox_data {
-	int		addr;
-	led_state_t	state;
-	int		brightness;
-	struct led_drv led;
-};
-
-void vox_init(struct server_ctx *s_ctx);
-
-static int vox_set_state(struct led_drv *drv, led_state_t state)
-{
-	struct vox_data *p = (struct vox_data *)drv->priv;
-        char spi_data[6] = {0,0,0,0,0,0};
-
-        if (p->state == state)
-                    return state;
-
-	memset(spi_data, 0, 6);
-
-        spi_data[0] = p->addr;
-
-	if (state == ON) {
-                spi_data[1] = 1;
-		spi_data[2] = 0x0;
-		spi_data[3] = 0x0;
-		spi_data[4] = 0x0;
-		spi_data[4] = 0x0;
-	} else if(state == PULSING) {
-                spi_data[1] = 3;
-		spi_data[2] = 0xa0;
-	} else if(state == FLASH_SLOW) {
-                spi_data[1] = 2;
-		spi_data[3] = 0x95;
-	} else if(state == FLASH_FAST) {
-                spi_data[1] = 2;
-		spi_data[3] = 0x20;
-	}
-
-        DBG(2,"vox_set_state %x %x %x %x",spi_data[0],spi_data[1],spi_data[2],spi_data[3]);
-	board_ioctl(BOARD_IOCTL_SPI_WRITE, SPI_SLAVE_SELECT, 0, spi_data, 6, 0);
-
-	p->state = state;
-        return state;
-}
-
-static led_state_t vox_get_state(struct led_drv *drv)
-{
-	struct vox_data *p = (struct vox_data *)drv->priv;
-	return p->state;
-}
-
-/* input  brightness is in %. 0-100      */
-/* internal brightness is 5 steps. 0-4   */
-/*
-  step, level percent mapping.
-  0	0 -> 20
-  1	21 -> 40
-  2	41 -> 60
-  3	61 -> 80
-  4	81 -> 100
-
-*/
-
-static 	int vox_set_brightness(struct led_drv *drv, int level)
-{
-	struct vox_data *p = (struct vox_data *)drv->priv;
-	int new = (level * 5)/101;    /* really level/(101/5) */
-        char spi_data[6] = {0,0,0,0,0,0};
-
-	if (new == p->brightness)
-		return level;
-
-	p->brightness = new;
-
-	memset(spi_data, 0, 6);
-
-        spi_data[0] = p->addr;
-        spi_data[1] = 6;
-	spi_data[2] = p->brightness;
-
-        DBG(2,"vox_set_state %x %x %x %x",spi_data[0],spi_data[1],spi_data[2],spi_data[3]);
-	board_ioctl(BOARD_IOCTL_SPI_WRITE, SPI_SLAVE_SELECT, 0, spi_data, 6, 0);
-
-	return level;
-}
-
-static	int vox_get_brightness(struct led_drv *drv)
-{
-	struct vox_data *p = (struct vox_data *)drv->priv;
-	return p->brightness * (100/5);
-}
-
-static int vox_support(struct led_drv *drv, led_state_t state)
-{
-	switch (state) {
-
-	case OFF:
-	case ON:
-	case FLASH_SLOW:
-	case FLASH_FAST:
-	case PULSING:
-		return 1;
-		break;
-
-	default:
-		return 0;
-	}
-	return 0;
-}
-
-static struct led_drv_func func = {
-	.set_state       = vox_set_state,
-	.get_state       = vox_get_state,
-	.set_brightness = vox_set_brightness,
-	.get_brightness = vox_get_brightness,
-	.support         = vox_support,
-};
-
-void vox_init(struct server_ctx *s_ctx) {
- 	LIST_HEAD(leds);
-	struct ucilist *node;
-	int register_spi = 0;
-
-        DBG(1, "");
-
-        ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"vox_leds", "leds", &leds);
-	list_for_each_entry(node,&leds,list){
-		struct vox_data *data;
-		const char *s;
-
-		DBG(1, "value = [%s]",node->val);
-
-		data = malloc(sizeof(struct vox_data));
-		memset(data,0,sizeof(struct vox_data));
-
-		data->led.name = node->val;
-
-		s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "addr");
-		DBG(1, "addr = [%s]", s);
-		if (s) {
-			data->addr =  strtol(s,0,0);
-		}else
-                        syslog(LOG_ERR,"vox_led config needs addr option\n");
-
-		data->led.func = &func;
-		data->led.priv = data;
-                data->state = NEED_INIT;
-		data->brightness = 4;
-		led_add(&data->led);
-		register_spi = 1;
-	}
-
-	/* if config entries for vox leds exist register the spi as used. */
-	if(register_spi) {
-		/* arg 4 is the spi mode encoded in a string pointer */
-		/* mode is decribed i/bcm963xx/shared/opensource/include/bcm963xx/bcmSpiRes.h */
-		board_ioctl(BOARD_IOCTL_SPI_INIT, SPI_SLAVE_SELECT, 0, (char*)0, 0, 391000);
-		board_ioctl_init();
-	}
-}
diff --git a/peripheral_manager/src/src/vox_test.c b/peripheral_manager/src/src/vox_test.c
deleted file mode 100644
index 57918a86f32f42eae7a4e2dd58ecb694a714b932..0000000000000000000000000000000000000000
--- a/peripheral_manager/src/src/vox_test.c
+++ /dev/null
@@ -1,178 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/select.h>
-#include <termios.h>
-
-#include <board.h>
-#include "gpio.h"
-
-
-int debug_level;
-struct termios orig_termios;
-
-#define SPI_SLAVE_SELECT 1
-
-void reset_terminal_mode(void);
-void set_conio_terminal_mode( void );
-int kbhit( void );
-int getch( void );
-void display(void);
-void inc(void);
-void dec(void);
-
-void reset_terminal_mode( void)
-{
-        tcsetattr(0, TCSANOW, &orig_termios);
-}
-
-void set_conio_terminal_mode( void )
-{
-        struct termios new_termios;
-
-        /* take two copies - one for now, one for later */
-        tcgetattr(0, &orig_termios);
-        memcpy(&new_termios, &orig_termios, sizeof(new_termios));
-
-        /* register cleanup handler, and set the new terminal mode */
-        atexit(reset_terminal_mode);
-        cfmakeraw(&new_termios);
-        tcsetattr(0, TCSANOW, &new_termios);
-}
-
-int kbhit( void )
-{
-        struct timeval tv = { 0L, 0L };
-        fd_set fds;
-        FD_ZERO(&fds);
-        FD_SET(0, &fds);
-        return select(1, &fds, NULL, NULL, &tv);
-}
-
-int getch( void )
-{
-        int r = 0;
-        int c = 0;
-        if ((r = read(0, &c, sizeof(c))) < 0) {
-                return r;
-        } else {
-#if __BYTE_ORDER == __BIG_ENDIAN
-                int ret = 0;
-                ret |= (c >> 24) & 0x000000ff;
-                ret |= (c >>  8) & 0x0000ff00;
-                ret |= (c <<  8) & 0x00ff0000;
-                ret |= (c << 24) & 0xff000000;
-                return ret;
-#else
-                return c;
-#endif
-        }
-}
-
-unsigned char spi_data [6] = {8,3,0,0,0,0};
-int pos;
-
-void display(void){
-
-        printf("\r");
-        printf("%02x %02x %02x %02x %02x %02x \r",
-               spi_data[0],
-               spi_data[1],
-               spi_data[2],
-               spi_data[3],
-               spi_data[4],
-               spi_data[5]
-                );
-
-
-        if (pos){
-                int jump = pos/2;
-                printf("\e[%dC",pos+jump);
-        }
-        fflush(stdout);
-}
-
-void inc(void){
-
-        int byte = pos/2;
-        int nibble = pos%2;
-
-        int val_hi = (spi_data[byte] >> 4 ) & 0xF;
-        int val_lo =  spi_data[byte]        & 0xF;
-
-        if(!nibble) {
-                val_hi++;
-                if(val_hi > 0xF )
-                        val_hi = 0xf;
-        }else{
-                val_lo++;
-                if(val_lo > 0xF )
-                        val_lo = 0xf;
-        }
-
-        spi_data[byte] = val_hi << 4 | val_lo;
-}
-
-void dec(void){
-        int byte = pos/2;
-        int nibble = pos%2;
-
-        int val_hi = (spi_data[byte] >> 4 ) & 0xF;
-        int val_lo =  spi_data[byte]        & 0xF;
-
-        if(!nibble) {
-                val_hi--;
-                if(val_hi < 0 )
-                        val_hi = 0;
-        }else{
-                val_lo--;
-                if(val_lo < 0 )
-                        val_lo = 0;
-        }
-
-        spi_data[byte] = val_hi << 4 | val_lo;
-}
-
-int main(int argc, char *argv[])
-{
-        int ch;
-
-        board_ioctl_init();
-        /* arg 4 is the spi mode encoded in a string pointer */
-        /* mode is decribed i/bcm963xx/shared/opensource/include/bcm963xx/bcmSpiRes.h */
-        board_ioctl(BOARD_IOCTL_SPI_INIT, SPI_SLAVE_SELECT, 0, (char *)0, 0, 391000);
-        set_conio_terminal_mode();
-        fflush(stdout);
-
-        display();
-
-        while ( 'q' != (char)(ch = getch())) {
-                /* right */
-                if (ch == 4414235) {
-                        pos++;
-                        if (pos > 11)
-                                pos = 11;
-                }
-                /* left */
-                if (ch == 4479771) {
-                        pos--;
-                        if (pos < 0)
-                                pos = 0;
-                }
-                /* up */
-                if (ch == 4283163) {
-                        inc();
-                }
-                /* down */
-                if (ch == 4348699) {
-                        dec();
-                }
-                /* enter */
-                if (ch == '\r') {
-                        board_ioctl(BOARD_IOCTL_SPI_WRITE, SPI_SLAVE_SELECT, 0, (char*)spi_data, 6, 0);
-                }
-                display();
-        }
-        return 0;
-}
diff --git a/qrencode/Makefile b/qrencode/Makefile
index 7e0fe0f925237e9bc7851b5c505547106c8aed15..b62fed8ebb676fefb5e49f21afe8d55bdf845f37 100644
--- a/qrencode/Makefile
+++ b/qrencode/Makefile
@@ -10,19 +10,31 @@ PKG_NAME:=qrencode
 PKG_VERSION:=3.0.3
 PKG_RELEASE:=1
 
+PKG_SOURCE_VERSION:=2f575b43703c801f4f7bfac65e8845ce967c3d9e
+PKG_SOURCE_PROTO:=git
+ifeq ($(CONFIG_BCM_OPEN),y)
+PKG_SOURCE_URL:=http://public.inteno.se/qrencode
+else
+PKG_SOURCE_URL:=git@public.inteno.se:qrencode
+endif
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
 include $(INCLUDE_DIR)/package.mk
 
 TARGET_LDFLAGS+= \
-        -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
-		-Wl,-rpath-link=$(STAGING_DIR)/lib -lpng
+	-Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
+	-Wl,-rpath-link=$(STAGING_DIR)/lib -lpng
 
 TARGET_CFLAGS += $(FPIC)
 
 define Package/qrencode
-  CATEGORY:=Utilities
-  DEPENDS:=+libpng
-  TITLE:=QRcode encoder library
-  URL:=http://megaui.net/fukuchi/works/qrencode/index.en.html
+	CATEGORY:=Utilities
+	DEPENDS:=+libpng
+	TITLE:=QRcode encoder library
+	URL:=http://megaui.net/fukuchi/works/qrencode/index.en.html
 endef
 
 define Package/qrencode/description
@@ -32,11 +44,6 @@ define Package/qrencode/description
 	digits or 4000 characters, and is highly robust.
 endef
 
-define Build/Prepare
-	mkdir -p $(PKG_BUILD_DIR)
-	$(CP) ./src/* $(PKG_BUILD_DIR)/
-endef
-
 define Build/Compile
 	$(MAKE) -C $(PKG_BUILD_DIR) \
 		$(TARGET_CONFIGURE_OPTS) LINUX_DIR=$(LINUX_DIR) LDFLAGS="$(TARGET_LDFLAGS)" CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include -I$(STAGING_DIR)/usr/include"
diff --git a/qrencode/src/Makefile b/qrencode/src/Makefile
deleted file mode 100644
index 596cdf9d8685c3c98d4d5aa22590a6f6d89d223c..0000000000000000000000000000000000000000
--- a/qrencode/src/Makefile
+++ /dev/null
@@ -1,28 +0,0 @@
-CC		= gcc
-MAKEDEPEND	= makedepend
-CDEBUG		= -g
-CFLAGS		= ${CDEBUG} ${INCL} -Wall
-LDFLAGS		= ${CDEBUG}
-LIBDIR		= 
-LOCLIBS		= 
-LIBS		= ${LOCLIBS} ${SYSLIBS}
-OBJS		= bitstream.o  mask.o  qrenc.o  qrencode.o  qrinput.o  qrspec.o  rscode.o  split.o
-SRCS		= bitstream.c  mask.c  qrenc.c  qrencode.c  qrinput.c  qrspec.c  rscode.c  split.c
-LIBSRCS		= 
-ISRCS		= bitstream.h  mask.h  qrencode.h  qrencode_inner.h  qrinput.h  qrspec.h  rscode.h  split.h config.h
-ALLSRCS		= ${SRCS} ${ISRCS} ${LIBSRCS}
-
-all: qrencode
-
-qrencode: ${OBJS}
-	${CC} ${LDFLAGS} -o qrencode ${OBJS} ${LIBDIR} ${LIBS}
-
-clean:
-	rm -f qrencode core *.o *.BAK *.bak *.CKP a.out
-
-install:
-	install -c -s -o bin -g bin -m 555 qrencode /usr/local/bin
-
-depend: 
-	${MAKEDEPEND} ${INCL} ${SRCS} ${LIBSRCS}
-
diff --git a/qrencode/src/bitstream.c b/qrencode/src/bitstream.c
deleted file mode 100644
index 029ceac9be4e5c7f5d7fe28412a6db43193c22d6..0000000000000000000000000000000000000000
--- a/qrencode/src/bitstream.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Binary sequence class.
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "bitstream.h"
-
-BitStream *BitStream_new(void)
-{
-	BitStream *bstream;
-
-	bstream = (BitStream *)malloc(sizeof(BitStream));
-	bstream->data = NULL;
-
-	return bstream;
-}
-
-static BitStream *BitStream_newFromNum(int bits, unsigned int num)
-{
-	unsigned int mask;
-	int i;
-	char *p;
-	BitStream *bstream;
-
-	bstream = BitStream_new();
-	bstream->data = (char *)malloc(bits + 1);
-
-	p = bstream->data;
-	mask = 1 << (bits - 1);
-	for(i=0; i<bits; i++) {
-		if(num & mask) {
-			*p = '1';
-		} else {
-			*p = '0';
-		}
-		p++;
-		mask = mask >> 1;
-	}
-	*p = '\0';
-
-	return bstream;
-}
-
-static BitStream *BitStream_newFromBytes(int size, unsigned char *data)
-{
-	unsigned char mask;
-	int i, j;
-	char *p;
-	BitStream *bstream;
-
-	bstream = BitStream_new();
-	bstream->data = (char *)malloc(size * 8 + 1);
-
-	p = bstream->data;
-	for(i=0; i<size; i++) {
-		mask = 0x80;
-		for(j=0; j<8; j++) {
-			if(data[i] & mask) {
-				*p = '1';
-			} else {
-				*p = '0';
-			}
-			p++;
-			mask = mask >> 1;
-		}
-	}
-	*p = '\0';
-
-	return bstream;
-}
-
-void BitStream_append(BitStream *bstream, BitStream *arg)
-{
-	int l1, l2;
-	char *data;
-
-	if(arg == NULL || arg->data == NULL) {
-		return;
-	}
-	if(bstream->data == NULL) {
-		bstream->data = strdup(arg->data);
-		return;
-	}
-
-	l1 = strlen(bstream->data);
-	l2 = strlen(arg->data);
-	data = (char *)malloc(l1 + l2 + 1);
-	strcpy(data, bstream->data);
-	strcat(data, arg->data);
-
-	free(bstream->data);
-	bstream->data = data;
-}
-
-void BitStream_appendNum(BitStream *bstream, int bits, unsigned int num)
-{
-	BitStream *b;
-
-	b = BitStream_newFromNum(bits, num);
-	BitStream_append(bstream, b);
-	BitStream_free(b);
-}
-
-void BitStream_appendBytes(BitStream *bstream, int size, unsigned char *data)
-{
-	BitStream *b;
-
-	b = BitStream_newFromBytes(size, data);
-	BitStream_append(bstream, b);
-	BitStream_free(b);
-}
-
-unsigned int BitStream_size(BitStream *bstream)
-{
-	if(bstream == NULL) return 0;
-	if(bstream->data == NULL) return 0;
-
-	return strlen(bstream->data);
-}
-
-unsigned char *BitStream_toByte(BitStream *bstream)
-{
-	int i, j, size, bytes;
-	unsigned char *data, v;
-	char *p;
-
-	size = BitStream_size(bstream);
-	data = (unsigned char *)malloc((size + 7) / 8);
-	bytes = size  / 8;
-
-	p = bstream->data;
-	for(i=0; i<bytes; i++) {
-		v = 0;
-		for(j=0; j<8; j++) {
-			v = v << 1;
-			v |= *p == '1';
-			p++;
-		}
-		data[i] = v;
-	}
-	if(size & 7) {
-		v = 0;
-		for(j=0; j<(size & 7); j++) {
-			v = v << 1;
-			v |= *p == '1';
-			p++;
-		}
-		data[bytes] = v;
-	}
-
-	return data;
-}
-
-void BitStream_free(BitStream *bstream)
-{
-	if(bstream->data != NULL) {
-		free(bstream->data);
-	}
-	free(bstream);
-}
diff --git a/qrencode/src/bitstream.h b/qrencode/src/bitstream.h
deleted file mode 100644
index 95399a57699a7157f26d8a46f583c510225e73d1..0000000000000000000000000000000000000000
--- a/qrencode/src/bitstream.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Binary sequence class.
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __BITSTREAM_H__
-#define __BITSTREAM_H__
-
-typedef struct {
-	char *data;
-} BitStream;
-
-extern BitStream *BitStream_new(void);
-extern void BitStream_append(BitStream *bstream, BitStream *arg);
-extern void BitStream_appendNum(BitStream *bstream, int bits, unsigned int num);
-extern void BitStream_appendBytes(BitStream *bstream, int size, unsigned char *data);
-extern unsigned int BitStream_size(BitStream *bstream);
-extern unsigned char *BitStream_toByte(BitStream *bstream);
-extern void BitStream_free(BitStream *bstream);
-
-#endif /* __BITSTREAM_H__ */
diff --git a/qrencode/src/config.h b/qrencode/src/config.h
deleted file mode 100644
index 6e980f3a934dcf08710f1bb1f1afffc2e83174c6..0000000000000000000000000000000000000000
--- a/qrencode/src/config.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Version number of package */
-#undef VERSION
-
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-#undef inline
-#endif
diff --git a/qrencode/src/mask.c b/qrencode/src/mask.c
deleted file mode 100644
index ffe74ec81f09e9fa2ef1e1b47d6c52fe4c117da1..0000000000000000000000000000000000000000
--- a/qrencode/src/mask.c
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Masking.
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdlib.h>
-#include <limits.h>
-#include "qrencode.h"
-#include "qrencode_inner.h"
-#include "qrspec.h"
-#include "mask.h"
-
-/**
- * Demerit coefficients.
- * See Section 8.8.2, pp.45, JIS X0510:2004.
- */
-#define N1 (3)
-#define N2 (3)
-#define N3 (40)
-#define N4 (10)
-
-#define MASKMAKER(__exp__) \
-	int x, y;\
-	unsigned int b = 0;\
-\
-	for(y=0; y<width; y++) {\
-		for(x=0; x<width; x++) {\
-			if(*s & 0x80) {\
-				*d = *s;\
-			} else {\
-				*d = *s ^ ((__exp__) == 0);\
-			}\
-			b += (*d & 1);\
-			s++; d++;\
-		}\
-	}\
-	return b;
-
-static int Mask_mask0(int width, const unsigned char *s, unsigned char *d)
-{
-	MASKMAKER((x+y)&1)
-}
-
-static int Mask_mask1(int width, const unsigned char *s, unsigned char *d)
-{
-	MASKMAKER(y&1)
-}
-
-static int Mask_mask2(int width, const unsigned char *s, unsigned char *d)
-{
-	MASKMAKER(x%3)
-}
-
-static int Mask_mask3(int width, const unsigned char *s, unsigned char *d)
-{
-	MASKMAKER((x+y)%3)
-}
-
-static int Mask_mask4(int width, const unsigned char *s, unsigned char *d)
-{
-	MASKMAKER(((y/2)+(x/3))&1)
-}
-
-static int Mask_mask5(int width, const unsigned char *s, unsigned char *d)
-{
-	MASKMAKER(((x*y)&1)+(x*y)%3)
-}
-
-static int Mask_mask6(int width, const unsigned char *s, unsigned char *d)
-{
-	MASKMAKER((((x*y)&1)+(x*y)%3)&1)
-}
-
-static int Mask_mask7(int width, const unsigned char *s, unsigned char *d)
-{
-	MASKMAKER((((x*y)%3)+((x+y)&1))&1)
-}
-
-typedef int MaskMaker(int, const unsigned char *, unsigned char *);
-static MaskMaker *maskMakers[] = {
-	Mask_mask0, Mask_mask1, Mask_mask2, Mask_mask3,
-	Mask_mask4, Mask_mask5, Mask_mask6, Mask_mask7
-};
-
-unsigned char *Mask_makeMask(int width, unsigned char *frame, int mask)
-{
-	unsigned char *masked;
-
-	masked = (unsigned char *)malloc(width * width);
-
-	maskMakers[mask](width, frame, masked);
-
-	return masked;
-}
-
-static int runLength[QRSPEC_WIDTH_MAX + 1];
-
-//static int n1;
-//static int n2;
-//static int n3;
-//static int n4;
-
-static int Mask_calcN1N3(int length, int *runLength)
-{
-	int i;
-	int demerit = 0;
-	int fact;
-
-	for(i=0; i<length; i++) {
-		if(runLength[i] >= 5) {
-			demerit += N1 + (runLength[i] - 5);
-			//n1 += N1 + (runLength[i] - 5);
-		}
-		if((i & 1)) {
-			if(i >= 3 && i < length-2 && (runLength[i] % 3) == 0) {
-				fact = runLength[i] / 3;
-				if(runLength[i-2] == fact &&
-				   runLength[i-1] == fact &&
-				   runLength[i+1] == fact &&
-				   runLength[i+2] == fact) {
-					if(runLength[i-3] < 0 || runLength[i-3] >= 4 * fact) {
-						demerit += N3;
-						//n3 += N3;
-					} else if(i+3 >= length || runLength[i+3] >= 4 * fact) {
-						demerit += N3;
-						//n3 += N3;
-					}
-				}
-			}
-		}
-	}
-
-	return demerit;
-}
-
-int Mask_evaluateSymbol(int width, unsigned char *frame)
-{
-	int x, y;
-	unsigned char *p;
-	unsigned char b22, w22;
-	unsigned int i;
-	int head;
-	int demerit = 0;
-
-	p = frame;
-	i = 0;
-	for(y=0; y<width; y++) {
-		head = 0;
-		runLength[0] = 1;
-		for(x=0; x<width; x++) {
-			if(x > 0 && y > 0) {
-				b22 = p[0] & p[-1] & p[-width] & p [-width-1];
-				w22 = p[0] | p[-1] | p[-width] | p [-width-1];
-				if((b22 | (w22 ^ 1))&1) {
-					demerit += N2;
-				}
-			}
-			if(x == 0 && (p[0] & 1)) {
-				runLength[0] = -1;
-				head = 1;
-				runLength[head] = 1;
-			} else if(x > 0) {
-				if((p[0] ^ p[-1]) & 1) {
-					head++;
-					runLength[head] = 1;
-				} else {
-					runLength[head]++;
-				}
-			}
-			p++;
-		}
-		demerit += Mask_calcN1N3(head+1, runLength);
-	}
-
-	i = 0;
-	for(x=0; x<width; x++) {
-		head = 0;
-		runLength[0] = 1;
-		p = frame + x;
-		for(y=0; y<width; y++) {
-			if(y == 0 && (p[0] & 1)) {
-				runLength[0] = -1;
-				head = 1;
-				runLength[head] = 1;
-			} else if(y > 0) {
-				if((p[0] ^ p[-width]) & 1) {
-					head++;
-					runLength[head] = 1;
-				} else {
-					runLength[head]++;
-				}
-			}
-			p+=width;
-		}
-		demerit += Mask_calcN1N3(head+1, runLength);
-	}
-
-	return demerit;
-}
-
-unsigned char *Mask_mask(int width, unsigned char *frame, QRecLevel level)
-{
-	int i;
-	unsigned char *mask, *bestMask;
-	int minDemerit = INT_MAX;
-	int bestMaskNum = 0;
-	int blacks;
-	int demerit;
-
-	bestMask = NULL;
-
-	for(i=0; i<8; i++) {
-//		n1 = n2 = n3 = n4 = 0;
-		demerit = 0;
-		mask = (unsigned char *)malloc(width * width);
-		blacks = maskMakers[i](width, frame, mask);
-		blacks += QRcode_writeFormatInformation(width, mask, i, level);
-		blacks = 100 * blacks / (width * width);
-		demerit = (abs(blacks - 50) / 5) * N4;
-//		n4 = demerit;
-		demerit += Mask_evaluateSymbol(width, mask);
-//		printf("(%d,%d,%d,%d)=%d\n", n1, n2, n3 ,n4, demerit);
-		if(demerit < minDemerit) {
-			minDemerit = demerit;
-			bestMaskNum = i;
-			if(bestMask != NULL) {
-				free(bestMask);
-			}
-			bestMask = mask;
-		} else {
-			free(mask);
-		}
-	}
-
-	return bestMask;
-}
diff --git a/qrencode/src/mask.h b/qrencode/src/mask.h
deleted file mode 100644
index 6bf39ff6dda36e81823485f480a0b580cbc4a222..0000000000000000000000000000000000000000
--- a/qrencode/src/mask.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Masking.
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __MASK_H__
-#define __MASK_H__
-
-#include "qrinput.h"
-
-extern unsigned char *Mask_makeMask(int width, unsigned char *frame, int mask);
-extern int Mask_evaluateSymbol(int width, unsigned char *frame);
-extern unsigned char *Mask_mask(int width, unsigned char *frame, QRecLevel level);
-
-#endif /* __MASK_H__ */
diff --git a/qrencode/src/qrenc.c b/qrencode/src/qrenc.c
deleted file mode 100644
index 6ec550b26392f132adf61b5ad4b9842120900952..0000000000000000000000000000000000000000
--- a/qrencode/src/qrenc.c
+++ /dev/null
@@ -1,452 +0,0 @@
-/**
- * qrencode - QR Code encoder
- *
- * QR Code encoding tool
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <png.h>
-#include <getopt.h>
-
-#include "config.h"
-#include "qrencode.h"
-
-static int casesensitive = 1;
-static int eightbit = 0;
-static int version = 0;
-static int size = 3;
-static int margin = 4;
-static int structured = 0;
-static QRecLevel level = QR_ECLEVEL_L;
-static QRencodeMode hint = QR_MODE_8;
-
-static const struct option options[] = {
-	{"help"         , no_argument      , NULL, 'h'},
-	{"output"       , required_argument, NULL, 'o'},
-	{"level"        , required_argument, NULL, 'l'},
-	{"size"         , required_argument, NULL, 's'},
-	{"symversion"   , required_argument, NULL, 'v'},
-	{"margin"       , required_argument, NULL, 'm'},
-	{"structured"   , no_argument      , NULL, 'S'},
-	{"kanji"        , no_argument      , NULL, 'k'},
-	{"casesensitive", no_argument      , NULL, 'c'},
-	{"ignorecase"   , no_argument      , NULL, 'i'},
-	{"8bit"         , no_argument      , NULL, '8'},
-	{"version"      , no_argument      , NULL, 'V'},
-	{NULL, 0, NULL, 0}
-};
-
-static char *optstring = "ho:l:s:v:m:Skci8V";
-
-static void usage(int help, int longopt)
-{
-	fprintf(stderr,
-"qrencode version 3.0.3\n"
-"Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi\n");
-	if(help) {
-		if(longopt) {
-			fprintf(stderr,
-"Usage: qrencode [OPTION]... [STRING]\n"
-"Encode input data in a QR Code and save as a PNG image.\n\n"
-"  -h, --help   display the help message. -h displays only the help of short\n"
-"               options.\n\n"
-"  -o FILENAME, --output=FILENAME\n"
-"               write PNG image to FILENAME. If '-' is specified, the result\n"
-"               will be output to standard output. If -S is given, structured\n"
-"               symbols are written to FILENAME-01.png, FILENAME-02.png, ...;\n"
-"               if specified, remove a trailing '.png' from FILENAME.\n\n"
-"  -s NUMBER, --size=NUMBER\n"
-"               specify the size of dot (pixel). (default=3)\n\n"
-"  -l {LMQH}, --level={LMQH}\n"
-"               specify error collectin level from L (lowest) to H (highest).\n"
-"               (default=L)\n\n"
-"  -v NUMBER, --symversion=NUMBER\n"
-"               specify the version of the symbol. (default=auto)\n\n"
-"  -m NUMBER, --margin=NUMBER\n"
-"               specify the width of margin. (default=4)\n\n"
-"  -S, --structured\n"
-"               make structured symbols. Version must be specified.\n\n"
-"  -k, --kanji  assume that the input text contains kanji (shift-jis).\n\n"
-"  -c, --casesensitive\n"
-"               encode lower-case alphabet characters in 8-bit mode. (default)\n\n"
-"  -i, --ignorecase\n"
-"               ignore case distinctions and use only upper-case characters.\n\n"
-"  -8, -8bit    encode entire data in 8-bit mode. -k, -c and -i will be ignored.\n\n"
-"  -V, --version\n"
-"               display the version number and copyrights of the qrencode.\n\n"
-"  [STRING]     input data. If it is not specified, data will be taken from\n"
-"               standard input.\n"
-			);
-		} else {
-			fprintf(stderr,
-"Usage: qrencode [OPTION]... [STRING]\n"
-"Encode input data in a QR Code and save as a PNG image.\n\n"
-"  -h           display this message.\n"
-"  --help       display the usage of long options.\n"
-"  -o FILENAME  write PNG image to FILENAME. If '-' is specified, the result\n"
-"               will be output to standard output. If -S is given, structured\n"
-"               symbols are written to FILENAME-01.png, FILENAME-02.png, ...;\n"
-"               if specified, remove a trailing '.png' from FILENAME.\n"
-"  -s NUMBER    specify the size of dot (pixel). (default=3)\n"
-"  -l {LMQH}    specify error collectin level from L (lowest) to H (highest).\n"
-"               (default=L)\n"
-"  -v NUMBER    specify the version of the symbol. (default=auto)\n"
-"  -m NUMBER    specify the width of margin. (default=4)\n"
-"  -S           make structured symbols. Version must be specified.\n"
-"  -k           assume that the input text contains kanji (shift-jis).\n"
-"  -c           encode lower-case alphabet characters in 8-bit mode. (default)\n"
-"  -i           ignore case distinctions and use only upper-case characters.\n"
-"  -8           encode entire data in 8-bit mode. -k, -c and -i will be ignored.\n"
-"  -V           display the version number and copyrights of the qrencode.\n"
-"  [STRING]     input data. If it is not specified, data will be taken from\n"
-"               standard input.\n"
-			);
-		}
-	}
-}
-
-#define MAX_DATA_SIZE (7090 * 16) /* from the specification */
-static char *readStdin(void)
-{
-	char *buffer;
-	int ret;
-
-	buffer = (char *)malloc(MAX_DATA_SIZE);
-	ret = fread(buffer, 1, MAX_DATA_SIZE, stdin);
-	if(ret == 0) {
-		fprintf(stderr, "No input data.\n");
-		exit(1);
-	}
-	if(!feof(stdin)) {
-		fprintf(stderr, "Input data is too large.\n");
-		exit(1);
-	}
-
-	buffer[ret] = '\0';
-
-	return buffer;
-}
-
-static int writePNG(QRcode *qrcode, const char *outfile)
-{
-	FILE *fp;
-	png_structp png_ptr;
-	png_infop info_ptr;
-	unsigned char *row, *p, *q;
-	int x, y, xx, yy, bit;
-	int realwidth;
-
-	realwidth = (qrcode->width + margin * 2) * size;
-	row = (unsigned char *)malloc((realwidth + 7) / 8);
-	if(row == NULL) {
-		fprintf(stderr, "Failed to allocate memory.\n");
-		exit(1);
-	}
-
-	if(outfile[0] == '-' && outfile[1] == '\0') {
-		fp = stdout;
-	} else {
-		fp = fopen(outfile, "wb");
-		if(fp == NULL) {
-			fprintf(stderr, "Failed to create file: %s\n", outfile);
-			perror(NULL);
-			exit(1);
-		}
-	}
-
-	png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-	if(png_ptr == NULL) {
-		fclose(fp);
-		fprintf(stderr, "Failed to initialize PNG writer.\n");
-		exit(1);
-	}
-
-	info_ptr = png_create_info_struct(png_ptr);
-	if(info_ptr == NULL) {
-		fclose(fp);
-		fprintf(stderr, "Failed to initialize PNG write.\n");
-		exit(1);
-	}
-
-	if(setjmp(png_jmpbuf(png_ptr))) {
-		png_destroy_write_struct(&png_ptr, &info_ptr);
-		fclose(fp);
-		fprintf(stderr, "Failed to write PNG image.\n");
-		exit(1);
-	}
-
-	png_init_io(png_ptr, fp);
-	png_set_IHDR(png_ptr, info_ptr,
-			realwidth, realwidth,
-			1,
-			PNG_COLOR_TYPE_GRAY,
-			PNG_INTERLACE_NONE,
-			PNG_COMPRESSION_TYPE_DEFAULT,
-			PNG_FILTER_TYPE_DEFAULT);
-	png_write_info(png_ptr, info_ptr);
-
-	/* top margin */
-	memset(row, 0xff, (realwidth + 7) / 8);
-	for(y=0; y<margin * size; y++) {
-		png_write_row(png_ptr, row);
-	}
-
-	/* data */
-	p = qrcode->data;
-	for(y=0; y<qrcode->width; y++) {
-		bit = 7;
-		memset(row, 0xff, (realwidth + 7) / 8);
-		q = row;
-		q += margin * size / 8;
-		bit = 7 - (margin * size % 8);
-		for(x=0; x<qrcode->width; x++) {
-			for(xx=0; xx<size; xx++) {
-				*q ^= (*p & 1) << bit;
-				bit--;
-				if(bit < 0) {
-					q++;
-					bit = 7;
-				}
-			}
-			p++;
-		}
-		for(yy=0; yy<size; yy++) {
-			png_write_row(png_ptr, row);
-		}
-	}
-	/* bottom margin */
-	memset(row, 0xff, (realwidth + 7) / 8);
-	for(y=0; y<margin * size; y++) {
-		png_write_row(png_ptr, row);
-	}
-
-	png_write_end(png_ptr, info_ptr);
-	png_destroy_write_struct(&png_ptr, &info_ptr);
-
-	fclose(fp);
-	free(row);
-
-	return 0;
-}
-
-static QRcode *encode(const char *intext)
-{
-	QRcode *code;
-
-	if(eightbit) {
-		code = QRcode_encodeString8bit(intext, version, level);
-	} else {
-		code = QRcode_encodeString(intext, version, level, hint, casesensitive);
-	}
-
-	return code;
-}
-
-static void qrencode(const char *intext, const char *outfile)
-{
-	QRcode *qrcode;
-	
-	qrcode = encode(intext);
-	if(qrcode == NULL) {
-		fprintf(stderr, "Failed to encode the input data.\n");
-		exit(1);
-	}
-	writePNG(qrcode, outfile);
-	QRcode_free(qrcode);
-}
-
-static QRcode_List *encodeStructured(const char *intext)
-{
-	QRcode_List *list;
-
-	if(eightbit) {
-		list = QRcode_encodeString8bitStructured(intext, version, level);
-	} else {
-		list = QRcode_encodeStringStructured(intext, version, level, hint, casesensitive);
-	}
-
-	return list;
-}
-
-static void qrencodeStructured(const char *intext, const char *outfile)
-{
-	QRcode_List *qrlist, *p;
-	char filename[FILENAME_MAX];
-	char *base, *q, *suffix = NULL;
-	int i = 1;
-
-	base = strdup(outfile);
-	if(base == NULL) {
-		fprintf(stderr, "Failed to allocate memory.\n");
-		exit(1);
-	}
-	if(strlen(base) > 4) {
-		q = base + strlen(base) - 4;
-		if(strcasecmp(".png", q) == 0) {
-			suffix = strdup(q);
-			*q = '\0';
-		}
-	}
-	
-	qrlist = encodeStructured(intext);
-	if(qrlist == NULL) {
-		fprintf(stderr, "Failed to encode the input data.\n");
-		exit(1);
-	}
-
-	for(p = qrlist; p != NULL; p = p->next) {
-		if(p->code == NULL) {
-			fprintf(stderr, "Failed to encode the input data.\n");
-			exit(1);
-		}
-		if(suffix) {
-			snprintf(filename, FILENAME_MAX, "%s-%02d%s", base, i, suffix);
-		} else {
-			snprintf(filename, FILENAME_MAX, "%s-%02d", base, i);
-		}
-		writePNG(p->code, filename);
-		i++;
-	}
-
-	free(base);
-	if(suffix) {
-		free(suffix);
-	}
-
-	QRcode_List_free(qrlist);
-}
-
-int main(int argc, char **argv)
-{
-	int opt, lindex = -1;
-	char *outfile = NULL;
-	char *intext = NULL;
-
-	while((opt = getopt_long(argc, argv, optstring, options, &lindex)) != -1) {
-		switch(opt) {
-			case 'h':
-				if(lindex == 0) {
-					usage(1, 1);
-				} else {
-					usage(1, 0);
-				}
-				exit(0);
-				break;
-			case 'o':
-				outfile = optarg;
-				break;
-			case 's':
-				size = atoi(optarg);
-				if(size <= 0) {
-					fprintf(stderr, "Invalid size: %d\n", size);
-					exit(1);
-				}
-				break;
-			case 'v':
-				version = atoi(optarg);
-				if(version < 0) {
-					fprintf(stderr, "Invalid version: %d\n", version);
-					exit(1);
-				}
-				break;
-			case 'l':
-				switch(*optarg) {
-					case 'l':
-					case 'L':
-						level = QR_ECLEVEL_L;
-						break;
-					case 'm':
-					case 'M':
-						level = QR_ECLEVEL_M;
-						break;
-					case 'q':
-					case 'Q':
-						level = QR_ECLEVEL_Q;
-						break;
-					case 'h':
-					case 'H':
-						level = QR_ECLEVEL_H;
-						break;
-					default:
-						fprintf(stderr, "Invalid level: %s\n", optarg);
-						exit(1);
-						break;
-				}
-				break;
-			case 'm':
-				margin = atoi(optarg);
-				if(margin < 0) {
-					fprintf(stderr, "Invalid margin: %d\n", margin);
-					exit(1);
-				}
-				break;
-			case 'S':
-				structured = 1;
-			case 'k':
-				hint = QR_MODE_KANJI;
-				break;
-			case 'c':
-				casesensitive = 1;
-				break;
-			case 'i':
-				casesensitive = 0;
-				break;
-			case '8':
-				eightbit = 1;
-				break;
-			case 'V':
-				usage(0, 0);
-				exit(0);
-				break;
-			default:
-				fprintf(stderr, "Try `qrencode --help' for more information.\n");
-				exit(1);
-				break;
-		}
-	}
-
-	if(argc == 1) {
-		usage(1, 0);
-		exit(0);
-	}
-
-	if(outfile == NULL) {
-		fprintf(stderr, "No output filename is given.\n");
-		exit(1);
-	}
-
-	if(optind < argc) {
-		intext = argv[optind];
-	}
-	if(intext == NULL) {
-		intext = readStdin();
-	}
-
-	if(structured) {
-		if(version == 0) {
-			fprintf(stderr, "Version must be specified to encode structured symbols.\n");
-			exit(1);
-		}
-		qrencodeStructured(intext, outfile);
-	} else {
-		qrencode(intext, outfile);
-	}
-
-	return 0;
-}
diff --git a/qrencode/src/qrencode.c b/qrencode/src/qrencode.c
deleted file mode 100644
index 5eebc4dc1363d5a0bbf2be2b1a9b2b6fabe5a99b..0000000000000000000000000000000000000000
--- a/qrencode/src/qrencode.c
+++ /dev/null
@@ -1,591 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "qrencode.h"
-#include "qrencode_inner.h"
-#include "qrspec.h"
-#include "bitstream.h"
-#include "qrinput.h"
-#include "rscode.h"
-#include "split.h"
-#include "mask.h"
-
-/******************************************************************************
- * Raw code
- *****************************************************************************/
-
-static void RSblock_init(RSblock *block, int dl, unsigned char *data, int el)
-{
-	RS *rs;
-
-	block->dataLength = dl;
-	block->data = data;
-	block->eccLength = el;
-	block->ecc = (unsigned char *)malloc(el);
-
-	rs = init_rs(8, 0x11d, 0, 1, el, 255 - dl - el);
-	encode_rs_char(rs, data, block->ecc);
-}
-
-QRRawCode *QRraw_new(QRinput *input)
-{
-	QRRawCode *raw;
-	int *spec;
-	int i;
-	RSblock *rsblock;
-	unsigned char *p;
-
-	p = QRinput_getByteStream(input);
-	if(p == NULL) {
-		return NULL;
-	}
-
-	raw = (QRRawCode *)malloc(sizeof(QRRawCode));
-	raw->datacode = p;
-	spec = QRspec_getEccSpec(input->version, input->level);
-	if(spec == NULL) {
-		free(raw);
-		return NULL;
-	}
-	raw->version = input->version;
-	raw->blocks = QRspec_rsBlockNum(spec);
-	raw->rsblock = (RSblock *)malloc(sizeof(RSblock) * raw->blocks);
-
-	rsblock = raw->rsblock;
-	p = raw->datacode;
-	for(i=0; i<QRspec_rsBlockNum1(spec); i++) {
-		RSblock_init(rsblock, QRspec_rsDataCodes1(spec), p,
-						QRspec_rsEccCodes1(spec));
-		p += QRspec_rsDataCodes1(spec);
-		rsblock++;
-	}
-	for(i=0; i<QRspec_rsBlockNum2(spec); i++) {
-		RSblock_init(rsblock, QRspec_rsDataCodes2(spec), p,
-						QRspec_rsEccCodes2(spec));
-		p += QRspec_rsDataCodes2(spec);
-		rsblock++;
-	}
-
-	raw->b1 = QRspec_rsBlockNum1(spec);
-	raw->dataLength = QRspec_rsBlockNum1(spec) * QRspec_rsDataCodes1(spec)
-					+ QRspec_rsBlockNum2(spec) * QRspec_rsDataCodes2(spec);
-	raw->eccLength = QRspec_rsBlockNum(spec) * QRspec_rsEccCodes1(spec);
-	raw->count = 0;
-
-	free(spec);
-
-	return raw;
-}
-
-/**
- * Return a code (byte).
- * This function can be called iteratively.
- * @param raw raw code.
- * @return code
- */
-unsigned char QRraw_getCode(QRRawCode *raw)
-{
-	int col, row;
-	unsigned char ret;
-
-	if(raw->count < raw->dataLength) {
-		row = raw->count % raw->blocks;
-		col = raw->count / raw->blocks;
-		if(col >= raw->rsblock[row].dataLength) {
-			row += raw->b1;
-		}
-		ret = raw->rsblock[row].data[col];
-	} else if(raw->count < raw->dataLength + raw->eccLength) {
-		row = (raw->count - raw->dataLength) % raw->blocks;
-		col = (raw->count - raw->dataLength) / raw->blocks;
-		ret = raw->rsblock[row].ecc[col];
-	} else {
-		return 0;
-	}
-	raw->count++;
-	return ret;
-}
-
-void QRraw_free(QRRawCode *raw)
-{
-	int i;
-
-	free(raw->datacode);
-	for(i=0; i<raw->blocks; i++) {
-		free(raw->rsblock[i].ecc);
-	}
-	free(raw->rsblock);
-	free(raw);
-}
-
-/******************************************************************************
- * Frame filling
- *****************************************************************************/
-
-typedef struct {
-	int width;
-	unsigned char *frame;
-	int x, y;
-	int dir;
-	int bit;
-} FrameFiller;
-
-static FrameFiller *FrameFiller_new(int width, unsigned char *frame)
-{
-	FrameFiller *filler;
-
-	filler = (FrameFiller *)malloc(sizeof(FrameFiller));
-	filler->width = width;
-	filler->frame = frame;
-	filler->x = width - 1;
-	filler->y = width - 1;
-	filler->dir = -1;
-	filler->bit = -1;
-
-	return filler;
-}
-
-static unsigned char *FrameFiller_next(FrameFiller *filler)
-{
-	unsigned char *p;
-	int x, y, w;
-
-	if(filler->bit == -1) {
-		filler->bit = 0;
-		return filler->frame + filler->y * filler->width + filler->x;
-	}
-
-	x = filler->x;
-	y = filler->y;
-	p = filler->frame;
-	w = filler->width;
-
-	if(filler->bit == 0) {
-		x--;
-		filler->bit++;
-	} else {
-		x++;
-		y += filler->dir;
-		filler->bit--;
-	}
-
-	if(filler->dir < 0) {
-		if(y < 0) {
-			y = 0;
-			x -= 2;
-			filler->dir = 1;
-			if(x == 6) {
-				x--;
-				y = 9;
-			}
-		}
-	} else {
-		if(y == w) {
-			y = w - 1;
-			x -= 2;
-			filler->dir = -1;
-			if(x == 6) {
-				x--;
-				y -= 8;
-			}
-		}
-	}
-	if(x < 0 || y < 0) return NULL;
-
-	filler->x = x;
-	filler->y = y;
-
-	if(p[y * w + x] & 0x80) {
-		// This tail recursion could be optimized.
-		return FrameFiller_next(filler);
-	}
-	return &p[y * w + x];
-}
-
-#if 0
-unsigned char *FrameFiller_fillerTest(int version)
-{
-	int width, length;
-	unsigned char *frame, *p;
-	FrameFiller *filler;
-	int i, j;
-	unsigned char cl = 1;
-	unsigned char ch = 0;
-
-	width = QRspec_getWidth(version);
-	frame = QRspec_newFrame(version);
-	filler = FrameFiller_new(width, frame);
-	length = QRspec_getDataLength(version, QR_ECLEVEL_L)
-			+ QRspec_getECCLength(version, QR_ECLEVEL_L);
-
-	for(i=0; i<length; i++) {
-		for(j=0; j<8; j++) {
-			p = FrameFiller_next(filler);
-			*p = ch | cl;
-			cl++;
-			if(cl == 9) {
-				cl = 1;
-				ch += 0x10;
-			}
-		}
-	}
-	length = QRspec_getRemainder(version);
-	for(i=0; i<length; i++) {
-		p = FrameFiller_next(filler);
-		*p = 0xa0;
-	}
-	p = FrameFiller_next(filler);
-	free(filler);
-	if(p != NULL) {
-		return NULL;
-	}
-
-	return frame;
-}
-#endif
-
-/******************************************************************************
- * Format information
- *****************************************************************************/
-
-int QRcode_writeFormatInformation(int width, unsigned char *frame, int mask, QRecLevel level)
-{
-	unsigned int format;
-	unsigned char v;
-	int i;
-	int blacks = 0;
-
-	format =  QRspec_getFormatInfo(mask, level);
-
-	for(i=0; i<8; i++) {
-		if(format & 1) {
-			blacks += 2;
-			v = 0x85;
-		} else {
-			v = 0x84;
-		}
-		frame[width * 8 + width - 1 - i] = v;
-		if(i < 6) {
-			frame[width * i + 8] = v;
-		} else {
-			frame[width * (i + 1) + 8] = v;
-		}
-		format= format >> 1;
-	}
-	for(i=0; i<7; i++) {
-		if(format & 1) {
-			blacks += 2;
-			v = 0x85;
-		} else {
-			v = 0x84;
-		}
-		frame[width * (width - 7 + i) + 8] = v;
-		if(i == 0) {
-			frame[width * 8 + 7] = v;
-		} else {
-			frame[width * 8 + 6 - i] = v;
-		}
-		format= format >> 1;
-	}
-
-	return blacks;
-}
-
-/******************************************************************************
- * QR-code encoding
- *****************************************************************************/
-
-static QRcode *QRcode_new(int version, int width, unsigned char *data)
-{
-	QRcode *qrcode;
-
-	qrcode = (QRcode *)malloc(sizeof(QRcode));
-	qrcode->version = version;
-	qrcode->width = width;
-	qrcode->data = data;
-
-	return qrcode;
-}
-
-void QRcode_free(QRcode *qrcode)
-{
-	if(qrcode == NULL) return;
-
-	if(qrcode->data != NULL) {
-		free(qrcode->data);
-	}
-	free(qrcode);
-}
-
-QRcode *QRcode_encodeMask(QRinput *input, int mask)
-{
-	int width, version;
-	QRRawCode *raw;
-	unsigned char *frame, *masked, *p, code, bit;
-	FrameFiller *filler;
-	int i, j;
-	QRcode *qrcode;
-
-	if(input->version < 0 || input->version > QRSPEC_VERSION_MAX) {
-		errno = EINVAL;
-		return NULL;
-	}
-	if(input->level < QR_ECLEVEL_L || input->level > QR_ECLEVEL_H) {
-		errno = EINVAL;
-		return NULL;
-	}
-
-	raw = QRraw_new(input);
-	if(raw == NULL) return NULL;
-
-	version = raw->version;
-	width = QRspec_getWidth(version);
-	frame = QRspec_newFrame(version);
-	filler = FrameFiller_new(width, frame);
-
-	/* inteleaved data and ecc codes */
-	for(i=0; i<raw->dataLength + raw->eccLength; i++) {
-		code = QRraw_getCode(raw);
-		bit = 0x80;
-		for(j=0; j<8; j++) {
-			p = FrameFiller_next(filler);
-			*p = 0x02 | ((bit & code) != 0);
-			bit = bit >> 1;
-		}
-	}
-	QRraw_free(raw);
-	/* remainder bits */
-	j = QRspec_getRemainder(version);
-	for(i=0; i<j; i++) {
-		p = FrameFiller_next(filler);
-		*p = 0x02;
-	}
-	free(filler);
-	/* masking */
-	if(mask < 0) {
-		masked = Mask_mask(width, frame, input->level);
-	} else {
-		masked = Mask_makeMask(width, frame, mask);
-		QRcode_writeFormatInformation(width, masked, mask, input->level);
-	}
-	qrcode = QRcode_new(version, width, masked);
-
-	free(frame);
-
-	return qrcode;
-}
-
-QRcode *QRcode_encodeInput(QRinput *input)
-{
-	return QRcode_encodeMask(input, -1);
-}
-
-QRcode *QRcode_encodeString8bit(const char *string, int version, QRecLevel level)
-{
-	QRinput *input;
-	QRcode *code;
-
-	input = QRinput_new2(version, level);
-	if(input == NULL) return NULL;
-
-	QRinput_append(input, QR_MODE_8, strlen(string), (unsigned char *)string);
-	code = QRcode_encodeInput(input);
-	QRinput_free(input);
-
-	return code;
-}
-
-QRcode *QRcode_encodeString(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive)
-{
-	QRinput *input;
-	QRcode *code;
-	int ret;
-
-	if(hint != QR_MODE_8 && hint != QR_MODE_KANJI) {
-		errno = EINVAL;
-		return NULL;
-	}
-
-	input = QRinput_new2(version, level);
-	if(input == NULL) return NULL;
-
-	ret = Split_splitStringToQRinput(string, input, hint, casesensitive);
-	if(ret < 0) {
-		QRinput_free(input);
-		return NULL;
-	}
-
-	code = QRcode_encodeInput(input);
-	QRinput_free(input);
-
-	return code;
-}
-
-/******************************************************************************
- * Structured QR-code encoding
- *****************************************************************************/
-
-static QRcode_List *QRcode_List_newEntry(void)
-{
-	QRcode_List *entry;
-
-	entry = (QRcode_List *)malloc(sizeof(QRcode_List));
-	if(entry == NULL) return NULL;
-
-	entry->next = NULL;
-	entry->code = NULL;
-
-	return entry;
-}
-
-static void QRcode_List_freeEntry(QRcode_List *entry)
-{
-	if(entry->code != NULL) QRcode_free(entry->code);
-	free(entry);
-}
-
-void QRcode_List_free(QRcode_List *qrlist)
-{
-	QRcode_List *list = qrlist, *next;
-
-	while(list != NULL) {
-		next = list->next;
-		QRcode_List_freeEntry(list);
-		list = next;
-	}
-}
-
-int QRcode_List_size(QRcode_List *qrlist)
-{
-	QRcode_List *list = qrlist;
-	int size = 0;
-
-	while(list != NULL) {
-		size++;
-		list = list->next;
-	}
-
-	return size;
-}
-
-#if 0
-static unsigned char QRcode_parity(const char *str, int size)
-{
-	unsigned char parity = 0;
-	int i;
-
-	for(i=0; i<size; i++) {
-		parity ^= str[i];
-	}
-
-	return parity;
-}
-#endif
-
-QRcode_List *QRcode_encodeInputStructured(QRinput_Struct *s)
-{
-	QRcode_List *head = NULL;
-	QRcode_List *tail = NULL;
-	QRinput_InputList *list = s->head;
-
-	while(list != NULL) {
-		if(head == NULL) {
-			head = QRcode_List_newEntry();
-			tail = head;
-		} else {
-			tail->next = QRcode_List_newEntry();
-			tail = tail->next;
-		}
-		tail->code = QRcode_encodeInput(list->input);
-		if(tail->code == NULL) {
-			QRcode_List_free(head);
-			return NULL;
-		}
-		list = list->next;
-	}
-
-	return head;
-}
-
-static QRcode_List *QRcode_encodeInputToStructured(QRinput *input)
-{
-	QRinput_Struct *s;
-	QRcode_List *codes;
-
-	s = QRinput_splitQRinputToStruct(input);
-	if(s == NULL) return NULL;
-
-	codes = QRcode_encodeInputStructured(s);
-	QRinput_Struct_free(s);
-
-	return codes;
-}
-
-QRcode_List *QRcode_encodeString8bitStructured(const char *string, int version, QRecLevel level)
-{
-	QRinput *input;
-	QRcode_List *codes;
-	int ret;
-
-	if(version <= 0) return NULL;
-
-	input = QRinput_new2(version, level);
-	if(input == NULL) return NULL;
-
-	ret = QRinput_append(input, QR_MODE_8, strlen(string), (unsigned char *)string);
-	if(ret < 0) {
-		QRinput_free(input);
-		return NULL;
-	}
-	codes = QRcode_encodeInputToStructured(input);
-	QRinput_free(input);
-
-	return codes;
-}
-
-QRcode_List *QRcode_encodeStringStructured(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive)
-{
-	QRinput *input;
-	QRcode_List *codes;
-	int ret;
-
-	if(version <= 0) return NULL;
-	if(hint != QR_MODE_8 && hint != QR_MODE_KANJI) {
-		return NULL;
-	}
-
-	input = QRinput_new2(version, level);
-	if(input == NULL) return NULL;
-
-	ret = Split_splitStringToQRinput(string, input, hint, casesensitive);
-	if(ret < 0) {
-		QRinput_free(input);
-		return NULL;
-	}
-	codes = QRcode_encodeInputToStructured(input);
-	QRinput_free(input);
-
-	return codes;
-}
diff --git a/qrencode/src/qrencode.h b/qrencode/src/qrencode.h
deleted file mode 100644
index a79ee700676289debacdb4c44e0d5a2d728d563e..0000000000000000000000000000000000000000
--- a/qrencode/src/qrencode.h
+++ /dev/null
@@ -1,423 +0,0 @@
-/**
- * qrencode - QR Code encoder
- *
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/** \mainpage
- * Libqrencode is a library for encoding data in a QR Code symbol, a kind of 2D
- * symbology.
- *
- * \section encoding Encoding
- * 
- * There are two ways to encode data: <b>encoding a string</b> or 
- * <b>encoding a structured data</b>.
- *
- * \subsection encoding-string Encoding a string
- * You can encode a string by calling QRcode_encodeString().
- * The given string is parsed automatically and encoded. If you want to encode
- * data that can be represented as a C string style (NUL terminated), you can
- * simply use this way.
- *
- * If the input data contains Kanji (Shift-JIS) characters and you want to
- * encode them as Kanji in QR Code, you should give QR_MODE_KANJI as a hint.
- * Otherwise, all of non-alphanumeric characters are encoded as 8 bit data.
- * If you want to encode a whole string in 8 bit mode, use
- * QRcode_encodeString8bit() instead.
- *
- * Please note that a C string can not contain NUL character. If your data
- * contains NUL, you should chose the second way.
- *
- * \subsection encoding-input Encoding a structured data
- * You can construct a structured input data manually. If the structure of the
- * input data is known, you can use this way.
- * At first, you must create a ::QRinput object by QRinput_new(). Then, you can
- * add input data to the QRinput object by QRinput_append().
- * Finally you can call QRcode_encodeInput() to encode the QRinput data.
- * You can reuse the QRinput data again to encode it in other symbols with
- * different parameters.
- *
- * \section result Result
- * The encoded symbol is resulted as a ::QRcode object. It will contain
- * its version number, width of the symbol and an array represents the symbol.
- * See ::QRcode for the details. You can free the object by QRcode_free().
- *
- * Please note that the version of the result may be larger than specified.
- * In such cases, the input data would be too large to be encoded in the
- * symbol of the specified version.
- *
- * \section structured Structured append
- * Libqrencode can generate "Structured-appended" symbols that enables to split
- * a large data set into mulitple QR codes. A QR code reader concatenates
- * multiple QR code symbols into a string.
- * Just like QRcode_encodeString(), you can use QRcode_encodeStringStructured()
- * to generate structured-appended symbols. This functions returns an instance
- * of ::QRcode_List. The returned list is a singly-linked list of QRcode: you
- * can retrieve each QR code in this way:
- *  
- * \code
- * QRcode_List *qrcodes;
- * QRcode_List *entry;
- * QRcode *qrcode;
- *
- * qrcodes = QRcode_encodeStringStructured(...);
- * entry = qrcodes;
- * while(entry != NULL) {
- *     qrcode = entry->code;
- *     // do something
- *     entry = entry->next;
- * }
- * QRcode_List_free(entry);
- * \endcode
- *
- * Instead of using auto-parsing functions, you can construct your own
- * structured input. At first, instantiate an object of ::QRinput_Struct
- * by calling QRinput_Struct_new(). This object can hold multiple ::QRinput,
- * and one QR code is generated for a ::QRinput.
- * QRinput_Struct_appendInput() appends a ::QRinput to a ::QRinput_Struct
- * object. In order to generate structured-appended symbols, it is required to
- * embed headers to each symbol. You can use
- * QRinput_Struct_insertStructuredAppendHeaders() to insert appropriate
- * headers to each symbol. You should call this function just once before
- * encoding symbols.
- */
-
-#ifndef __QRENCODE_H__
-#define __QRENCODE_H__
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/**
- * Encoding mode.
- */
-typedef enum {
-	QR_MODE_NUL = -1,	///< Terminator (NUL character)
-	QR_MODE_NUM = 0,	///< Numeric mode
-	QR_MODE_AN,			///< Alphabet-numeric mode
-	QR_MODE_8,			///< 8-bit data mode
-	QR_MODE_KANJI,		///< Kanji (shift-jis) mode
-	QR_MODE_STRUCTURE,	///< Internal use only
-} QRencodeMode;
-
-/**
- * Level of error correction.
- */
-typedef enum {
-	QR_ECLEVEL_L = 0, ///< lowest
-	QR_ECLEVEL_M,
-	QR_ECLEVEL_Q,
-	QR_ECLEVEL_H      ///< highest
-} QRecLevel;
-
-/******************************************************************************
- * Input data (qrinput.c)
- *****************************************************************************/
-
-/**
- * Singly linked list to contain input strings. An instance of this class
- * contains its version and error correction level too. It is required to
- * set them by QRinput_setVersion() and QRinput_setErrorCorrectionLevel(),
- * or use QRinput_new2() to instantiate an object.
- */
-typedef struct _QRinput QRinput;
-
-/**
- * Instantiate an input data object. The version is set to 0 (auto-select)
- * and the error correction level is set to QR_ECLEVEL_L.
- * @return an input object (initialized). On error, NULL is returned and errno
- *         is set to indicate the error.
- * @throw ENOMEM unable to allocate memory.
- */
-extern QRinput *QRinput_new(void);
-
-/**
- * Instantiate an input data object.
- * @param version version number.
- * @param level Error correction level.
- * @return an input object (initialized). On error, NULL is returned and errno
- *         is set to indicate the error.
- * @throw ENOMEM unable to allocate memory for input objects.
- * @throw EINVAL invalid arguments.
- */
-extern QRinput *QRinput_new2(int version, QRecLevel level);
-
-/**
- * Append data to an input object.
- * The data is copied and appended to the input object.
- * @param input input object.
- * @param mode encoding mode.
- * @param size size of data (byte).
- * @param data a pointer to the memory area of the input data.
- * @retval 0 success.
- * @retval -1 an error occurred and errno is set to indeicate the error.
- *            See Execptions for the details.
- * @throw ENOMEM unable to allocate memory.
- * @throw EINVAL input data is invalid.
- *
- */
-extern int QRinput_append(QRinput *input, QRencodeMode mode, int size, const unsigned char *data);
-
-/**
- * Get current version.
- * @param input input object.
- * @return current version.
- */
-extern int QRinput_getVersion(QRinput *input);
-
-/**
- * Set version of the QR-code that is to be encoded.
- * @param input input object.
- * @param version version number (0 = auto)
- * @retval 0 success.
- * @retval -1 invalid argument.
- */
-extern int QRinput_setVersion(QRinput *input, int version);
-
-/**
- * Get current error correction level.
- * @param input input object.
- * @return Current error correcntion level.
- */
-extern QRecLevel QRinput_getErrorCorrectionLevel(QRinput *input);
-
-/**
- * Set error correction level of the QR-code that is to be encoded.
- * @param input input object.
- * @param level Error correction level.
- * @retval 0 success.
- * @retval -1 invalid argument.
- */
-extern int QRinput_setErrorCorrectionLevel(QRinput *input, QRecLevel level);
-
-/**
- * Free the input object.
- * All of data chunks in the input object are freed too.
- * @param input input object.
- */
-extern void QRinput_free(QRinput *input);
-
-/**
- * Validate the input data.
- * @param mode encoding mode.
- * @param size size of data (byte).
- * @param data a pointer to the memory area of the input data.
- * @retval 0 success.
- * @retval -1 invalid arguments.
- */
-extern int QRinput_check(QRencodeMode mode, int size, const unsigned char *data);
-
-/**
- * Set of QRinput for structured symbols.
- */
-typedef struct _QRinput_Struct QRinput_Struct;
-
-/**
- * Instantiate a set of input data object.
- * @return an instance of QRinput_Struct. On error, NULL is returned and errno
- *         is set to indicate the error.
- * @throw ENOMEM unable to allocate memory.
- */
-extern QRinput_Struct *QRinput_Struct_new(void);
-
-/**
- * Set parity of structured symbols.
- * @param s structured input object.
- * @param parity parity of s.
- */
-extern void QRinput_Struct_setParity(QRinput_Struct *s, unsigned char parity);
-
-/**
- * Append a QRinput object to the set.
- * @warning never append the same QRinput object twice.
- * @param s structured input object.
- * @param input an input object.
- * @retval >0 number of input objects in the structure.
- * @retval -1 an error occurred. See Exceptions for the details.
- * @throw ENOMEM unable to allocate memory.
- */
-extern int QRinput_Struct_appendInput(QRinput_Struct *s, QRinput *input);
-
-/**
- * Free all of QRinput in the set.
- * @param s a structured input object.
- */
-extern void QRinput_Struct_free(QRinput_Struct *s);
-
-/**
- * Split a QRinput to QRinput_Struct. It calculates a parity, set it, then
- * insert structured-append headers.
- * @param input input object. Version number and error correction level must be
- *        set.
- * @return a set of input data. On error, NULL is returned, and errno is set
- *         to indicate the error. See Exceptions for the details.
- * @throw ERANGE input data is too large.
- * @throw EINVAL invalid input data.
- * @throw ENOMEM unable to allocate memory.
- */
-extern QRinput_Struct *QRinput_splitQRinputToStruct(QRinput *input);
-
-/**
- * Insert structured-append headers to the input structure. It calculates
- * a parity and set it if the parity is not set yet.
- * @param s input structure
- * @retval 0 success.
- * @retval -1 an error occurred and errno is set to indeicate the error.
- *            See Execptions for the details.
- * @throw EINVAL invalid input object.
- * @throw ENOMEM unable to allocate memory.
- */
-extern int QRinput_Struct_insertStructuredAppendHeaders(QRinput_Struct *s);
-
-/******************************************************************************
- * QRcode output (qrencode.c)
- *****************************************************************************/
-
-/**
- * QRcode class.
- * Symbol data is represented as an array contains width*width uchars.
- * Each uchar represents a module (dot). If the less significant bit of
- * the uchar is 1, the corresponding module is black. The other bits are
- * meaningless for usual applications, but here its specification is described.
- *
- * <pre>
- * MSB 76543210 LSB
- *     |||||||`- 1=black/0=white
- *     ||||||`-- data and ecc code area
- *     |||||`--- format information
- *     ||||`---- version information
- *     |||`----- timing pattern
- *     ||`------ alignment pattern
- *     |`------- finder pattern and separator
- *     `-------- non-data modules (format, timing, etc.)
- * </pre>
- */
-typedef struct {
-	int version;	///< version of the symbol
-	int width;		///< width of the symbol
-	unsigned char *data; ///< symbol data
-} QRcode;
-
-/**
- * Singly-linked list of QRcode. Used to represent a structured symbols.
- * A list is terminated with NULL.
- */
-typedef struct _QRcode_List QRcode_List;
-
-struct _QRcode_List {
-	QRcode *code;
-	QRcode_List *next;
-};
-
-/**
- * Create a symbol from the input data.
- * @warning This function is THREAD UNSAFE.
- * @param input input data.
- * @return an instance of QRcode class. The version of the result QRcode may
- *         be larger than the designated version. On error, NULL is returned,
- *         and errno is set to indicate the error. See Exceptions for the
- *         details.
- * @throw EINVAL invalid input object.
- * @throw ENOMEM unable to allocate memory for input objects.
- */
-extern QRcode *QRcode_encodeInput(QRinput *input);
-
-/**
- * Create a symbol from the string. The library automatically parses the input
- * string and encodes in a QR Code symbol.
- * @warning This function is THREAD UNSAFE.
- * @param string input string. It must be NULL terminated.
- * @param version version of the symbol. If 0, the library chooses the minimum
- *                version for the given input data.
- * @param level error correction level.
- * @param hint tell the library how non-alphanumerical characters should be
- *             encoded. If QR_MODE_KANJI is given, kanji characters will be
- *             encoded as Shif-JIS characters. If QR_MODE_8 is given, all of
- *             non-alphanumerical characters will be encoded as is. If you want
- *             to embed UTF-8 string, choose this.
- * @param casesensitive case-sensitive(1) or not(0).
- * @return an instance of QRcode class. The version of the result QRcode may
- *         be larger than the designated version. On error, NULL is returned,
- *         and errno is set to indicate the error. See Exceptions for the
- *         details.
- * @throw EINVAL invalid input object.
- * @throw ENOMEM unable to allocate memory for input objects.
- */
-extern QRcode *QRcode_encodeString(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
-
-/**
- * Same to ::QRcode_qncodeString, but encode whole data in 8-bit mode.
- * @warning This function is THREAD UNSAFE.
- */
-extern QRcode *QRcode_encodeString8bit(const char *string, int version, QRecLevel level);
-
-/**
- * Free the instance of QRcode class.
- * @param qrcode an instance of QRcode class.
- */
-extern void QRcode_free(QRcode *qrcode);
-
-/**
- * Create structured symbols from the input data.
- * @warning This function is THREAD UNSAFE.
- * @param s
- * @return a singly-linked list of QRcode.
- */
-extern QRcode_List *QRcode_encodeInputStructured(QRinput_Struct *s);
-
-/**
- * Create structured symbols from the string. The library automatically parses
- * the input string and encodes in a QR Code symbol.
- * @warning This function is THREAD UNSAFE.
- * @param string input string. It should be NULL terminated.
- * @param version version of the symbol.
- * @param level error correction level.
- * @param hint tell the library how non-alphanumerical characters should be
- *             encoded. If QR_MODE_KANJI is given, kanji characters will be
- *             encoded as Shif-JIS characters. If QR_MODE_8 is given, all of
- *             non-alphanumerical characters will be encoded as is. If you want
- *             to embed UTF-8 string, choose this.
- * @param casesensitive case-sensitive(1) or not(0).
- * @return a singly-linked list of QRcode.
- */
-extern QRcode_List *QRcode_encodeStringStructured(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
-
-/**
- * Same to QRcode_qncodeStringStructured, but encode whole data in 8-bit mode.
- * @warning This function is THREAD UNSAFE.
- */
-extern QRcode_List *QRcode_encodeString8bitStructured(const char *string, int version, QRecLevel level);
-
-/**
- * Return the number of symbols included in a QRcode_List.
- * @param qrlist a head entry of a QRcode_List.
- * @return number of symbols in the list.
- */
-extern int QRcode_List_size(QRcode_List *qrlist);
-
-/**
- * Free the QRcode_List.
- * @param qrlist a head entry of a QRcode_List.
- */
-extern void QRcode_List_free(QRcode_List *qrlist);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif /* __QRENCODE_H__ */
diff --git a/qrencode/src/qrencode_inner.h b/qrencode/src/qrencode_inner.h
deleted file mode 100644
index 68255a684b65a57c5c016617899fca7200383c4f..0000000000000000000000000000000000000000
--- a/qrencode/src/qrencode_inner.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * qrencode - QR Code encoder
- *
- * Header for internal use
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __QRENCODE_INNER_H__
-#define __QRENCODE_INNER_H__
-
-/**
- * This header file includes definitions for inner use.
- */
-
-/******************************************************************************
- * Raw code
- *****************************************************************************/
-
-typedef struct {
-	int dataLength;
-	unsigned char *data;
-	int eccLength;
-	unsigned char *ecc;
-} RSblock;
-
-typedef struct {
-	int version;
-	unsigned char *datacode;
-	int blocks;
-	RSblock *rsblock;
-	int count;
-	int dataLength;
-	int eccLength;
-	int b1;
-} QRRawCode;
-
-extern QRRawCode *QRraw_new(QRinput *input);
-extern unsigned char QRraw_getCode(QRRawCode *raw);
-extern void QRraw_free(QRRawCode *raw);
-
-/******************************************************************************
- * Frame filling
- *****************************************************************************/
-extern unsigned char *FrameFiller_fillerTest(int version);
-
-/******************************************************************************
- * Format information
- *****************************************************************************/
-extern int QRcode_writeFormatInformation(int width, unsigned char *frame, int mask, QRecLevel level);
-
-extern QRcode *QRcode_encodeMask(QRinput *input, int mask);
-#endif /* __QRENCODE_INNER_H__ */
diff --git a/qrencode/src/qrinput.c b/qrencode/src/qrinput.c
deleted file mode 100644
index f5d7d9051d85be4f988eea1bc1a9cdb3f2d8ba57..0000000000000000000000000000000000000000
--- a/qrencode/src/qrinput.c
+++ /dev/null
@@ -1,1183 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Input data chunk class
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "qrencode.h"
-#include "qrspec.h"
-#include "bitstream.h"
-#include "qrinput.h"
-
-/******************************************************************************
- * Entry of input data
- *****************************************************************************/
-
-static QRinput_List *QRinput_List_newEntry(QRencodeMode mode, int size, const unsigned char *data)
-{
-	QRinput_List *entry;
-
-	if(QRinput_check(mode, size, data)) {
-		errno = EINVAL;
-		return NULL;
-	}
-
-	entry = (QRinput_List *)malloc(sizeof(QRinput_List));
-	if(entry == NULL) return NULL;
-
-	entry->mode = mode;
-	entry->size = size;
-	entry->data = (unsigned char *)malloc(size);
-	if(entry->data == NULL) {
-		free(entry);
-		return NULL;
-	}
-	memcpy(entry->data, data, size);
-	entry->bstream = NULL;
-	entry->next = NULL;
-
-	return entry;
-}
-
-static QRinput_List *QRinput_List_freeEntry(QRinput_List *entry)
-{
-	QRinput_List *next;
-
-	next = entry->next;
-	free(entry->data);
-	if(entry->bstream) {
-		BitStream_free(entry->bstream);
-	}
-	free(entry);
-
-	return next;
-}
-
-static QRinput_List *QRinput_List_dup(QRinput_List *entry)
-{
-	QRinput_List *n;
-
-	n = (QRinput_List *)malloc(sizeof(QRinput_List));
-	if(n == NULL) return NULL;
-
-	n->mode = entry->mode;
-	n->size = entry->size;
-	n->data = (unsigned char *)malloc(n->size);
-	if(n->data == NULL) {
-		free(n);
-		return NULL;
-	}
-	memcpy(n->data, entry->data, entry->size);
-	n->bstream = NULL;
-	n->next = NULL;
-
-	return n;
-}
-
-/******************************************************************************
- * Input Data
- *****************************************************************************/
-
-QRinput *QRinput_new(void)
-{
-	return QRinput_new2(0, QR_ECLEVEL_L);
-}
-
-QRinput *QRinput_new2(int version, QRecLevel level)
-{
-	QRinput *input;
-
-	if(version < 0 || version > QRSPEC_VERSION_MAX || level < QR_ECLEVEL_L || level > QR_ECLEVEL_H) {
-		errno = EINVAL;
-		return NULL;
-	}
-
-	input = (QRinput *)malloc(sizeof(QRinput));
-	if(input == NULL) return NULL;
-
-	input->head = NULL;
-	input->tail = NULL;
-	input->version = version;
-	input->level = level;
-
-	return input;
-}
-
-int QRinput_getVersion(QRinput *input)
-{
-	return input->version;
-}
-
-int QRinput_setVersion(QRinput *input, int version)
-{
-	if(version < 0 || version > QRSPEC_VERSION_MAX) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	input->version = version;
-
-	return 0;
-}
-
-QRecLevel QRinput_getErrorCorrectionLevel(QRinput *input)
-{
-	return input->level;
-}
-
-int QRinput_setErrorCorrectionLevel(QRinput *input, QRecLevel level)
-{
-	if(level < QR_ECLEVEL_L || level > QR_ECLEVEL_H) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	input->level = level;
-
-	return 0;
-}
-
-static void QRinput_appendEntry(QRinput *input, QRinput_List *entry)
-{
-	if(input->tail == NULL) {
-		input->head = entry;
-		input->tail = entry;
-	} else {
-		input->tail->next = entry;
-		input->tail = entry;
-	}
-	entry->next = NULL;
-}
-
-int QRinput_append(QRinput *input, QRencodeMode mode, int size, const unsigned char *data)
-{
-	QRinput_List *entry;
-
-	entry = QRinput_List_newEntry(mode, size, data);
-	if(entry == NULL) {
-		return -1;
-	}
-
-	QRinput_appendEntry(input, entry);
-
-	return 0;
-}
-
-int QRinput_insertStructuredAppendHeader(QRinput *input, int size, int index, unsigned char parity)
-{
-	QRinput_List *entry;
-	unsigned char buf[3];
-
-	if(size > MAX_STRUCTURED_SYMBOLS) {
-		errno = EINVAL;
-		return -1;
-	}
-	if(index <= 0 || index > MAX_STRUCTURED_SYMBOLS) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	buf[0] = (unsigned char)size;
-	buf[1] = (unsigned char)index;
-	buf[2] = parity;
-	entry = QRinput_List_newEntry(QR_MODE_STRUCTURE, 3, buf);
-	if(entry == NULL) {
-		return -1;
-	}
-
-	entry->next = input->head;
-	input->head = entry;
-
-	return 0;
-}
-
-void QRinput_free(QRinput *input)
-{
-	QRinput_List *list;
-
-	list = input->head;
-	while(list != NULL) {
-		list = QRinput_List_freeEntry(list);
-	}
-
-	free(input);
-}
-
-static unsigned char QRinput_calcParity(QRinput *input)
-{
-	unsigned char parity = 0;
-	QRinput_List *list;
-	int i;
-
-	list = input->head;
-	while(list != NULL) {
-		if(list->mode != QR_MODE_STRUCTURE) {
-			for(i=list->size-1; i>=0; i--) {
-				parity ^= list->data[i];
-			}
-		}
-		list = list->next;
-	}
-
-	return parity;
-}
-
-QRinput *QRinput_dup(QRinput *input)
-{
-	QRinput *n;
-	QRinput_List *list, *e;
-
-	n = QRinput_new2(input->version, input->level);
-	if(n == NULL) return NULL;
-
-	list = input->head;
-	while(list != NULL) {
-		e = QRinput_List_dup(list);
-		QRinput_appendEntry(n, e);
-		list = list->next;
-	}
-
-	return n;
-}
-
-/******************************************************************************
- * Numeric data
- *****************************************************************************/
-
-/**
- * Check the input data.
- * @param size
- * @param data
- * @return result
- */
-static int QRinput_checkModeNum(int size, const char *data)
-{
-	int i;
-
-	for(i=0; i<size; i++) {
-		if(data[i] < '0' || data[i] > '9')
-			return -1;
-	}
-
-	return 0;
-}
-
-/**
- * Estimates the length of the encoded bit stream of numeric data.
- * @param size
- * @return number of bits
- */
-int QRinput_estimateBitsModeNum(int size)
-{
-	int w;
-	int bits;
-
-	w = size / 3;
-	bits = w * 10;
-	switch(size - w * 3) {
-		case 1:
-			bits += 4;
-			break;
-		case 2:
-			bits += 7;
-			break;
-		default:
-			break;
-	}
-
-	return bits;
-}
-
-/**
- * Convert the number data to a bit stream.
- * @param entry
- */
-static void QRinput_encodeModeNum(QRinput_List *entry, int version)
-{
-	int words;
-	int i;
-	unsigned int val;
-
-	words = entry->size / 3;
-	entry->bstream = BitStream_new();
-
-	val = 0x1;
-	BitStream_appendNum(entry->bstream, 4, val);
-	
-	val = entry->size;
-	BitStream_appendNum(entry->bstream, QRspec_lengthIndicator(QR_MODE_NUM, version), val);
-
-	for(i=0; i<words; i++) {
-		val  = (entry->data[i*3  ] - '0') * 100;
-		val += (entry->data[i*3+1] - '0') * 10;
-		val += (entry->data[i*3+2] - '0');
-
-		BitStream_appendNum(entry->bstream, 10, val);
-	}
-
-	if(entry->size - words * 3 == 1) {
-		val = entry->data[words*3] - '0';
-		BitStream_appendNum(entry->bstream, 4, val);
-	} else if(entry->size - words * 3 == 2) {
-		val  = (entry->data[words*3  ] - '0') * 10;
-		val += (entry->data[words*3+1] - '0');
-		BitStream_appendNum(entry->bstream, 7, val);
-	}
-}
-
-/******************************************************************************
- * Alphabet-numeric data
- *****************************************************************************/
-
-const signed char QRinput_anTable[] = {
-	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-	36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
-	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 44, -1, -1, -1, -1, -1,
-	-1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-	25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
-	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
-};
-
-/**
- * Check the input data.
- * @param size
- * @param data
- * @return result
- */
-static int QRinput_checkModeAn(int size, const char *data)
-{
-	int i;
-
-	for(i=0; i<size; i++) {
-		if(QRinput_lookAnTable(data[i]) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/**
- * Estimates the length of the encoded bit stream of alphabet-numeric data.
- * @param size
- * @return number of bits
- */
-int QRinput_estimateBitsModeAn(int size)
-{
-	int w;
-	int bits;
-
-	w = size / 2;
-	bits = w * 11;
-	if(size & 1) {
-		bits += 6;
-	}
-
-	return bits;
-}
-
-/**
- * Convert the alphabet-numeric data to a bit stream.
- * @param entry
- */
-static void QRinput_encodeModeAn(QRinput_List *entry, int version)
-{
-	int words;
-	int i;
-	unsigned int val;
-
-	words = entry->size / 2;
-	entry->bstream = BitStream_new();
-
-	val = 0x2;
-	BitStream_appendNum(entry->bstream, 4, val);
-	
-	val = entry->size;
-	BitStream_appendNum(entry->bstream, QRspec_lengthIndicator(QR_MODE_AN, version), val);
-
-	for(i=0; i<words; i++) {
-		val  = (unsigned int)QRinput_lookAnTable(entry->data[i*2  ]) * 45;
-		val += (unsigned int)QRinput_lookAnTable(entry->data[i*2+1]);
-
-		BitStream_appendNum(entry->bstream, 11, val);
-	}
-
-	if(entry->size & 1) {
-		val = (unsigned int)QRinput_lookAnTable(entry->data[words * 2]);
-
-		BitStream_appendNum(entry->bstream, 6, val);
-	}
-}
-
-/******************************************************************************
- * 8 bit data
- *****************************************************************************/
-
-/**
- * Estimates the length of the encoded bit stream of 8 bit data.
- * @param size
- * @return number of bits
- */
-int QRinput_estimateBitsMode8(int size)
-{
-	return size * 8;
-}
-
-/**
- * Convert the 8bits data to a bit stream.
- * @param entry
- */
-static void QRinput_encodeMode8(QRinput_List *entry, int version)
-{
-	int i;
-	unsigned int val;
-
-	entry->bstream = BitStream_new();
-
-	val = 0x4;
-	BitStream_appendNum(entry->bstream, 4, val);
-	
-	val = entry->size;
-	BitStream_appendNum(entry->bstream, QRspec_lengthIndicator(QR_MODE_8, version), val);
-
-	for(i=0; i<entry->size; i++) {
-		BitStream_appendNum(entry->bstream, 8, entry->data[i]);
-	}
-}
-
-
-/******************************************************************************
- * Kanji data
- *****************************************************************************/
-
-/**
- * Estimates the length of the encoded bit stream of kanji data.
- * @param size
- * @return number of bits
- */
-int QRinput_estimateBitsModeKanji(int size)
-{
-	return (size / 2) * 13;
-}
-
-/**
- * Check the input data.
- * @param size
- * @param data
- * @return result
- */
-static int QRinput_checkModeKanji(int size, const unsigned char *data)
-{
-	int i;
-	unsigned int val;
-
-	if(size & 1)
-		return -1;
-
-	for(i=0; i<size; i+=2) {
-		val = ((unsigned int)data[i] << 8) | data[i+1];
-		if(val < 0x8140 || (val > 0x9ffc && val < 0xe040) || val > 0xebbf) {
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-/**
- * Convert the kanji data to a bit stream.
- * @param entry
- */
-static void QRinput_encodeModeKanji(QRinput_List *entry, int version)
-{
-	int i;
-	unsigned int val, h;
-
-	entry->bstream = BitStream_new();
-
-	val = 0x8;
-	BitStream_appendNum(entry->bstream, 4, val);
-	
-	val = entry->size / 2;
-	BitStream_appendNum(entry->bstream, QRspec_lengthIndicator(QR_MODE_KANJI, version), val);
-
-	for(i=0; i<entry->size; i+=2) {
-		val = ((unsigned int)entry->data[i] << 8) | entry->data[i+1];
-		if(val <= 0x9ffc) {
-			val -= 0x8140;
-		} else {
-			val -= 0xc140;
-		}
-		h = (val >> 8) * 0xc0;
-		val = (val & 0xff) + h;
-
-		BitStream_appendNum(entry->bstream, 13, val);
-	}
-}
-
-/******************************************************************************
- * Structured Symbol
- *****************************************************************************/
-
-/**
- * Convert a structure symbol code to a bit stream.
- * @param entry
- */
-static void QRinput_encodeModeStructure(QRinput_List *entry, int version)
-{
-	entry->bstream = BitStream_new();
-
-	BitStream_appendNum(entry->bstream, 4, 0x03);
-	BitStream_appendNum(entry->bstream, 4, entry->data[1] - 1);
-	BitStream_appendNum(entry->bstream, 4, entry->data[0] - 1);
-	BitStream_appendNum(entry->bstream, 8, entry->data[2]);
-}
-
-/******************************************************************************
- * Validation
- *****************************************************************************/
-
-int QRinput_check(QRencodeMode mode, int size, const unsigned char *data)
-{
-	if(size <= 0) return -1;
-
-	switch(mode) {
-		case QR_MODE_NUM:
-			return QRinput_checkModeNum(size, (const char *)data);
-			break;
-		case QR_MODE_AN:
-			return QRinput_checkModeAn(size, (const char *)data);
-			break;
-		case QR_MODE_KANJI:
-			return QRinput_checkModeKanji(size, data);
-			break;
-		case QR_MODE_8:
-			return 0;
-			break;
-		case QR_MODE_STRUCTURE:
-			return 0;
-			break;
-		default:
-			break;
-	}
-
-	return -1;
-}
-
-/******************************************************************************
- * Estimation of the bit length
- *****************************************************************************/
-
-/**
- * Estimates the length of the encoded bit stream on the current version.
- * @param entry
- * @param version version of the symbol
- * @return number of bits
- */
-static int QRinput_estimateBitStreamSizeOfEntry(QRinput_List *entry, int version)
-{
-	int bits = 0;
-	int l, m;
-	int num;
-
-	if(version == 0) version = 1;
-
-	switch(entry->mode) {
-		case QR_MODE_NUM:
-			bits = QRinput_estimateBitsModeNum(entry->size);
-			break;
-		case QR_MODE_AN:
-			bits = QRinput_estimateBitsModeAn(entry->size);
-			break;
-		case QR_MODE_8:
-			bits = QRinput_estimateBitsMode8(entry->size);
-			break;
-		case QR_MODE_KANJI:
-			bits = QRinput_estimateBitsModeKanji(entry->size);
-			break;
-		case QR_MODE_STRUCTURE:
-			return STRUCTURE_HEADER_BITS;
-		default:
-			return 0;
-	}
-
-	l = QRspec_lengthIndicator(entry->mode, version);
-	m = 1 << l;
-	num = (entry->size + m - 1) / m;
-
-	bits += num * (4 + l); // mode indicator (4bits) + length indicator
-
-	return bits;
-}
-
-/**
- * Estimates the length of the encoded bit stream of the data.
- * @param input input data
- * @param version version of the symbol
- * @return number of bits
- */
-int QRinput_estimateBitStreamSize(QRinput *input, int version)
-{
-	QRinput_List *list;
-	int bits = 0;
-
-	list = input->head;
-	while(list != NULL) {
-		bits += QRinput_estimateBitStreamSizeOfEntry(list, version);
-		list = list->next;
-	}
-
-	return bits;
-}
-
-/**
- * Estimates the required version number of the symbol.
- * @param input input data
- * @return required version number
- */
-static int QRinput_estimateVersion(QRinput *input)
-{
-	int bits;
-	int version, prev;
-
-	version = 0;
-	do {
-		prev = version;
-		bits = QRinput_estimateBitStreamSize(input, prev);
-		version = QRspec_getMinimumVersion((bits + 7) / 8, input->level);
-		if (version < 0) {
-			return -1;
-		}
-	} while (version > prev);
-
-	return version;
-}
-
-/**
- * Returns required length in bytes for specified mode, version and bits.
- * @param mode
- * @param version
- * @param bits
- * @return required length of code words in bytes.
- */
-int QRinput_lengthOfCode(QRencodeMode mode, int version, int bits)
-{
-	int payload, size, chunks, remain, maxsize;
-
-	payload = bits - 4 - QRspec_lengthIndicator(mode, version);
-	switch(mode) {
-		case QR_MODE_NUM:
-			chunks = payload / 10;
-			remain = payload - chunks * 10;
-			size = chunks * 3;
-			if(remain >= 7) {
-				size += 2;
-			} else if(remain >= 4) {
-				size += 1;
-			}
-			break;
-		case QR_MODE_AN:
-			chunks = payload / 11;
-			remain = payload - chunks * 11;
-			size = chunks * 2;
-			if(remain >= 6) size++;
-			break;
-		case QR_MODE_8:
-			size = payload / 8;
-			break;
-		case QR_MODE_KANJI:
-			size = (payload / 13) * 2;
-			break;
-		case QR_MODE_STRUCTURE:
-			size = payload / 8;
-			break;
-		default:
-			size = 0;
-			break;
-	}
-	maxsize = QRspec_maximumWords(mode, version);
-	if(size < 0) size = 0;
-	if(size > maxsize) size = maxsize;
-
-	return size;
-}
-
-/******************************************************************************
- * Data conversion
- *****************************************************************************/
-
-/**
- * Convert the input data in the data chunk to a bit stream.
- * @param entry
- * @return number of bits
- */
-static int QRinput_encodeBitStream(QRinput_List *entry, int version)
-{
-	int words;
-	QRinput_List *st1, *st2;
-
-	if(entry->bstream != NULL) {
-		BitStream_free(entry->bstream);
-		entry->bstream = NULL;
-	}
-
-	words = QRspec_maximumWords(entry->mode, version);
-	if(entry->size > words) {
-		st1 = QRinput_List_newEntry(entry->mode, words, entry->data);
-		st2 = QRinput_List_newEntry(entry->mode, entry->size - words, &entry->data[words]);
-		QRinput_encodeBitStream(st1, version);
-		QRinput_encodeBitStream(st2, version);
-		entry->bstream = BitStream_new();
-		BitStream_append(entry->bstream, st1->bstream);
-		BitStream_append(entry->bstream, st2->bstream);
-		QRinput_List_freeEntry(st1);
-		QRinput_List_freeEntry(st2);
-	} else {
-		switch(entry->mode) {
-			case QR_MODE_NUM:
-				QRinput_encodeModeNum(entry, version);
-				break;
-			case QR_MODE_AN:
-				QRinput_encodeModeAn(entry, version);
-				break;
-			case QR_MODE_8:
-				QRinput_encodeMode8(entry, version);
-				break;
-			case QR_MODE_KANJI:
-				QRinput_encodeModeKanji(entry, version);
-				break;
-			case QR_MODE_STRUCTURE:
-				QRinput_encodeModeStructure(entry, version);
-				break;
-			default:
-				break;
-		}
-	}
-
-	return BitStream_size(entry->bstream);
-}
-
-/**
- * Convert the input data to a bit stream.
- * @param input input data.
- * @return length of the bit stream.
- */
-static int QRinput_createBitStream(QRinput *input)
-{
-	QRinput_List *list;
-	int bits = 0;
-
-	list = input->head;
-	while(list != NULL) {
-		bits += QRinput_encodeBitStream(list, input->version);
-		list = list->next;
-	}
-
-	return bits;
-}
-
-/**
- * Convert the input data to a bit stream.
- * When the version number is given and that is not sufficient, it is increased
- * automatically.
- * @param input input data.
- * @return -1 if the input data was too large. Otherwise 0.
- */
-static int QRinput_convertData(QRinput *input)
-{
-	int bits;
-	int ver;
-
-	ver = QRinput_estimateVersion(input);
-	if(ver > QRinput_getVersion(input)) {
-		QRinput_setVersion(input, ver);
-	}
-
-	for(;;) {
-		bits = QRinput_createBitStream(input);
-		ver = QRspec_getMinimumVersion((bits + 7) / 8, input->level);
-		if(ver < 0) {
-			return -1;
-		} else if(ver > QRinput_getVersion(input)) {
-			QRinput_setVersion(input, ver);
-		} else {
-			break;
-		}
-	}
-
-	return 0;
-}
-
-/**
- * Create padding bits for the input data.
- * @param input input data.
- * @return padding bit stream.
- */
-static BitStream *QRinput_createPaddingBit(QRinput *input)
-{
-	int bits, maxbits, words, maxwords, i;
-	QRinput_List *list;
-	BitStream *bstream;
-
-	maxwords = QRspec_getDataLength(input->version, input->level);
-	maxbits = maxwords * 8;
-
-	list = input->head;
-	bits = 0;
-	while(list != NULL) {
-		bits += BitStream_size(list->bstream);
-		list = list->next;
-	}
-
-	words = (bits + 7) / 8;
-
-	if(maxbits - bits < 5) {
-		if(maxbits == bits) {
-			return NULL;
-		} else {
-			bstream = BitStream_new();
-			BitStream_appendNum(bstream, maxbits - bits, 0);
-			return bstream;
-		}
-	}
-
-	bits += 4;
-	words = (bits + 7) / 8;
-
-	bstream = BitStream_new();
-	BitStream_appendNum(bstream, words * 8 - bits + 4, 0);
-
-	for(i=0; i<maxwords - words; i++) {
-		BitStream_appendNum(bstream, 8, (i&1)?0x11:0xec);
-	}
-
-	return bstream;
-}
-
-/**
- * Merge all bit streams in the input data.
- * @param input input data.
- * @return merged bit stream
- */
-
-BitStream *QRinput_mergeBitStream(QRinput *input)
-{
-	BitStream *bstream;
-	QRinput_List *list;
-
-	if(QRinput_convertData(input) < 0) {
-		return NULL;
-	}
-
-	bstream = BitStream_new();
-	if(bstream == NULL) return NULL;
-
-	list = input->head;
-	while(list != NULL) {
-		BitStream_append(bstream, list->bstream);
-		list = list->next;
-	}
-
-	return bstream;
-}
-
-/**
- * Merge all bit streams in the input data and append padding bits
- * @param input input data.
- * @return padded merged bit stream
- */
-
-BitStream *QRinput_getBitStream(QRinput *input)
-{
-	BitStream *bstream;
-	BitStream *padding;
-
-	bstream = QRinput_mergeBitStream(input);
-	if(bstream == NULL) {
-		return NULL;
-	}
-	padding = QRinput_createPaddingBit(input);
-	if(padding != NULL) {
-		BitStream_append(bstream, padding);
-		BitStream_free(padding);
-	}
-
-	return bstream;
-}
-
-/**
- * Pack all bit streams padding bits into a byte array.
- * @param input input data.
- * @return padded merged byte stream
- */
-
-unsigned char *QRinput_getByteStream(QRinput *input)
-{
-	BitStream *bstream;
-	unsigned char *array;
-
-	bstream = QRinput_getBitStream(input);
-	if(bstream == NULL) {
-		return NULL;
-	}
-	array = BitStream_toByte(bstream);
-	BitStream_free(bstream);
-
-	return array;
-}
-
-/******************************************************************************
- * Structured input data
- *****************************************************************************/
-
-static QRinput_InputList *QRinput_InputList_newEntry(QRinput *input)
-{
-	QRinput_InputList *entry;
-
-	entry = (QRinput_InputList *)malloc(sizeof(QRinput_InputList));
-	if(entry == NULL) return NULL;
-
-	entry->input = input;
-	entry->next = NULL;
-
-	return entry;
-}
-
-static QRinput_InputList *QRinput_InputList_freeEntry(QRinput_InputList *entry)
-{
-	QRinput_InputList *next;
-
-	next = entry->next;
-	QRinput_free(entry->input);
-	free(entry);
-
-	return next;
-}
-
-QRinput_Struct *QRinput_Struct_new(void)
-{
-	QRinput_Struct *s;
-
-	s = (QRinput_Struct *)malloc(sizeof(QRinput_Struct));
-	if(s == NULL) return NULL;
-
-	s->size = 0;
-	s->parity = -1;
-	s->head = NULL;
-	s->tail = NULL;
-
-	return s;
-}
-
-void QRinput_Struct_setParity(QRinput_Struct *s, unsigned char parity)
-{
-	s->parity = (int)parity;
-}
-
-int QRinput_Struct_appendInput(QRinput_Struct *s, QRinput *input)
-{
-	QRinput_InputList *e;
-
-	e = QRinput_InputList_newEntry(input);
-	if(e == NULL) return -1;
-
-	s->size++;
-	if(s->tail == NULL) {
-		s->head = e;
-		s->tail = e;
-	} else {
-		s->tail->next = e;
-		s->tail = e;
-	}
-
-	return s->size;
-}
-
-void QRinput_Struct_free(QRinput_Struct *s)
-{
-	QRinput_InputList *list;
-	
-	list = s->head;
-	while(list != NULL) {
-		list = QRinput_InputList_freeEntry(list);
-	}
-
-	free(s);
-}
-
-static unsigned char QRinput_Struct_calcParity(QRinput_Struct *s)
-{
-	QRinput_InputList *list;
-	unsigned char parity = 0;
-
-	list = s->head;
-	while(list != NULL) {
-		parity ^= QRinput_calcParity(list->input);
-		list = list->next;
-	}
-
-	QRinput_Struct_setParity(s, parity);
-
-	return parity;
-}
-
-static int QRinput_List_shrinkEntry(QRinput_List *entry, int bytes)
-{
-	unsigned char *data;
-
-	data = (unsigned char *)malloc(bytes);
-	if(data == NULL) return -1;
-
-	memcpy(data, entry->data, bytes);
-	free(entry->data);
-	entry->data = data;
-	entry->size = bytes;
-
-	return 0;
-}
-
-int QRinput_splitEntry(QRinput_List *entry, int bytes)
-{
-	QRinput_List *e;
-	int ret;
-
-	e = QRinput_List_newEntry(entry->mode, entry->size - bytes, entry->data + bytes);
-	if(e == NULL) {
-		return -1;
-	}
-
-	ret = QRinput_List_shrinkEntry(entry, bytes);
-	if(ret < 0) {
-		QRinput_List_freeEntry(e);
-		return -1;
-	}
-
-	e->next = entry->next;
-	entry->next = e;
-
-	return 0;
-}
-
-QRinput_Struct *QRinput_splitQRinputToStruct(QRinput *input)
-{
-	QRinput *p;
-	QRinput_Struct *s;
-	int bits, maxbits, nextbits, bytes;
-	QRinput_List *list, *next, *prev;
-
-	s = QRinput_Struct_new();
-	if(s == NULL) return NULL;
-
-	input = QRinput_dup(input);
-	if(input == NULL) {
-		QRinput_Struct_free(s);
-		return NULL;
-	}
-
-	QRinput_Struct_setParity(s, QRinput_calcParity(input));
-	maxbits = QRspec_getDataLength(input->version, input->level) * 8 - STRUCTURE_HEADER_BITS;
-
-	if(maxbits <= 0) {
-		QRinput_Struct_free(s);
-		return NULL;
-	}
-
-	bits = 0;
-	list = input->head;
-	prev = NULL;
-	while(list != NULL) {
-		nextbits = QRinput_estimateBitStreamSizeOfEntry(list, input->version);
-		if(bits + nextbits <= maxbits) {
-			bits += QRinput_encodeBitStream(list, input->version);
-			prev = list;
-			list = list->next;
-		} else {
-			bytes = QRinput_lengthOfCode(list->mode, input->version, maxbits - bits);
-			if(bytes > 0) {
-				/* Splits this entry into 2 entries. */
-				QRinput_splitEntry(list, bytes);
-				/* First half is the tail of the current input. */
-				next = list->next;
-				list->next = NULL;
-				/* Second half is the head of the next input, p.*/
-				p = QRinput_new2(input->version, input->level);
-				p->head = next;
-				/* Renew QRinput.tail. */
-				p->tail = input->tail;
-				input->tail = list;
-				/* Point to the next entry. */
-				prev = list;
-				list = next;
-			} else {
-				/* Current entry will go to the next input. */
-				prev->next = NULL;
-				p = QRinput_new2(input->version, input->level);
-				p->head = list;
-				p->tail = input->tail;
-				input->tail = prev;
-			}
-			QRinput_Struct_appendInput(s, input);
-			input = p;
-			bits = 0;
-		}
-	}
-	QRinput_Struct_appendInput(s, input);
-	if(s->size > MAX_STRUCTURED_SYMBOLS) {
-		QRinput_Struct_free(s);
-		errno = ERANGE;
-		return NULL;
-	}
-	if(QRinput_Struct_insertStructuredAppendHeaders(s) < 0) {
-		QRinput_Struct_free(s);
-		return NULL;
-	}
-
-	return s;
-}
-
-int QRinput_Struct_insertStructuredAppendHeaders(QRinput_Struct *s)
-{
-	int num, i;
-	QRinput_InputList *list;
-
-	if(s->parity < 0) {
-		QRinput_Struct_calcParity(s);
-	}
-	num = 0;
-	list = s->head;
-	while(list != NULL) {
-		num++;
-		list = list->next;
-	}
-	i = 1;
-	list = s->head;
-	while(list != NULL) {
-		if(QRinput_insertStructuredAppendHeader(list->input, num, i, s->parity))
-			return -1;
-		i++;
-		list = list->next;
-	}
-
-	return 0;
-}
diff --git a/qrencode/src/qrinput.h b/qrencode/src/qrinput.h
deleted file mode 100644
index 3c0211a165a694c52f06b03d32e61576bd0ff236..0000000000000000000000000000000000000000
--- a/qrencode/src/qrinput.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Input data chunk class
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __QRINPUT_H__
-#define __QRINPUT_H__
-
-#include "qrencode.h"
-#include "bitstream.h"
-
-/******************************************************************************
- * Entry of input data
- *****************************************************************************/
-typedef struct _QRinput_List QRinput_List;
-
-struct _QRinput_List {
-	QRencodeMode mode;
-	int size;				///< Size of data chunk (byte).
-	unsigned char *data;	///< Data chunk.
-	BitStream *bstream;
-	QRinput_List *next;
-};
-
-/******************************************************************************
- * Input Data
- *****************************************************************************/
-struct _QRinput {
-	int version;
-	QRecLevel level;
-	QRinput_List *head;
-	QRinput_List *tail;
-};
-
-/******************************************************************************
- * Structured append input data
- *****************************************************************************/
-typedef struct _QRinput_InputList QRinput_InputList;
-
-struct _QRinput_InputList {
-	QRinput *input;
-	QRinput_InputList *next;
-};
-
-struct _QRinput_Struct {
-	int size;					///< number of structured symbols
-	int parity;
-	QRinput_InputList *head;
-	QRinput_InputList *tail;
-};
-
-/**
- * Insert a structured-append header to the head of the input data.
- * @param input input data.
- * @param size number of structured symbols.
- * @param index index number of the symbol. (1 <= index <= size)
- * @param parity parity among input data. (NOTE: each symbol of a set of structured symbols has the same parity data)
- * @retval 0 success.
- * @retval -1 error occurred and errno is set to indeicate the error. See Execptions for the details.
- * @throw EINVAL invalid parameter.
- * @throw ENOMEM unable to allocate memory.
- */
-extern int QRinput_insertStructuredAppendHeader(QRinput *input, int size, int index, unsigned char parity);
-
-/**
- * Pack all bit streams padding bits into a byte array.
- * @param input input data.
- * @return padded merged byte stream
- */
-extern unsigned char *QRinput_getByteStream(QRinput *input);
-
-
-extern int QRinput_estimateBitsModeNum(int size);
-extern int QRinput_estimateBitsModeAn(int size);
-extern int QRinput_estimateBitsMode8(int size);
-extern int QRinput_estimateBitsModeKanji(int size);
-
-extern int QRinput_estimateBitStreamSize(QRinput *input, int version);
-extern BitStream *QRinput_mergeBitStream(QRinput *input);
-extern BitStream *QRinput_getBitStream(QRinput *input);
-extern int QRinput_lengthOfCode(QRencodeMode mode, int version, int bits);
-extern QRinput *QRinput_dup(QRinput *input);
-extern int QRinput_splitEntry(QRinput_List *entry, int bytes);
-
-extern const signed char QRinput_anTable[];
-
-/**
- * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).
- * @param __c__ character
- * @return value
- */
-#define QRinput_lookAnTable(__c__) \
-	((__c__ & 0x80)?-1:QRinput_anTable[(int)__c__])
-
-/**
- * Length of a segment of structured-append header.
- */
-#define STRUCTURE_HEADER_BITS 20
-
-/**
- * Maximum number of symbols in a set of structured-appended symbols.
- */
-#define MAX_STRUCTURED_SYMBOLS 16
-
-#endif /* __QRINPUT_H__ */
diff --git a/qrencode/src/qrspec.c b/qrencode/src/qrspec.c
deleted file mode 100644
index b32b3b8cada5b05d8f0d4ded254908d6d00a53d3..0000000000000000000000000000000000000000
--- a/qrencode/src/qrspec.c
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * QR Code specification in convenient format. 
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * The following data / specifications are taken from
- * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
- *  or
- * "Automatic identification and data capture techniques -- 
- *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "qrspec.h"
-
-/******************************************************************************
- * Version and capacity
- *****************************************************************************/
-
-typedef struct {
-	int width; //< Edge length of the symbol
-	int words;  //< Data capacity (bytes)
-	int remainder; //< Remainder bit (bits)
-	int ec[4];  //< Number of ECC code (bytes)
-} QRspec_Capacity;
-
-/**
- * Table of the capacity of symbols
- * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
- */
-static const QRspec_Capacity qrspecCapacity[QRSPEC_VERSION_MAX + 1] = {
-	{  0,    0, 0, {   0,    0,    0,    0}},
-	{ 21,   26, 0, {   7,   10,   13,   17}}, // 1
-	{ 25,   44, 7, {  10,   16,   22,   28}},
-	{ 29,   70, 7, {  15,   26,   36,   44}},
-	{ 33,  100, 7, {  20,   36,   52,   64}},
-	{ 37,  134, 7, {  26,   48,   72,   88}}, // 5
-	{ 41,  172, 7, {  36,   64,   96,  112}},
-	{ 45,  196, 0, {  40,   72,  108,  130}},
-	{ 49,  242, 0, {  48,   88,  132,  156}},
-	{ 53,  292, 0, {  60,  110,  160,  192}},
-	{ 57,  346, 0, {  72,  130,  192,  224}}, //10
-	{ 61,  404, 0, {  80,  150,  224,  264}},
-	{ 65,  466, 0, {  96,  176,  260,  308}},
-	{ 69,  532, 0, { 104,  198,  288,  352}},
-	{ 73,  581, 3, { 120,  216,  320,  384}},
-	{ 77,  655, 3, { 132,  240,  360,  432}}, //15
-	{ 81,  733, 3, { 144,  280,  408,  480}},
-	{ 85,  815, 3, { 168,  308,  448,  532}},
-	{ 89,  901, 3, { 180,  338,  504,  588}},
-	{ 93,  991, 3, { 196,  364,  546,  650}},
-	{ 97, 1085, 3, { 224,  416,  600,  700}}, //20
-	{101, 1156, 4, { 224,  442,  644,  750}},
-	{105, 1258, 4, { 252,  476,  690,  816}},
-	{109, 1364, 4, { 270,  504,  750,  900}},
-	{113, 1474, 4, { 300,  560,  810,  960}},
-	{117, 1588, 4, { 312,  588,  870, 1050}}, //25
-	{121, 1706, 4, { 336,  644,  952, 1110}},
-	{125, 1828, 4, { 360,  700, 1020, 1200}},
-	{129, 1921, 3, { 390,  728, 1050, 1260}},
-	{133, 2051, 3, { 420,  784, 1140, 1350}},
-	{137, 2185, 3, { 450,  812, 1200, 1440}}, //30
-	{141, 2323, 3, { 480,  868, 1290, 1530}},
-	{145, 2465, 3, { 510,  924, 1350, 1620}},
-	{149, 2611, 3, { 540,  980, 1440, 1710}},
-	{153, 2761, 3, { 570, 1036, 1530, 1800}},
-	{157, 2876, 0, { 570, 1064, 1590, 1890}}, //35
-	{161, 3034, 0, { 600, 1120, 1680, 1980}},
-	{165, 3196, 0, { 630, 1204, 1770, 2100}},
-	{169, 3362, 0, { 660, 1260, 1860, 2220}},
-	{173, 3532, 0, { 720, 1316, 1950, 2310}},
-	{177, 3706, 0, { 750, 1372, 2040, 2430}} //40
-};
-
-int QRspec_getDataLength(int version, QRecLevel level)
-{
-	return qrspecCapacity[version].words - qrspecCapacity[version].ec[level];
-}
-
-int QRspec_getECCLength(int version, QRecLevel level)
-{
-	return qrspecCapacity[version].ec[level];
-}
-
-int QRspec_getMinimumVersion(int size, QRecLevel level)
-{
-	int i;
-	int words;
-
-	for(i=1; i<= QRSPEC_VERSION_MAX; i++) {
-		words  = qrspecCapacity[i].words - qrspecCapacity[i].ec[level];
-		if(words >= size) return i;
-	}
-
-	return -1;
-}
-
-int QRspec_getWidth(int version)
-{
-	return qrspecCapacity[version].width;
-}
-
-int QRspec_getRemainder(int version)
-{
-	return qrspecCapacity[version].remainder;
-}
-
-/******************************************************************************
- * Length indicator
- *****************************************************************************/
-
-static const int lengthTableBits[4][3] = {
-	{10, 12, 14},
-	{ 9, 11, 13},
-	{ 8, 16, 16},
-	{ 8, 10, 12}
-};
-
-int QRspec_lengthIndicator(QRencodeMode mode, int version)
-{
-	int l;
-
-	if(mode == QR_MODE_STRUCTURE) return 0;
-	if(version <= 9) {
-		l = 0;
-	} else if(version <= 26) {
-		l = 1;
-	} else {
-		l = 2;
-	}
-
-	return lengthTableBits[mode][l];
-}
-
-int QRspec_maximumWords(QRencodeMode mode, int version)
-{
-	int l;
-	int bits;
-	int words;
-
-	if(mode == QR_MODE_STRUCTURE) return 3;
-	if(version <= 9) {
-		l = 0;
-	} else if(version <= 26) {
-		l = 1;
-	} else {
-		l = 2;
-	}
-
-	bits = lengthTableBits[mode][l];
-	words = (1 << bits) - 1;
-	if(mode == QR_MODE_KANJI) {
-		words *= 2; // the number of bytes is required
-	}
-
-	return words;
-}
-
-/******************************************************************************
- * Error correction code
- *****************************************************************************/
-
-/**
- * Table of the error correction code (Reed-Solomon block)
- * See Table 12-16 (pp.30-36), JIS X0510:2004.
- */
-static const int eccTable[QRSPEC_VERSION_MAX+1][4][2] = {
-	{{ 0,  0}, { 0,  0}, { 0,  0}, { 0,  0}},
-	{{ 1,  0}, { 1,  0}, { 1,  0}, { 1,  0}}, // 1
-	{{ 1,  0}, { 1,  0}, { 1,  0}, { 1,  0}},
-	{{ 1,  0}, { 1,  0}, { 2,  0}, { 2,  0}},
-	{{ 1,  0}, { 2,  0}, { 2,  0}, { 4,  0}},
-	{{ 1,  0}, { 2,  0}, { 2,  2}, { 2,  2}}, // 5
-	{{ 2,  0}, { 4,  0}, { 4,  0}, { 4,  0}},
-	{{ 2,  0}, { 4,  0}, { 2,  4}, { 4,  1}},
-	{{ 2,  0}, { 2,  2}, { 4,  2}, { 4,  2}},
-	{{ 2,  0}, { 3,  2}, { 4,  4}, { 4,  4}},
-	{{ 2,  2}, { 4,  1}, { 6,  2}, { 6,  2}}, //10
-	{{ 4,  0}, { 1,  4}, { 4,  4}, { 3,  8}},
-	{{ 2,  2}, { 6,  2}, { 4,  6}, { 7,  4}},
-	{{ 4,  0}, { 8,  1}, { 8,  4}, {12,  4}},
-	{{ 3,  1}, { 4,  5}, {11,  5}, {11,  5}},
-	{{ 5,  1}, { 5,  5}, { 5,  7}, {11,  7}}, //15
-	{{ 5,  1}, { 7,  3}, {15,  2}, { 3, 13}},
-	{{ 1,  5}, {10,  1}, { 1, 15}, { 2, 17}},
-	{{ 5,  1}, { 9,  4}, {17,  1}, { 2, 19}},
-	{{ 3,  4}, { 3, 11}, {17,  4}, { 9, 16}},
-	{{ 3,  5}, { 3, 13}, {15,  5}, {15, 10}}, //20
-	{{ 4,  4}, {17,  0}, {17,  6}, {19,  6}},
-	{{ 2,  7}, {17,  0}, { 7, 16}, {34,  0}},
-	{{ 4,  5}, { 4, 14}, {11, 14}, {16, 14}},
-	{{ 6,  4}, { 6, 14}, {11, 16}, {30,  2}},
-	{{ 8,  4}, { 8, 13}, { 7, 22}, {22, 13}}, //25
-	{{10,  2}, {19,  4}, {28,  6}, {33,  4}},
-	{{ 8,  4}, {22,  3}, { 8, 26}, {12, 28}},
-	{{ 3, 10}, { 3, 23}, { 4, 31}, {11, 31}},
-	{{ 7,  7}, {21,  7}, { 1, 37}, {19, 26}},
-	{{ 5, 10}, {19, 10}, {15, 25}, {23, 25}}, //30
-	{{13,  3}, { 2, 29}, {42,  1}, {23, 28}},
-	{{17,  0}, {10, 23}, {10, 35}, {19, 35}},
-	{{17,  1}, {14, 21}, {29, 19}, {11, 46}},
-	{{13,  6}, {14, 23}, {44,  7}, {59,  1}},
-	{{12,  7}, {12, 26}, {39, 14}, {22, 41}}, //35
-	{{ 6, 14}, { 6, 34}, {46, 10}, { 2, 64}},
-	{{17,  4}, {29, 14}, {49, 10}, {24, 46}},
-	{{ 4, 18}, {13, 32}, {48, 14}, {42, 32}},
-	{{20,  4}, {40,  7}, {43, 22}, {10, 67}},
-	{{19,  6}, {18, 31}, {34, 34}, {20, 61}},//40
-};
-
-int *QRspec_getEccSpec(int version, QRecLevel level)
-{
-	int b1, b2;
-	int data, ecc;
-	int *array;
-
-	b1 = eccTable[version][level][0];
-	b2 = eccTable[version][level][1];
-	data = QRspec_getDataLength(version, level);
-	ecc  = QRspec_getECCLength(version, level);
-
-	array = (int *)malloc(sizeof(int) * 6);
-	if(array == NULL) return NULL;
-
-	if(b2 == 0) {
-		array[0] = b1;
-		array[1] = data / b1;
-		array[2] = ecc / b1;
-		array[3] = array[4] = array[5] = 0;
-	} else {
-		array[0] = b1;
-		array[1] = data / (b1 + b2);
-		array[2] = ecc  / (b1 + b2);
-		array[3] = b2;
-		array[4] = array[1] + 1;
-		array[5] = (ecc - (array[2] * b1)) / b2;
-	}
-
-	return array;
-}
-
-/******************************************************************************
- * Alignment pattern
- *****************************************************************************/
-
-/**
- * Positions of alignment patterns.
- * This array includes only the second and the third position of the alignment
- * patterns. Rest of them can be calculated from the distance between them.
- *
- * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
- */
-static const int alignmentPattern[QRSPEC_VERSION_MAX+1][2] = {
-	{ 0,  0},
-	{ 0,  0}, {18,  0}, {22,  0}, {26,  0}, {30,  0}, // 1- 5
-	{34,  0}, {22, 38}, {24, 42}, {26, 46}, {28, 50}, // 6-10
-	{30, 54}, {32, 58}, {34, 62}, {26, 46}, {26, 48}, //11-15
-	{26, 50}, {30, 54}, {30, 56}, {30, 58}, {34, 62}, //16-20
-	{28, 50}, {26, 50}, {30, 54}, {28, 54}, {32, 58}, //21-25
-	{30, 58}, {34, 62}, {26, 50}, {30, 54}, {26, 52}, //26-30
-	{30, 56}, {34, 60}, {30, 58}, {34, 62}, {30, 54}, //31-35
-	{24, 50}, {28, 54}, {32, 58}, {26, 54}, {30, 58}, //35-40
-};
-
-QRspec_Alignment *QRspec_getAlignmentPattern(int version)
-{
-	int width;
-	int d, w, x, y, cx, cy;
-	QRspec_Alignment *al;
-	int *p;
-
-	if(version < 2) return NULL;
-
-	al = (QRspec_Alignment *)malloc(sizeof(QRspec_Alignment));
-
-	width = qrspecCapacity[version].width;
-	d = alignmentPattern[version][1] - alignmentPattern[version][0];
-	if(d < 0) {
-		w = 2;
-	} else {
-		w = (width - alignmentPattern[version][0]) / d + 2;
-	}
-
-	al->n = w * w - 3;
-	al->pos = (int *)malloc(sizeof(int) * al->n * 2);
-
-	if(al->n == 1) {
-		al->pos[0] = alignmentPattern[version][0];
-		al->pos[1] = alignmentPattern[version][0];
-
-		return al;
-	}
-#if 0
-	/* Just for debug purpose */
-	printf("%d ", version);
-	cx = alignmentPattern[version][0];
-	for(x=0; x<w-1; x++) {
-		printf(" %3d", cx);
-		cx += d;
-	}
-	printf("\n");
-#endif
-
-	p = al->pos;
-
-	cx = alignmentPattern[version][0];
-	for(x=1; x<w - 1; x++) {
-		p[0] = 6;
-		p[1] = cx;
-		p[2] = cx;
-		p[3] = 6;
-		cx += d;
-		p += 4;
-	}
-
-	cy = alignmentPattern[version][0];
-	for(y=0; y<w-1; y++) {
-		cx = alignmentPattern[version][0];
-		for(x=0; x<w-1; x++) {
-			p[0] = cx;
-			p[1] = cy;
-			cx += d;
-			p += 2;
-		}
-		cy += d;
-	}
-
-	return al;
-}
-
-void QRspec_freeAlignment(QRspec_Alignment *al)
-{
-	if(al != NULL) {
-		if(al->pos != NULL) {
-			free(al->pos);
-		}
-		free(al);
-	}
-}
-
-/******************************************************************************
- * Version information pattern
- *****************************************************************************/
-
-/**
- * Version information pattern (BCH coded).
- * See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
- */
-static const unsigned int versionPattern[QRSPEC_VERSION_MAX - 6] = {
-	0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
-	0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
-	0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
-	0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
-	0x27541, 0x28c69
-};
-
-unsigned int QRspec_getVersionPattern(int version)
-{
-	if(version < 7 || version > QRSPEC_VERSION_MAX) return 0;
-
-	return versionPattern[version -7];
-}
-
-/******************************************************************************
- * Format information
- *****************************************************************************/
-
-/* See calcFormatInfo in tests/test_qrspec.c */
-static const unsigned int formatInfo[4][8] = {
-	{0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976},
-	{0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0},
-	{0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed},
-	{0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b}
-};
-
-unsigned int QRspec_getFormatInfo(int mask, QRecLevel level)
-{
-	if(mask < 0 || mask > 7) return 0;
-
-	return formatInfo[level][mask];
-}
-
-/******************************************************************************
- * Frame
- *****************************************************************************/
-
-/**
- * Cache of initial frames.
- */
-/* C99 says that static storage shall be initialized to a null pointer
- * by compiler. */
-static unsigned char *frames[QRSPEC_VERSION_MAX + 1];
-
-/**
- * Put a finder pattern.
- * @param frame
- * @param width
- * @param ox,oy upper-left coordinate of the pattern
- */
-static void putFinderPattern(unsigned char *frame, int width, int ox, int oy)
-{
-	static const unsigned char finder[] = {
-		0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1,
-		0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1,
-		0xc1, 0xc0, 0xc1, 0xc1, 0xc1, 0xc0, 0xc1,
-		0xc1, 0xc0, 0xc1, 0xc1, 0xc1, 0xc0, 0xc1,
-		0xc1, 0xc0, 0xc1, 0xc1, 0xc1, 0xc0, 0xc1,
-		0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1,
-		0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1,
-	};
-	int x, y;
-	const unsigned char *s;
-
-	frame += oy * width + ox;
-	s = finder;
-	for(y=0; y<7; y++) {
-		for(x=0; x<7; x++) {
-			frame[x] = s[x];
-		}
-		frame += width;
-		s += 7;
-	}
-}
-
-/**
- * Put an alignment pattern.
- * @param frame
- * @param width
- * @param ox,oy center coordinate of the pattern
- */
-static void putAlignmentPattern(unsigned char *frame, int width, int ox, int oy)
-{
-	static const unsigned char finder[] = {
-		0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
-		0xa1, 0xa0, 0xa0, 0xa0, 0xa1,
-		0xa1, 0xa0, 0xa1, 0xa0, 0xa1,
-		0xa1, 0xa0, 0xa0, 0xa0, 0xa1,
-		0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
-	};
-	int x, y;
-	const unsigned char *s;
-
-	frame += (oy - 2) * width + ox - 2;
-	s = finder;
-	for(y=0; y<5; y++) {
-		for(x=0; x<5; x++) {
-			frame[x] = s[x];
-		}
-		frame += width;
-		s += 5;
-	}
-}
-
-static unsigned char *QRspec_createFrame(int version)
-{
-	unsigned char *frame, *p, *q;
-	int width;
-	int x, y;
-	unsigned int verinfo, v;
-	QRspec_Alignment *alignment;
-
-	width = qrspecCapacity[version].width;
-	frame = (unsigned char *)malloc(width * width);
-	memset(frame, 0, width * width);
-	/* Finder pattern */
-	putFinderPattern(frame, width, 0, 0);
-	putFinderPattern(frame, width, width - 7, 0);
-	putFinderPattern(frame, width, 0, width - 7);
-	/* Separator */
-	p = frame;
-	q = frame + width * (width - 7);
-	for(y=0; y<7; y++) {
-		p[7] = 0xc0;
-		p[width - 8] = 0xc0;
-		q[7] = 0xc0;
-		p += width;
-		q += width;
-	}
-	memset(frame + width * 7, 0xc0, 8);
-	memset(frame + width * 8 - 8, 0xc0, 8);
-	memset(frame + width * (width - 8), 0xc0, 8);
-	/* Mask format information area */
-	memset(frame + width * 8, 0x84, 9);
-	memset(frame + width * 9 - 8, 0x84, 8);
-	p = frame + 8;
-	for(y=0; y<8; y++) {
-		*p = 0x84;
-		p += width;
-	}
-	p = frame + width * (width - 7) + 8;
-	for(y=0; y<7; y++) {
-		*p = 0x84;
-		p += width;
-	}
-	/* Timing pattern */
-	p = frame + width * 6 + 8;
-	q = frame + width * 8 + 6;
-	for(x=1; x<width-15; x++) {
-		*p =  0x90 | (x & 1);
-		*q =  0x90 | (x & 1);
-		p++;
-		q += width;
-	}
-	/* Alignment pattern */
-	alignment = QRspec_getAlignmentPattern(version);
-	if(alignment != NULL) {
-		for(x=0; x<alignment->n; x++) {
-			putAlignmentPattern(frame, width,
-					alignment->pos[x*2], alignment->pos[x*2+1]);
-		}
-		QRspec_freeAlignment(alignment);
-	}
-	/* Version information */
-	if(version >= 7) {
-		verinfo = QRspec_getVersionPattern(version);
-
-		p = frame + width * (width - 11);
-		v = verinfo;
-		for(x=0; x<6; x++) {
-			for(y=0; y<3; y++) {
-				p[width * y + x] = 0x88 | (v & 1);
-				v = v >> 1;
-			}
-		}
-
-		p = frame + width - 11;
-		v = verinfo;
-		for(y=0; y<6; y++) {
-			for(x=0; x<3; x++) {
-				p[x] = 0x88 | (v & 1);
-				v = v >> 1;
-			}
-			p += width;
-		}
-	}
-	/* and a little bit... */
-	frame[width * (width - 8) + 8] = 0x81;
-
-	return frame;
-}
-
-unsigned char *QRspec_newFrame(int version)
-{
-	unsigned char *frame;
-	int width;
-
-	if(version < 1 || version > QRSPEC_VERSION_MAX) return NULL;
-
-	if(frames[version] == NULL) {
-		frames[version] = QRspec_createFrame(version);
-	}
-	width = qrspecCapacity[version].width;
-	frame = (unsigned char *)malloc(width * width);
-	memcpy(frame, frames[version], width * width);
-
-	return frame;
-}
-
-void QRspec_clearCache(void)
-{
-	int i;
-
-	for(i=1; i<=QRSPEC_VERSION_MAX; i++) {
-		if(frames[i] != NULL) {
-			free(frames[i]);
-		}
-	}
-}
diff --git a/qrencode/src/qrspec.h b/qrencode/src/qrspec.h
deleted file mode 100644
index b63b367bc4875a992eeb1328d47506ee04f456ca..0000000000000000000000000000000000000000
--- a/qrencode/src/qrspec.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * QR Code specification in convenient format. 
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __QRSPEC_H__
-#define __QRSPEC_H__
-
-#include "qrencode.h"
-
-/******************************************************************************
- * Version and capacity
- *****************************************************************************/
-
-/**
- * Maximum version (size) of QR-code symbol.
- */
-#define QRSPEC_VERSION_MAX 40
-
-/**
- * Maximum width of a symbol
- */
-#define QRSPEC_WIDTH_MAX 177
-
-/**
- * Return maximum data code length (bytes) for the version.
- * @param version
- * @param level
- * @return maximum size (bytes)
- */
-extern int QRspec_getDataLength(int version, QRecLevel level);
-
-/**
- * Return maximum error correction code length (bytes) for the version.
- * @param version
- * @param level
- * @return ECC size (bytes)
- */
-extern int QRspec_getECCLength(int version, QRecLevel level);
-
-/**
- * Return a version number that satisfies the input code length.
- * @param size input code length (byte)
- * @param level
- * @return version number
- */
-extern int QRspec_getMinimumVersion(int size, QRecLevel level);
-
-/**
- * Return the width of the symbol for the version.
- * @param version
- * @return width
- */
-extern int QRspec_getWidth(int version);
-
-/**
- * Return the numer of remainder bits.
- * @param version
- * @return number of remainder bits
- */
-extern int QRspec_getRemainder(int version);
-
-/******************************************************************************
- * Length indicator
- *****************************************************************************/
-
-/**
- * Return the size of lenght indicator for the mode and version.
- * @param mode
- * @param version
- * @return the size of the appropriate length indicator (bits).
- */
-extern int QRspec_lengthIndicator(QRencodeMode mode, int version);
-
-/**
- * Return the maximum length for the mode and version.
- * @param mode
- * @param version
- * @return the maximum length (bytes)
- */
-extern int QRspec_maximumWords(QRencodeMode mode, int version);
-
-/******************************************************************************
- * Error correction code
- *****************************************************************************/
-
-/**
- * Return an array of ECC specification.
- * @param version
- * @param level
- * @return an array of ECC specification contains as following:
- * {# of type1 blocks, # of data code, # of ecc code,
- *  # of type2 blocks, # of data code, # of ecc code}
- * It can be freed by calling free().
- */
-int *QRspec_getEccSpec(int version, QRecLevel level);
-
-#define QRspec_rsBlockNum(__spec__) (__spec__[0] + __spec__[3])
-#define QRspec_rsBlockNum1(__spec__) (__spec__[0])
-#define QRspec_rsDataCodes1(__spec__) (__spec__[1])
-#define QRspec_rsEccCodes1(__spec__) (__spec__[2])
-#define QRspec_rsBlockNum2(__spec__) (__spec__[3])
-#define QRspec_rsDataCodes2(__spec__) (__spec__[4])
-#define QRspec_rsEccCodes2(__spec__) (__spec__[5])
-
-/******************************************************************************
- * Alignment pattern
- *****************************************************************************/
-
-/**
- * Array of positions of alignment patterns.
- * X and Y coordinates are interleaved into 'pos'.
- */
-typedef struct {
-	int n;		//< Number of patterns
-	int *pos;
-} QRspec_Alignment;
-
-/**
- * Return positions of alignment patterns.
- * @param version
- * @return a QRspec_Alignment object that contains all of positions of alignment
- * patterns.
- */
-extern QRspec_Alignment *QRspec_getAlignmentPattern(int version);
-
-/**
- * Free QRspec_Alignment instance.
- * @param al QRspec_Alignment instance.
- */
-extern void QRspec_freeAlignment(QRspec_Alignment *al);
-
-/******************************************************************************
- * Version information pattern
- *****************************************************************************/
-
-/**
- * Return BCH encoded version information pattern that is used for the symbol
- * of version 7 or greater. Use lower 18 bits.
- * @param version
- * @return BCH encoded version information pattern
- */
-extern unsigned int QRspec_getVersionPattern(int version);
-
-/******************************************************************************
- * Format information
- *****************************************************************************/
-
-/**
- * Return BCH encoded format information pattern.
- * @param mask
- * @param level
- * @return BCH encoded format information pattern
- */
-extern unsigned int QRspec_getFormatInfo(int mask, QRecLevel level);
-
-/******************************************************************************
- * Frame
- *****************************************************************************/
-
-/**
- * Return a copy of initialized frame.
- * When the same version is requested twice or more, a copy of cached frame
- * is returned.
- * WARNING: Thread unsafe!!!
- * @param version
- * @return Array of unsigned char. You can free it by free().
- */
-extern unsigned char *QRspec_newFrame(int version);
-
-/**
- * Clear the frame cache. Typically for debug.
- * WARNING: Thread unsafe!!!
- */
-extern void QRspec_clearCache(void);
-
-#endif /* __QRSPEC_H__ */
diff --git a/qrencode/src/rscode.c b/qrencode/src/rscode.c
deleted file mode 100644
index d0cdd6624ec92174007750957c45ef33b963ca68..0000000000000000000000000000000000000000
--- a/qrencode/src/rscode.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Reed solomon encoder. This code is taken from Phil Karn's libfec then
- * editted and packed into a pair of .c and .h files.
- *
- * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
- * (libfec is released under the GNU Lesser General Public License.)
- *
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include "rscode.h"
-
-/* Stuff specific to the 8-bit symbol version of the general purpose RS codecs
- *
- */
-typedef unsigned char data_t;
-
-
-/**
- * Reed-Solomon codec control block
- */
-struct _RS {
-	int mm;              /* Bits per symbol */
-	int nn;              /* Symbols per block (= (1<<mm)-1) */
-	data_t *alpha_to;     /* log lookup table */
-	data_t *index_of;     /* Antilog lookup table */
-	data_t *genpoly;      /* Generator polynomial */
-	int nroots;     /* Number of generator roots = number of parity symbols */
-	int fcr;        /* First consecutive root, index form */
-	int prim;       /* Primitive element, index form */
-	int iprim;      /* prim-th root of 1, index form */
-	int pad;        /* Padding bytes in shortened block */
-	int gfpoly;
-	struct _RS *next;
-};
-
-RS *rslist = NULL;
-
-static inline int modnn(RS *rs, int x){
-	while (x >= rs->nn) {
-		x -= rs->nn;
-		x = (x >> rs->mm) + (x & rs->nn);
-	}
-	return x;
-}
-
-
-#define MODNN(x) modnn(rs,x)
-
-#define MM (rs->mm)
-#define NN (rs->nn)
-#define ALPHA_TO (rs->alpha_to) 
-#define INDEX_OF (rs->index_of)
-#define GENPOLY (rs->genpoly)
-#define NROOTS (rs->nroots)
-#define FCR (rs->fcr)
-#define PRIM (rs->prim)
-#define IPRIM (rs->iprim)
-#define PAD (rs->pad)
-#define A0 (NN)
-
-
-/* Initialize a Reed-Solomon codec
- * symsize = symbol size, bits
- * gfpoly = Field generator polynomial coefficients
- * fcr = first root of RS code generator polynomial, index form
- * prim = primitive element to generate polynomial roots
- * nroots = RS code generator polynomial degree (number of roots)
- * pad = padding bytes at front of shortened block
- */
-static RS *init_rs_char(int symsize, int gfpoly, int fcr, int prim, int nroots, int pad)
-{
-  RS *rs;
-
-
-/* Common code for intializing a Reed-Solomon control block (char or int symbols)
- * Copyright 2004 Phil Karn, KA9Q
- * May be used under the terms of the GNU Lesser General Public License (LGPL)
- */
-//#undef NULL
-//#define NULL ((void *)0)
-
-  int i, j, sr,root,iprim;
-
-  rs = NULL;
-  /* Check parameter ranges */
-  if(symsize < 0 || symsize > (int)(8*sizeof(data_t))){
-    goto done;
-  }
-
-  if(fcr < 0 || fcr >= (1<<symsize))
-    goto done;
-  if(prim <= 0 || prim >= (1<<symsize))
-    goto done;
-  if(nroots < 0 || nroots >= (1<<symsize))
-    goto done; /* Can't have more roots than symbol values! */
-  if(pad < 0 || pad >= ((1<<symsize) -1 - nroots))
-    goto done; /* Too much padding */
-
-  rs = (RS *)calloc(1,sizeof(RS));
-  if(rs == NULL)
-    goto done;
-
-  rs->mm = symsize;
-  rs->nn = (1<<symsize)-1;
-  rs->pad = pad;
-
-  rs->alpha_to = (data_t *)malloc(sizeof(data_t)*(rs->nn+1));
-  if(rs->alpha_to == NULL){
-    free(rs);
-    rs = NULL;
-    goto done;
-  }
-  rs->index_of = (data_t *)malloc(sizeof(data_t)*(rs->nn+1));
-  if(rs->index_of == NULL){
-    free(rs->alpha_to);
-    free(rs);
-    rs = NULL;
-    goto done;
-  }
-
-  /* Generate Galois field lookup tables */
-  rs->index_of[0] = A0; /* log(zero) = -inf */
-  rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */
-  sr = 1;
-  for(i=0;i<rs->nn;i++){
-    rs->index_of[sr] = i;
-    rs->alpha_to[i] = sr;
-    sr <<= 1;
-    if(sr & (1<<symsize))
-      sr ^= gfpoly;
-    sr &= rs->nn;
-  }
-  if(sr != 1){
-    /* field generator polynomial is not primitive! */
-    free(rs->alpha_to);
-    free(rs->index_of);
-    free(rs);
-    rs = NULL;
-    goto done;
-  }
-
-  /* Form RS code generator polynomial from its roots */
-  rs->genpoly = (data_t *)malloc(sizeof(data_t)*(nroots+1));
-  if(rs->genpoly == NULL){
-    free(rs->alpha_to);
-    free(rs->index_of);
-    free(rs);
-    rs = NULL;
-    goto done;
-  }
-  rs->fcr = fcr;
-  rs->prim = prim;
-  rs->nroots = nroots;
-  rs->gfpoly = gfpoly;
-
-  /* Find prim-th root of 1, used in decoding */
-  for(iprim=1;(iprim % prim) != 0;iprim += rs->nn)
-    ;
-  rs->iprim = iprim / prim;
-
-  rs->genpoly[0] = 1;
-  for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) {
-    rs->genpoly[i+1] = 1;
-
-    /* Multiply rs->genpoly[] by  @**(root + x) */
-    for (j = i; j > 0; j--){
-      if (rs->genpoly[j] != 0)
-	rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)];
-      else
-	rs->genpoly[j] = rs->genpoly[j-1];
-    }
-    /* rs->genpoly[0] can never be zero */
-    rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)];
-  }
-  /* convert rs->genpoly[] to index form for quicker encoding */
-  for (i = 0; i <= nroots; i++)
-    rs->genpoly[i] = rs->index_of[rs->genpoly[i]];
- done:;
-
-  return rs;
-}
-
-RS *init_rs(int symsize, int gfpoly, int fcr, int prim, int nroots, int pad)
-{
-	RS *rs;
-
-	for(rs = rslist; rs != NULL; rs = rs->next) {
-		if(rs->nroots != nroots) continue;
-		if(rs->pad != pad) continue;
-		if(rs->mm != symsize) continue;
-		if(rs->gfpoly != gfpoly) continue;
-		if(rs->fcr != fcr) continue;
-		if(rs->prim != prim) continue;
-
-		return rs;
-	}
-
-	rs = init_rs_char(symsize, gfpoly, fcr, prim, nroots, pad);
-	rs->next = rslist;
-	rslist = rs;
-
-	return rs;
-}
-
-
-void free_rs_char(RS *rs)
-{
-	free(rs->alpha_to);
-	free(rs->index_of);
-	free(rs->genpoly);
-	free(rs);
-}
-
-/* The guts of the Reed-Solomon encoder, meant to be #included
- * into a function body with the following typedefs, macros and variables supplied
- * according to the code parameters:
-
- * data_t - a typedef for the data symbol
- * data_t data[] - array of NN-NROOTS-PAD and type data_t to be encoded
- * data_t parity[] - an array of NROOTS and type data_t to be written with parity symbols
- * NROOTS - the number of roots in the RS code generator polynomial,
- *          which is the same as the number of parity symbols in a block.
-            Integer variable or literal.
-	    * 
- * NN - the total number of symbols in a RS block. Integer variable or literal.
- * PAD - the number of pad symbols in a block. Integer variable or literal.
- * ALPHA_TO - The address of an array of NN elements to convert Galois field
- *            elements in index (log) form to polynomial form. Read only.
- * INDEX_OF - The address of an array of NN elements to convert Galois field
- *            elements in polynomial form to index (log) form. Read only.
- * MODNN - a function to reduce its argument modulo NN. May be inline or a macro.
- * GENPOLY - an array of NROOTS+1 elements containing the generator polynomial in index form
-
- * The memset() and memmove() functions are used. The appropriate header
- * file declaring these functions (usually <string.h>) must be included by the calling
- * program.
-
- * Copyright 2004, Phil Karn, KA9Q
- * May be used under the terms of the GNU Lesser General Public License (LGPL)
- */
-
-#undef A0
-#define A0 (NN) /* Special reserved value encoding zero in index form */
-
-void encode_rs_char(RS *rs, const data_t *data, data_t *parity)
-{
-  int i, j;
-  data_t feedback;
-
-  memset(parity,0,NROOTS*sizeof(data_t));
-
-  for(i=0;i<NN-NROOTS-PAD;i++){
-    feedback = INDEX_OF[data[i] ^ parity[0]];
-    if(feedback != A0){      /* feedback term is non-zero */
-#ifdef UNNORMALIZED
-      /* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
-       * always be for the polynomials constructed by init_rs()
-       */
-      feedback = MODNN(NN - GENPOLY[NROOTS] + feedback);
-#endif
-      for(j=1;j<NROOTS;j++)
-	parity[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
-    }
-    /* Shift */
-    memmove(&parity[0],&parity[1],sizeof(data_t)*(NROOTS-1));
-    if(feedback != A0)
-      parity[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
-    else
-      parity[NROOTS-1] = 0;
-  }
-}
diff --git a/qrencode/src/rscode.h b/qrencode/src/rscode.h
deleted file mode 100644
index b4557829daf7e46964b52dafa5f2cc592acac2c7..0000000000000000000000000000000000000000
--- a/qrencode/src/rscode.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Reed solomon encoder. This code is taken from Phil Karn's libfec then
- * editted and packed into a pair of .c and .h files.
- *
- * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
- * (libfec is released under the GNU Lesser General Public License.)
- *
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __RSCODE_H__
-#define __RSCODE_H__
-
-/*
- * General purpose RS codec, 8-bit symbols.
- */
-
-typedef struct _RS RS;
-
-/* WARNING: Thread unsafe!!! */
-extern RS *init_rs(int symsize, int gfpoly, int fcr, int prim, int nroots, int pad);
-extern void encode_rs_char(RS *rs, const unsigned char *data, unsigned char *parity);
-extern void free_rs_char(RS *rs);
-
-#endif /* __RSCODE_H__ */
diff --git a/qrencode/src/split.c b/qrencode/src/split.c
deleted file mode 100644
index 12b3cd9d6c724aeee90df0e786d2f0f15193a14f..0000000000000000000000000000000000000000
--- a/qrencode/src/split.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Input data splitter.
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * The following data / specifications are taken from
- * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
- *  or
- * "Automatic identification and data capture techniques -- 
- *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include "qrencode.h"
-#include "qrinput.h"
-#include "qrspec.h"
-#include "split.h"
-
-#define isdigit(__c__) ((unsigned char)((signed char)(__c__) - '0') < 10)
-#define isalnum(__c__) (QRinput_lookAnTable(__c__) >= 0)
-
-static QRencodeMode Split_identifyMode(const char *string, QRencodeMode hint)
-{
-	unsigned char c, d;
-	unsigned int word;
-
-	c = string[0];
-
-	if(c == '\0') return QR_MODE_NUL;
-	if(isdigit(c)) {
-		return QR_MODE_NUM;
-	} else if(isalnum(c)) {
-		return QR_MODE_AN;
-	} else if(hint == QR_MODE_KANJI) {
-		d = string[1];
-		if(d != '\0') {
-			word = ((unsigned int)c << 8) | d;
-			if((word >= 0x8140 && word <= 0x9ffc) || (word >= 0xe040 && word <= 0xebbf)) {
-				return QR_MODE_KANJI;
-			}
-		}
-	}
-
-	return QR_MODE_8;
-}
-
-static int Split_eatNum(const char *string, QRinput *input, QRencodeMode hint);
-static int Split_eatAn(const char *string, QRinput *input, QRencodeMode hint);
-static int Split_eat8(const char *string, QRinput *input, QRencodeMode hint);
-static int Split_eatKanji(const char *string, QRinput *input, QRencodeMode hint);
-
-static int Split_eatNum(const char *string, QRinput *input,QRencodeMode hint)
-{
-	const char *p;
-	int ret;
-	int run;
-	int dif;
-	int ln;
-	QRencodeMode mode;
-
-	ln = QRspec_lengthIndicator(QR_MODE_NUM, input->version);
-
-	p = string;
-	while(isdigit(*p)) {
-		p++;
-	}
-	run = p - string;
-	mode = Split_identifyMode(p, hint);
-	if(mode == QR_MODE_8) {
-		dif = QRinput_estimateBitsModeNum(run) + 4 + ln
-			+ QRinput_estimateBitsMode8(1) /* + 4 + l8 */
-			- QRinput_estimateBitsMode8(run + 1) /* - 4 - l8 */;
-		if(dif > 0) {
-			return Split_eat8(string, input, hint);
-		}
-	}
-	if(mode == QR_MODE_AN) {
-		dif = QRinput_estimateBitsModeNum(run) + 4 + ln
-			+ QRinput_estimateBitsModeAn(1) /* + 4 + la */
-			- QRinput_estimateBitsModeAn(run + 1) /* - 4 - la */;
-		if(dif > 0) {
-			return Split_eatAn(string, input, hint);
-		}
-	}
-
-	ret = QRinput_append(input, QR_MODE_NUM, run, (unsigned char *)string);
-	if(ret < 0) return -1;
-
-	return run;
-}
-
-static int Split_eatAn(const char *string, QRinput *input, QRencodeMode hint)
-{
-	const char *p, *q;
-	int ret;
-	int run;
-	int dif;
-	int la, ln;
-
-	la = QRspec_lengthIndicator(QR_MODE_AN, input->version);
-	ln = QRspec_lengthIndicator(QR_MODE_NUM, input->version);
-
-	p = string;
-	while(isalnum(*p)) {
-		if(isdigit(*p)) {
-			q = p;
-			while(isdigit(*q)) {
-				q++;
-			}
-			dif = QRinput_estimateBitsModeAn(p - string) /* + 4 + la */
-				+ QRinput_estimateBitsModeNum(q - p) + 4 + ln
-				- QRinput_estimateBitsModeAn(q - string) /* - 4 - la */;
-			if(dif < 0) {
-				break;
-			} else {
-				p = q;
-			}
-		} else {
-			p++;
-		}
-	}
-
-	run = p - string;
-
-	if(*p && !isalnum(*p)) {
-		dif = QRinput_estimateBitsModeAn(run) + 4 + la
-			+ QRinput_estimateBitsMode8(1) /* + 4 + l8 */
-			- QRinput_estimateBitsMode8(run + 1) /* - 4 - l8 */;
-		if(dif > 0) {
-			return Split_eat8(string, input, hint);
-		}
-	}
-
-	ret = QRinput_append(input, QR_MODE_AN, run, (unsigned char *)string);
-	if(ret < 0) return -1;
-
-	return run;
-}
-
-static int Split_eatKanji(const char *string, QRinput *input, QRencodeMode hint)
-{
-	const char *p;
-	int ret;
-	int run;
-
-	p = string;
-	while(Split_identifyMode(p, hint) == QR_MODE_KANJI) {
-		p += 2;
-	}
-	run = p - string;
-	ret = QRinput_append(input, QR_MODE_KANJI, run, (unsigned char *)string);
-	if(ret < 0) return -1;
-
-	return run;
-}
-
-static int Split_eat8(const char *string, QRinput *input, QRencodeMode hint)
-{
-	const char *p, *q;
-	QRencodeMode mode;
-	int ret;
-	int run;
-	int dif;
-	int la, ln;
-
-	la = QRspec_lengthIndicator(QR_MODE_AN, input->version);
-	ln = QRspec_lengthIndicator(QR_MODE_NUM, input->version);
-
-	p = string + 1;
-	while(*p != '\0') {
-		mode = Split_identifyMode(p, hint);
-		if(mode == QR_MODE_KANJI) {
-			break;
-		}
-		if(mode == QR_MODE_NUM) {
-			q = p;
-			while(isdigit(*q)) {
-				q++;
-			}
-			dif = QRinput_estimateBitsMode8(p - string) /* + 4 + l8 */
-				+ QRinput_estimateBitsModeNum(q - p) + 4 + ln
-				- QRinput_estimateBitsMode8(q - string) /* - 4 - l8 */;
-			if(dif < 0) {
-				break;
-			} else {
-				p = q;
-			}
-		} else if(mode == QR_MODE_AN) {
-			q = p;
-			while(isalnum(*q)) {
-				q++;
-			}
-			dif = QRinput_estimateBitsMode8(p - string) /* + 4 + l8 */
-				+ QRinput_estimateBitsModeAn(q - p) + 4 + la
-				- QRinput_estimateBitsMode8(q - string) /* - 4 - l8 */;
-			if(dif < 0) {
-				break;
-			} else {
-				p = q;
-			}
-		} else {
-			p++;
-		}
-	}
-
-	run = p - string;
-	ret = QRinput_append(input, QR_MODE_8, run, (unsigned char *)string);
-	if(ret < 0) return -1;
-
-	return run;
-}
-
-static int Split_splitString(const char *string, QRinput *input,
-		QRencodeMode hint)
-{
-	int length;
-	QRencodeMode mode;
-
-	if(*string == '\0') return 0;
-
-	mode = Split_identifyMode(string, hint);
-	if(mode == QR_MODE_NUM) {
-		length = Split_eatNum(string, input, hint);
-	} else if(mode == QR_MODE_AN) {
-		length = Split_eatAn(string, input, hint);
-	} else if(mode == QR_MODE_KANJI && hint == QR_MODE_KANJI) {
-		length = Split_eatKanji(string, input, hint);
-	} else {
-		length = Split_eat8(string, input, hint);
-	}
-	if(length == 0) return 0;
-	if(length < 0) return -1;
-	return Split_splitString(&string[length], input, hint);
-}
-
-static char *dupAndToUpper(const char *str, QRencodeMode hint)
-{
-	char *newstr, *p;
-	QRencodeMode mode;
-
-	newstr = strdup(str);
-	if(newstr == NULL) return NULL;
-
-	p = newstr;
-	while(*p != '\0') {
-		mode = Split_identifyMode(p, hint);
-		if(mode == QR_MODE_KANJI) {
-			p += 2;
-		} else {
-			if (*p >= 'a' && *p <= 'z') {
-				*p = (char)((int)*p - 32);
-			}
-			p++;
-		}
-	}
-
-	return newstr;
-}
-
-int Split_splitStringToQRinput(const char *string, QRinput *input,
-		QRencodeMode hint, int casesensitive)
-{
-	char *newstr;
-	int ret;
-
-	if(!casesensitive) {
-		newstr = dupAndToUpper(string, hint);
-		if(newstr == NULL) return -1;
-		ret = Split_splitString(newstr, input, hint);
-		free(newstr);
-	} else {
-		ret = Split_splitString(string, input, hint);
-	}
-
-	return ret;
-}
diff --git a/qrencode/src/split.h b/qrencode/src/split.h
deleted file mode 100644
index 4ff9540f48faf74fa33618738f7e802b0d1c19d1..0000000000000000000000000000000000000000
--- a/qrencode/src/split.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * qrencode - QR Code encoder
- *
- * Input data splitter.
- * Copyright (C) 2006, 2007, 2008 Kentaro Fukuchi <fukuchi@megaui.net>
- *
- * The following data / specifications are taken from
- * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
- *  or
- * "Automatic identification and data capture techniques -- 
- *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef __SPLIT_H__
-#define __SPLIT_H__
-
-#include "qrencode.h"
-
-/**
- * Split the input string (null terminated) into QRinput.
- * @param string input string
- * @param hint give QR_MODE_KANJI if the input string contains Kanji character encoded in Shift-JIS. If not, give QR_MODE_8.
- * @param casesensitive 0 for case-insensitive encoding (all alphabet characters are replaced to UPPER-CASE CHARACTERS.
- * @retval 0 success.
- * @retval -1 an error occurred.
- */
-extern int Split_splitStringToQRinput(const char *string, QRinput *input,
-		QRencodeMode hint, int casesensitive);
-
-#endif /* __SPLIT_H__ */
diff --git a/questd/Makefile b/questd/Makefile
index 8e8137b5cc923e21f826b0b0405df059592a9a57..522d61d09aa816e0cf0fbe418a2c34be1894008c 100644
--- a/questd/Makefile
+++ b/questd/Makefile
@@ -8,13 +8,24 @@ include $(INCLUDE_DIR)/kernel.mk
 PKG_NAME:=questd
 PKG_VERSION:=2.0.3
 PKG_RELEASE:=3
-PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
+PKG_SOURCE_VERSION:=550f09040af42a62a53544aa31866c93048f7d2f
+PKG_SOURCE_PROTO:=git
+ifeq ($(CONFIG_BCM_OPEN),y)
+PKG_SOURCE_URL:=http://public.inteno.se/questd
+else
+PKG_SOURCE_URL:=git@public.inteno.se:questd
+endif
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
 
 LDFLAGS+= \
-        -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
-		-Wl,-rpath-link=$(STAGING_DIR)/lib
+	-Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
+	-Wl,-rpath-link=$(STAGING_DIR)/lib
 
 ifeq ($(CONFIG_PACKAGE_bcmkernel),y)
 BCMKERNEL_DIR:=$(BUILD_DIR)/bcmkernel/bcm963xx
@@ -24,9 +35,9 @@ endif
 export BCMKERNEL_DIR
 
 define Package/questd
-  CATEGORY:=Utilities
-  DEPENDS:=+libuci +libubox +ubus +libpthread
-  TITLE:=router info daemon
+	CATEGORY:=Utilities
+	DEPENDS:=+libuci +libubox +ubus +libpthread
+	TITLE:=router info daemon
 endef
 
 define Package/questd/description
@@ -34,11 +45,6 @@ define Package/questd/description
 	this information via ubus
 endef
 
-define Build/Prepare
-	mkdir -p $(PKG_BUILD_DIR)
-	$(CP) ./src/* $(PKG_BUILD_DIR)/
-endef
-
 define Package/questd/install
 	$(INSTALL_DIR) $(1)/sbin
 	$(INSTALL_DIR) $(1)/tmp
diff --git a/questd/src/Makefile b/questd/src/Makefile
deleted file mode 100644
index 112f52f3ade248c1d8ee3c7d5e944652e71ec24d..0000000000000000000000000000000000000000
--- a/questd/src/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-CC		= gcc
-CFLAGS		= -g -Wall 
-LOCLIBS		= 
-LIBS		= -luci -lubus -lubox -lpthread
-OBJS		= questd.o dumper.o port.o arping.o usb.o ndisc.o dslstats.o tools.o igmp.o
-SRCS		= questd.c dumper.c port.c arping.c usb.c ndisc.c dslstats.c tools.c igmp.c
-LIBSRCS		= 
-ISRCS		= questd.h
-
-all: questd
-
-questd: ${OBJS}
-	${CC} ${LDFLAGS} ${LIBSRCS} -o questd ${OBJS} ${LIBS}
-
-clean:
-	rm -f questd *.o
-
diff --git a/questd/src/arping.c b/questd/src/arping.c
deleted file mode 100644
index d15a9ea09e8db43498bd428a7c0bb1356e20a68a..0000000000000000000000000000000000000000
--- a/questd/src/arping.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * arping -- arping tool for questd
- *
- * Author: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
- * Author: Sukru Senli sukru.senli@inteno.se
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <net/if.h>
-#include <sys/ioctl.h>
-#include <netpacket/packet.h>
-#include <net/ethernet.h>
-#include <net/if_arp.h>
-#include <netinet/ether.h>
-#include <string.h>
-
-#include "questd.h"
-
-
-struct in_addr src;
-struct in_addr dst;
-struct sockaddr_ll me;
-struct sockaddr_ll he;
-int sock_fd;
-
-//void *mempcpy(void *dst, const void *src, size_t n); 
-
-static int
-send_pack(struct in_addr *src_addr, struct in_addr *dst_addr, struct sockaddr_ll *ME, struct sockaddr_ll *HE)
-{
-	int err;
-	unsigned char buf[256];
-	struct arphdr *ah = (struct arphdr *) buf;
-	unsigned char *p = (unsigned char *) (ah + 1);
-
-	ah->ar_hrd = htons(ARPHRD_ETHER);
-	ah->ar_pro = htons(ETH_P_IP);
-	ah->ar_hln = ME->sll_halen;
-	ah->ar_pln = 4;
-	ah->ar_op = htons(ARPOP_REQUEST);
-
-	p = mempcpy(p, &ME->sll_addr, ah->ar_hln);
-	p = mempcpy(p, src_addr, 4);
-
-	p = mempcpy(p, &HE->sll_addr, ah->ar_hln);
-	p = mempcpy(p, dst_addr, 4);
-
-	err = sendto(sock_fd, buf, p - buf, 0, (struct sockaddr *) HE, sizeof(*HE));
-	return err;
-}
-
-static bool
-recv_pack(char *buf, int len, struct sockaddr_ll *FROM)
-{
-	struct arphdr *ah = (struct arphdr *) buf;
-	unsigned char *p = (unsigned char *) (ah + 1);
-	struct in_addr src_ip, dst_ip;
-
-	/* Filter out wild packets */
-	if (FROM->sll_pkttype != PACKET_HOST
-	 && FROM->sll_pkttype != PACKET_BROADCAST
-	 && FROM->sll_pkttype != PACKET_MULTICAST)
-		return false;
-
-	/* Only these types are recognized */
-	if (ah->ar_op != htons(ARPOP_REPLY))
-		return false;
-
-	/* ARPHRD check and this darned FDDI hack here :-( */
-	if (ah->ar_hrd != htons(FROM->sll_hatype)
-	 && (FROM->sll_hatype != ARPHRD_FDDI || ah->ar_hrd != htons(ARPHRD_ETHER)))
-		return false;
-
-	/* Protocol must be IP. */
-	if (ah->ar_pro != htons(ETH_P_IP)
-	 || (ah->ar_pln != 4)
-	 || (ah->ar_hln != me.sll_halen)
-	 || (len < (int)(sizeof(*ah) + 2 * (4 + ah->ar_hln))))
-		return false;
-
-	(src_ip.s_addr) = *(uint32_t*)(p + ah->ar_hln);
-	(dst_ip.s_addr) = *(uint32_t*)(p + ah->ar_hln + 4 + ah->ar_hln);
-
-	if (dst.s_addr != src_ip.s_addr)
-		return false;
-
-	if ((src.s_addr != dst_ip.s_addr) || (memcmp(p + ah->ar_hln + 4, &me.sll_addr, ah->ar_hln)))
-		return false;
-
-	return true;
-}
-
-
-bool
-arping(char *targetIP, char *device, int toms)
-{
-	struct sockaddr_in saddr;
-	struct ifreq ifr;
-	int probe_fd;
-
-	sock_fd = socket(AF_PACKET, SOCK_DGRAM, 0);
-
-	memset(&ifr, 0, sizeof(ifr));
-	strncpy(ifr.ifr_name, device, IF_NAMESIZE);
-
-	if (ioctl(sock_fd, SIOCGIFINDEX, &ifr, sizeof(ifr)) < 0) {
-		close(sock_fd);
-		return false;
-	}
-
-	me.sll_family = AF_PACKET;
-	me.sll_ifindex = ifr.ifr_ifindex;
-	me.sll_protocol = htons(ETH_P_ARP);
-	bind(sock_fd, (struct sockaddr *) &me, sizeof(me));
-
-	socklen_t mlen = sizeof(me);
-	getsockname(sock_fd, (struct sockaddr *) &me, &mlen);
-
-	he = me;
-	memset(he.sll_addr, -1, he.sll_halen);
-
-	inet_pton(AF_INET, targetIP, &(dst.s_addr));
-
-	/* Get the sender IP address */
-	probe_fd = socket(AF_INET, SOCK_DGRAM, 0);
-	setsockopt(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr));
-	memset(&saddr, 0, sizeof(saddr));
-	saddr.sin_family = AF_INET;
-	socklen_t slen = sizeof(saddr);
-	saddr.sin_port = htons(1025);
-	saddr.sin_addr = dst;
-	connect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
-	getsockname(probe_fd, (struct sockaddr *) &saddr, &slen);
-	src = saddr.sin_addr;
-	close(probe_fd);
-
-	send_pack(&src, &dst, &me, &he);
-
-	char packet[64];
-	struct sockaddr_ll from;
-	socklen_t alen = sizeof(from);
-	bool connected = false;
-	int cc = -1;
-
-	fd_set read_fds, write_fds, except_fds;
-	FD_ZERO(&read_fds);
-	FD_ZERO(&write_fds);
-	FD_ZERO(&except_fds);
-	FD_SET(sock_fd, &read_fds);
-
-	struct timeval timeout;
-	timeout.tv_sec = 0;
-	timeout.tv_usec = toms * 1000;
-
-	if (select(sock_fd + 1, &read_fds, &write_fds, &except_fds, &timeout) == 1)
-	{
-		cc = recvfrom(sock_fd, packet, sizeof(packet), 0, (struct sockaddr *) &from, &alen);
-	}
-
-	if (cc >= 0)
-		connected = recv_pack(packet, cc, &from);
-
-	close(sock_fd);
-
-	return connected;
-}
diff --git a/questd/src/dslstats.c b/questd/src/dslstats.c
deleted file mode 100644
index 985c8c228b23de61860514009710f065e009f4c7..0000000000000000000000000000000000000000
--- a/questd/src/dslstats.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * dslstats -- collects adsl information for questd
- *
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * Author: martin.schroder@inteno.se
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#include "questd.h"
-
-#define DSLDEBUG(...) {} //printf(__VA_ARGS__)
-
-void dslstats_init(struct dsl_stats *self){
-	*self = (struct dsl_stats){0}; 
-}
-
-void dslstats_load(struct dsl_stats *self){
-	FILE *fp;
-	char line[128];
-	char name[64]; 
-	char sep[64]; 
-	char arg1[64]; 
-	char arg2[64]; 
-	
-	// start with default bearer 0 (we can support more later)
-	DSLBearer *bearer = &self->bearers[0]; 
-	DSLCounters *counters = &self->counters[0]; 
-	int done = 0; 
-	
-	if(!(fp = popen("xdslctl info --stats", "r"))) return; 
-	
-	while(!done && fgets(line, sizeof(line), fp) != NULL) {
-		DSLDEBUG("LINE: %d, %s, args:%d\n", strlen(line), line, narg); 
-		name[0] = 0; arg1[0] = 0; arg2[0] = 0; 
-		remove_newline(line);
-		int narg = sscanf(line, "%[^\t]%[\t ]%[^\t]%[\t]%[^\t]", name, sep, arg1, sep, arg2); 
-		switch(narg){
-			case 0: { // sections
-				if(strstr(line, "Bearer")){
-					int id = 0; 
-					if(sscanf(strstr(line, "Bearer"), "Bearer %d", &id) > 0){
-						if(id < DSLSTATS_BEARER_COUNT){
-							bearer = &self->bearers[id];
-							DSLDEBUG("Switching bearer: %d\n", id); 
-						}  
-					}
-				} 
-				// it is possible to add more stats like this though
-				/*
-				else if(strstr(name, "Latest 15 minutes time =") == name) counters = &self->counters[DSLSTATS_COUNTERS_CURRENT_15]; 
-				else if(strstr(name, "Previous 15 minutes time =") == name) counters = &self->counters[DSLSTATS_COUNTERS_PREVIOUS_15]; 
-				else if(strstr(name, "Latest 1 day time =") == name) counters = &self->counters[DSLSTATS_COUNTERS_CURRENT_DAY]; 
-				else if(strstr(name, "Previous 1 day time =") == name) counters = &self->counters[DSLSTATS_COUNTERS_PREVIOUS_DAY]; 
-				else if(strstr(name, "Since Link time =") == name) counters = &self->counters[DSLSTATS_COUNTERS_SINCE_LINK]; */
-			} break; 
-			case 1: { // various one liners
-				if(strstr(line, "Total time =") == line) counters = &self->counters[DSLSTATS_COUNTER_TOTALS]; 
-				else if(strstr(line, "Latest 15 minutes time =") == line) done = 1; // we stop parsing at this right now
-				else if(strstr(line, "Status") == line && strlen(line) > 9) strncpy(self->status, line + 8, sizeof(self->status)); 
-			} break; 
-			case 3: {
-				if(strstr(name, "Link Power State") == name) strncpy(self->link_power_state, arg1, sizeof(self->link_power_state)); 
-				else if(strstr(name, "Mode") == name) strncpy(self->mode, arg1, sizeof(self->mode)); 
-				else if(strstr(name, "VDSL2 Profile") == name) strncpy(self->vdsl2_profile, arg1, sizeof(self->vdsl2_profile));
-				else if(strstr(name, "TPS") == name) strncpy(self->traffic, arg1, sizeof(self->traffic)); 
-				else if(strstr(name, "Trellis") == name){
-					char tmp[2][64]; 
-					if(sscanf(arg1, "U:%s /D:%s", tmp[0], tmp[1])){
-						DSLDEBUG("TRELLIS: %s %s\n", tmp[0], tmp[1]); 
-						if(strcmp(tmp[0], "ON") == 0) self->trellis.down = 1; 
-						else self->trellis.down = 0; 
-						if(strcmp(tmp[1], "ON") == 0) self->trellis.up = 1; 
-						else self->trellis.up = 0; 
-					}
-				}
-				else if(strstr(name, "Line Status") == name) strncpy(self->line_status, arg1, sizeof(self->line_status)); 
-				else if(strstr(name, "Bearer") == name){
-					unsigned long id, up, down, ret; 
-					if((ret = sscanf(arg1, "%lu, Upstream rate = %lu Kbps, Downstream rate = %lu Kbps", &id, &up, &down)) == 3){
-						if(id < DSLSTATS_BEARER_COUNT){
-							bearer = &self->bearers[id]; 
-							bearer->rate.up = up; 
-							bearer->rate.down = down; 
-							DSLDEBUG("Switching bearer: %d\n", id); 
-						}
-					}
-				}
-				else if(strstr(name, "Max") == name) {
-					sscanf(arg1, "Upstream rate = %lf Kbps, Downstream rate = %lf Kbps", &bearer->max_rate.up, &bearer->max_rate.down); 
-				}
-				DSLDEBUG("PARSED: name:%s, arg1:%s\n", name, arg1); 
-			} break; 
-			case 5: {
-				if(strstr(name, "SNR") == name) {
-					self->snr.down = atof(arg1);
-					self->snr.up = atof(arg2); 
-				}
-				else if(strstr(name, "Attn") == name){
-					self->attn.down = atof(arg1);
-					self->attn.up = atof(arg2); 
-				} 
-				else if(strstr(name, "Pwr") == name){
-					self->pwr.down = atof(arg1); 
-					self->pwr.up = atof(arg2); 
-				}
-				else if(strstr(name, "MSGc") == name){
-					bearer->msgc.down = atof(arg1); 
-					bearer->msgc.up = atof(arg2); 
-				}
-				else if(strstr(name, "B:") == name){
-					bearer->b.down = atof(arg1); 
-					bearer->b.up = atof(arg2); 
-				}
-				else if(strstr(name, "M:") == name){
-					bearer->m.down = atof(arg1); 
-					bearer->m.up = atof(arg2); 
-				}
-				else if(strstr(name, "T:") == name){
-					bearer->t.down = atof(arg1); 
-					bearer->t.up = atof(arg2); 
-				}
-				else if(strstr(name, "R:") == name){
-					bearer->r.down = atof(arg1); 
-					bearer->r.up = atof(arg2); 
-				}
-				else if(strstr(name, "S:") == name){
-					bearer->s.down = atof(arg1); 
-					bearer->s.up = atof(arg2); 
-				}
-				else if(strstr(name, "L:") == name){
-					bearer->l.down = atof(arg1); 
-					bearer->l.up = atof(arg2); 
-				}
-				else if(strstr(name, "D:") == name){
-					bearer->d.down = atof(arg1); 
-					bearer->d.up = atof(arg2); 
-				}
-				else if(strstr(name, "delay:") == name){
-					bearer->delay.down = atof(arg1); 
-					bearer->delay.up = atof(arg2); 
-				}
-				else if(strstr(name, "INP:") == name){
-					bearer->inp.down = atof(arg1); 
-					bearer->inp.up = atof(arg2); 
-				}
-				else if(strstr(name, "SF:") == name){
-					bearer->sf.down = atoll(arg1); 
-					bearer->sf.up = atoll(arg2); 
-				}
-				else if(strstr(name, "SFErr:") == name){
-					bearer->sf_err.down = atoll(arg1); 
-					bearer->sf_err.up = atoll(arg2); 
-				}
-				else if(strstr(name, "RS:") == name){
-					bearer->rs.down = atoll(arg1); 
-					bearer->rs.up = atoll(arg2); 
-				}
-				else if(strstr(name, "RSCorr:") == name){
-					bearer->rs_corr.down = atoll(arg1); 
-					bearer->rs_corr.up = atoll(arg2); 
-				}
-				else if(strstr(name, "RSUnCorr:") == name){
-					bearer->rs_uncorr.down = atoll(arg1); 
-					bearer->rs_uncorr.up = atoll(arg2); 
-				}
-				else if(strstr(name, "HEC:") == name){
-					bearer->hec.down = atoll(arg1); 
-					bearer->hec.up = atoll(arg2); 
-				}
-				else if(strstr(name, "OCD:") == name){
-					bearer->ocd.down = atoll(arg1); 
-					bearer->ocd.up = atoll(arg2); 
-				}
-				else if(strstr(name, "LCD:") == name){
-					bearer->lcd.down = atoll(arg1); 
-					bearer->lcd.up = atoll(arg2); 
-				}
-				else if(strstr(name, "Total Cells:") == name){
-					bearer->total_cells.down = atoll(arg1); 
-					bearer->total_cells.up = atoll(arg2); 
-				}
-				else if(strstr(name, "Data Cells:") == name){
-					bearer->data_cells.down = atoll(arg1); 
-					bearer->data_cells.up = atoll(arg2); 
-				}
-				else if(strstr(name, "Bit Errors:") == name){
-					bearer->bit_errors.down = atoll(arg1); 
-					bearer->bit_errors.up = atoll(arg2); 
-				}
-				else if(strstr(name, "ES:") == name){
-					counters->es.down = atoll(arg1); 
-					counters->es.up = atoll(arg2); 
-				}
-				else if(strstr(name, "SES:") == name){
-					counters->ses.down = atoll(arg1); 
-					counters->ses.up = atoll(arg2); 
-				}
-				else if(strstr(name, "UAS:") == name){
-					counters->uas.down = atoll(arg1); 
-					counters->uas.up = atoll(arg2); 
-				}
-				else if(strstr(name, "FEC:") == name){
-					counters->fec.down = atoll(arg1); 
-					counters->fec.up = atoll(arg2); 
-				}
-				else if(strstr(name, "CRC:") == name){
-					counters->crc.down = atoll(arg1); 
-					counters->crc.up = atoll(arg2); 
-				}
-				DSLDEBUG("PARSED: name:%s, arg1:%s, arg2:%s\n", name, arg1, arg2); 
-			} break; 
-			default: {
-				DSLDEBUG("ERROR: line:%s, fcnt:%d, name:%s, arg1:%s, arg2:%s\n", line, narg, name, arg1, arg2); 
-			}
-		}
-	}
-	
-	pclose(fp);
-}
-
-void dslstats_free(struct dsl_stats *self){
-	
-}
-
-void dslstats_to_blob_buffer(struct dsl_stats *self, struct blob_buf *b){
-	void *t, *array, *obj;
-	DSLBearer *bearer = &self->bearers[0]; 
-	DSLCounters *counter = &self->counters[DSLSTATS_COUNTER_TOTALS]; 
-	//dslstats_load(self); 
-	
-	t = blobmsg_open_table(b, "dslstats");
-	blobmsg_add_string(b, "mode", self->mode);
-	blobmsg_add_string(b, "traffic", self->traffic);
-	blobmsg_add_string(b, "status", self->status);
-	blobmsg_add_string(b, "link_power_state", self->link_power_state);
-	blobmsg_add_string(b, "line_status", self->line_status);
-	blobmsg_add_u8(b, "trellis_up", self->trellis.up); 
-	blobmsg_add_u8(b, "trellis_down", self->trellis.down); 
-	blobmsg_add_u32(b, "snr_up_x100", self->snr.up * 100); 
-	blobmsg_add_u32(b, "snr_down_x100", self->snr.down * 100); 
-	blobmsg_add_u32(b, "pwr_up_x100", self->pwr.up * 100); 
-	blobmsg_add_u32(b, "pwr_down_x100", self->pwr.down * 100); 
-	blobmsg_add_u32(b, "attn_up_x100", self->attn.up * 100); 
-	blobmsg_add_u32(b, "attn_down_x100", self->attn.down * 100); 
-	
-	// add bearer data (currently only one bearer)
-	array = blobmsg_open_array(b, "bearers"); 
-		obj = blobmsg_open_table(b, NULL); 
-			blobmsg_add_u32(b, "max_rate_up", bearer->max_rate.up); 
-			blobmsg_add_u32(b, "max_rate_down", bearer->max_rate.down); 
-			blobmsg_add_u32(b, "rate_up", bearer->rate.up); 
-			blobmsg_add_u32(b, "rate_down", bearer->rate.down); 
-			blobmsg_add_u32(b, "msgc_up", bearer->msgc.up); 
-			blobmsg_add_u32(b, "msgc_down", bearer->msgc.down); 
-			blobmsg_add_u32(b, "b_down", bearer->b.down); 
-			blobmsg_add_u32(b, "b_up", bearer->b.up); 
-			blobmsg_add_u32(b, "m_down", bearer->m.down); 
-			blobmsg_add_u32(b, "m_up", bearer->m.up); 
-			blobmsg_add_u32(b, "t_down", bearer->t.down); 
-			blobmsg_add_u32(b, "t_up", bearer->t.up); 
-			blobmsg_add_u32(b, "r_down", bearer->r.down); 
-			blobmsg_add_u32(b, "r_up", bearer->r.up); 
-			blobmsg_add_u32(b, "s_down_x10000", bearer->s.down * 10000); 
-			blobmsg_add_u32(b, "s_up_x10000", bearer->s.up * 10000); 
-			blobmsg_add_u32(b, "l_down", bearer->l.down); 
-			blobmsg_add_u32(b, "l_up", bearer->l.up); 
-			blobmsg_add_u32(b, "d_down", bearer->d.down); 
-			blobmsg_add_u32(b, "d_up", bearer->d.up); 
-			blobmsg_add_u32(b, "delay_down", bearer->delay.down); 
-			blobmsg_add_u32(b, "delay_up", bearer->delay.up); 
-			blobmsg_add_u32(b, "inp_down_x100", bearer->inp.down * 100); 
-			blobmsg_add_u32(b, "inp_up_x100", bearer->inp.up * 100); 
-			blobmsg_add_u64(b, "sf_down", bearer->sf.down); 
-			blobmsg_add_u64(b, "sf_up", bearer->sf.up); 
-			blobmsg_add_u64(b, "sf_err_down", bearer->sf_err.down); 
-			blobmsg_add_u64(b, "sf_err_up", bearer->sf_err.up); 
-			blobmsg_add_u64(b, "rs_down", bearer->rs.down); 
-			blobmsg_add_u64(b, "rs_up", bearer->rs.up); 
-			blobmsg_add_u64(b, "rs_corr_down", bearer->rs_corr.down); 
-			blobmsg_add_u64(b, "rs_corr_up", bearer->rs_corr.up); 
-			blobmsg_add_u64(b, "rs_uncorr_down", bearer->rs_uncorr.down); 
-			blobmsg_add_u64(b, "rs_uncorr_up", bearer->rs_uncorr.up); 
-			blobmsg_add_u64(b, "hec_down", bearer->hec.down); 
-			blobmsg_add_u64(b, "hec_up", bearer->hec.up); 
-			blobmsg_add_u64(b, "ocd_down", bearer->ocd.down); 
-			blobmsg_add_u64(b, "ocd_up", bearer->ocd.up); 
-			blobmsg_add_u64(b, "lcd_down", bearer->lcd.down); 
-			blobmsg_add_u64(b, "lcd_up", bearer->lcd.up); 
-			blobmsg_add_u64(b, "total_cells_down", bearer->total_cells.down); 
-			blobmsg_add_u64(b, "total_cells_up", bearer->total_cells.up); 
-			blobmsg_add_u64(b, "data_cells_down", bearer->data_cells.down); 
-			blobmsg_add_u64(b, "data_cells_up", bearer->data_cells.up); 
-			blobmsg_add_u64(b, "bit_errors_down", bearer->bit_errors.down); 
-			blobmsg_add_u64(b, "bit_errors_up", bearer->bit_errors.up); 
-		blobmsg_close_table(b, obj); 
-	blobmsg_close_array(b, array); 
-	
-	// add counter data (currently only totals)
-	//counter = &self->counters[DSLSTATS_COUNTER_TOTALS]; 
-	array = blobmsg_open_table(b, "counters"); 
-		obj = blobmsg_open_table(b, "totals"); 
-			blobmsg_add_u64(b, "fec_down", counter->fec.down); 
-			blobmsg_add_u64(b, "fec_up", counter->fec.up); 
-			blobmsg_add_u64(b, "crc_down", counter->crc.down); 
-			blobmsg_add_u64(b, "crc_up", counter->crc.up); 
-			blobmsg_add_u64(b, "es_down", counter->es.down); 
-			blobmsg_add_u64(b, "es_up", counter->es.up); 
-			blobmsg_add_u64(b, "ses_down", counter->ses.down); 
-			blobmsg_add_u64(b, "ses_up", counter->ses.up); 
-			blobmsg_add_u64(b, "uas_down", counter->uas.down); 
-			blobmsg_add_u64(b, "uas_up", counter->uas.up); 
-		blobmsg_close_table(b, obj); 
-	blobmsg_close_array(b, array); 
-	
-	blobmsg_close_table(b, t);
-}
-
-
-int dslstats_rpc(struct ubus_context *ctx, struct ubus_object *obj, 
-	struct ubus_request_data *req, const char *method, 
-	struct blob_attr *msg){
-	static struct blob_buf bb;
-	static struct dsl_stats dslstats;
-	
-	dslstats_init(&dslstats); 
-	blob_buf_init(&bb, 0); 
-	
-	dslstats_load(&dslstats);
-	dslstats_to_blob_buffer(&dslstats, &bb); 
-	
-	ubus_send_reply(ctx, req, bb.head); 
-	
-	dslstats_free(&dslstats); 
-	
-	return 0; 	
-}
diff --git a/questd/src/dslstats.h b/questd/src/dslstats.h
deleted file mode 100644
index f5461b54fb34640c4a69ee273684b88726328c33..0000000000000000000000000000000000000000
--- a/questd/src/dslstats.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * dslstats -- collects adsl information for questd
- *
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * Author: martin.schroder@inteno.se
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
- 
-#pragma once
-
-enum {
-	DSLSTATS_BEARER_0 = 0, 
-	DSLSTATS_BEARER_COUNT
-}; 
-
-enum {
-	DSLSTATS_COUNTER_TOTALS, 
-	DSLSTATS_COUNTER_CURRENT_15,
-	DSLSTATS_COUNTER_PREVIOUS_15, 
-	DSLSTATS_COUNTER_CURRENT_DAY,
-	DSLSTATS_COUNTER_PREVIOUS_DAY,
-	DSLSTATS_COUNTER_SINCE_LINK,
-	DSLSTATS_COUNTER_COUNT
-}; 
-
-typedef struct { double up; double down; } UpDown; 
-typedef struct dsl_bearer {
-
-	UpDown max_rate; 
-	UpDown rate; 
-	UpDown msgc;  
-	UpDown b,m,t,r,s,l,d; 
-	UpDown delay; 
-	UpDown inp; 
-	UpDown sf, sf_err;
-	UpDown rs, rs_corr, rs_uncorr;
-	UpDown hec, ocd, lcd; 
-	UpDown total_cells, data_cells, bit_errors; 
-	
-} DSLBearer; 
-
-typedef struct dsl_counters {
-	UpDown es, ses, uas; 
-	UpDown fec, crc; 
-} DSLCounters; 
-
-typedef struct dsl_stats {
-	char mode[64]; 
-	char traffic[64];
-	char status[64]; 
-	char link_power_state[64]; 
-	char line_status[64]; 
-	char vdsl2_profile[64]; 
-	UpDown trellis; 
-	UpDown snr; 
-	UpDown pwr; 
-	UpDown attn; 
-	DSLBearer bearers[DSLSTATS_BEARER_COUNT]; 
-	DSLCounters counters[DSLSTATS_COUNTER_COUNT]; 
-} DSLStats; 
-
-void dslstats_init(struct dsl_stats *self); 
-void dslstats_load(struct dsl_stats *self); 
-void dslstats_to_blob_buffer(struct dsl_stats *self, struct blob_buf *b); 
-int dslstats_rpc(struct ubus_context *ctx, struct ubus_object *obj, 
-	struct ubus_request_data *req, const char *method, 
-	struct blob_attr *msg); 
diff --git a/questd/src/dumper.c b/questd/src/dumper.c
deleted file mode 100644
index c6863cf395d69f4bde27d35e83b9bfb9292f2bb7..0000000000000000000000000000000000000000
--- a/questd/src/dumper.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * dumper -- collects router device and system info for questd
- *
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * Author: sukru.senli@inteno.se
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#include "questd.h"
-
-struct uci_context *db_ctx;
-static bool dbLoaded = false;
-static struct uci_ptr ptr;
-
-void
-init_db_hw_config(void)
-{
-	db_ctx = uci_alloc_context();
-	uci_set_confdir(db_ctx, "/lib/db/config/");
-	if(uci_load(db_ctx, "hw", NULL) == UCI_OK)
-		dbLoaded = true;
-}
-
-static void
-get_db_hw_value(char *opt, char **val)
-{
-	memset(&ptr, 0, sizeof(ptr));
-	ptr.package = "hw";
-	ptr.section = "board";
-	ptr.value = NULL;
-
-	*val = "";
-
-	if (!dbLoaded)
-		return;
-
-	ptr.option = opt;
-	if (uci_lookup_ptr(db_ctx, &ptr, NULL, true) != UCI_OK)
-		return;
-
-	if (!(ptr.flags & UCI_LOOKUP_COMPLETE))
-		return;
-
-	if(!ptr.o->v.string)
-		return;
-
-	*val = ptr.o->v.string;
-}
-
-void
-get_jif_val(jiffy_counts_t *p_jif)
-{
-	FILE *file;
-	char line[128];
-	int ret;
-
-	if ((file = fopen("/proc/stat", "r"))) {
-		while(fgets(line, sizeof(line), file) != NULL)
-		{
-			remove_newline(line);
-			ret = sscanf(line, "cpu %llu %llu %llu %llu %llu %llu %llu %llu", &p_jif->usr, &p_jif->nic, &p_jif->sys, &p_jif->idle,
-				&p_jif->iowait, &p_jif->irq, &p_jif->softirq, &p_jif->steal);
-
-			if (ret >= 4) {
-				p_jif->total = p_jif->usr + p_jif->nic + p_jif->sys + p_jif->idle
-					+ p_jif->iowait + p_jif->irq + p_jif->softirq + p_jif->steal;
-
-				p_jif->busy = p_jif->total - p_jif->idle - p_jif->iowait;
-				break;
-			}
-		}
-		fclose(file);
-	}
-}
-
-void
-dump_specs(Spec *spec)
-{
-	char *val;
-
-	spec->wifi = false;
-	spec->adsl = false;
-	spec->vdsl = false;
-	spec->voice = false;
-	spec->dect = false;
-	spec->vports = 0;
-	spec->eports = 0;
-
-	get_db_hw_value("hasWifi", &val);
-	if (!strcmp(val, "1")) spec->wifi = true;
-
-	get_db_hw_value("hasAdsl", &val);
-	if (!strcmp(val, "1")) spec->adsl = true;
-
-	get_db_hw_value("hasVdsl", &val);
-	if (!strcmp(val, "1")) spec->vdsl = true;
-
-	get_db_hw_value("hasVoice", &val);
-	if (!strcmp(val, "1")) spec->voice = true;
-
-	get_db_hw_value("hasDect", &val);
-	if (!strcmp(val, "1")) spec->dect = true;
-
-	get_db_hw_value("VoicePorts", &val);
-	if (spec->voice) spec->vports = atoi(val);
-
-	get_db_hw_value("ethernetPorts", &val);
-	spec->eports = atoi(val);
-}
-
-void
-dump_keys(Key *keys)
-{
-	get_db_hw_value("authKey", &keys->auth);
-	get_db_hw_value("desKey", &keys->des);
-	get_db_hw_value("wpaKey", &keys->wpa);
-}
-
-void
-dump_static_router_info(Router *router)
-{
-	get_db_hw_value("boardId", &router->boardid);
-	get_db_hw_value("hardwareVersion", &router->hardware);
-	get_db_hw_value("routerModel", &router->model);
-	get_db_hw_value("iopVersion", &router->firmware);
-	get_db_hw_value("brcmVersion", &router->brcmver);
-	get_db_hw_value("filesystem", &router->filesystem);
-	get_db_hw_value("socModel", &router->socmod);
-	get_db_hw_value("socRevision", &router->socrev);
-	get_db_hw_value("cfeVersion", &router->cfever);
-	get_db_hw_value("kernelVersion", &router->kernel);
-	get_db_hw_value("BaseMacAddr", &router->basemac);
-	get_db_hw_value("serialNumber", &router->serialno);
-}
-
-void
-dump_hostname(Router *router)
-{
-	FILE *file;
-	char line[64];
-	char name[64];
-
-	strcpy(router->name, "");
-	if ((file = fopen("/proc/sys/kernel/hostname", "r"))) {
-		while(fgets(line, sizeof(line), file) != NULL)
-		{
-			remove_newline(line);
-			if (sscanf(line, "%s", name) == 1)
-				break;
-		}
-		fclose(file);
-	}
-	strcpy(router->name, name);
-}
-
-void
-dump_sysinfo(Router *router, Memory *memory)
-{
-	struct sysinfo sinfo;
-	long int seconds;
-	int days, hours, minutes;
-
-	if (sysinfo(&sinfo) == 0) {
-		seconds = sinfo.uptime;
-		days = seconds / (60 * 60 * 24);
-		seconds -= days * (60 * 60 * 24);
-		hours = seconds / (60 * 60);
-		seconds -= hours * (60 * 60);
-		minutes = seconds / 60;
-		seconds -= minutes * 60;
-		sprintf(router->uptime, "%dd %dh %dm %lds", days, hours, minutes, seconds);
-
-		router->procs = sinfo.procs;
-
-		memory->total = (sinfo.totalram / 1024);
-		memory->free = (sinfo.freeram / 1024);
-		memory->used = ((sinfo.totalram - sinfo.freeram) / 1024);
-		memory->shared = (sinfo.sharedram / 1024);
-		memory->buffers = (sinfo.bufferram / 1024);
-	}
-}
-
-void
-dump_cpuinfo(Router *router, jiffy_counts_t *prev_jif, jiffy_counts_t *cur_jif)
-{
-	unsigned total_diff, cpu;
-
-	total_diff = (unsigned)(cur_jif->total - prev_jif->total);
-
-	if (total_diff == 0) total_diff = 1;
-
-	cpu = 100 * (unsigned)(cur_jif->usr - prev_jif->usr) / total_diff;
-
-	router->cpu = cpu;
-}
-
diff --git a/questd/src/igmp.c b/questd/src/igmp.c
deleted file mode 100644
index b2bc5957c7cd336aa3a67eb9f15fae23e3134961..0000000000000000000000000000000000000000
--- a/questd/src/igmp.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#include "questd.h"
-#include "igmp.h"
-
-char* convert_to_ipaddr(int ip)
-{
-	struct in_addr ip_addr;
-	ip_addr.s_addr = ip;
-	return inet_ntoa(ip_addr);
-}
-
-char* single_space(char* str){
-	char *from, *to;
-	int space = 0;
-	from = to = str;
-	while(1) {
-		if(space && *from == ' ' && to[-1] == ' ') {
-			++from;
-		} else {
-			space = (*from == ' ') ? 1 : 0;
-			*to++ = *from++;
-			if(!to[-1])
-				break;
-		}
-	}
-	return str;
-}
-
-int igmp_rpc(struct ubus_context *ctx, struct ubus_object *obj,
-		struct ubus_request_data *req, const char *method,
-		struct blob_attr *msg) {
-
-	struct blob_buf bb;
-	IGMPtable table[MAX_IGMP_ENTRY];
-	FILE *snptable;
-	char line[256];
-	int idx = 0;
-	void *t, *a;
-
-	if ((snptable = fopen("/proc/net/igmp_snooping", "r"))) {
-		while(fgets(line, sizeof(line), snptable) != NULL)
-		{
-			remove_newline(line);
-			table[idx].exists = false;
-			if(sscanf(single_space(line),"%s %s %s %s %x %x %x %s %x %x %x %d %x %d",
-					table[idx].bridge, table[idx].device, table[idx].srcdev, table[idx].tags, &(table[idx].lantci), &(table[idx].wantci),
-					&(table[idx].group), table[idx].mode, &(table[idx].RxGroup), &(table[idx].source), &(table[idx].reporter),
-					&(table[idx].timeout), &(table[idx].Index), &(table[idx].ExcludPt)) == 14)
-			{
-				table[idx].exists = true;
-				idx++;
-			}
-		}
-		fclose(snptable);
-	} else
-		return UBUS_STATUS_NOT_FOUND;
-
-	blob_buf_init(&bb, 0);
-
-	a = blobmsg_open_array(&bb, "table");
-	for (idx = 0; idx < MAX_IGMP_ENTRY; idx++) {
-		if (!table[idx].exists)
-			break;
-		t = blobmsg_open_table(&bb, NULL);
-		blobmsg_add_string(&bb,"bridge", table[idx].bridge);
-		blobmsg_add_string(&bb,"device", table[idx].device);
-		blobmsg_add_string(&bb,"srcdev", table[idx].srcdev);
-		blobmsg_add_string(&bb,"tags", table[idx].tags);
-		blobmsg_add_u32(&bb,"lantci", table[idx].lantci);
-		blobmsg_add_u32(&bb,"wantci", table[idx].wantci);
-		blobmsg_add_string(&bb,"group", convert_to_ipaddr(table[idx].group));
-		blobmsg_add_string(&bb,"mode", table[idx].mode);
-		blobmsg_add_string(&bb,"rxgroup", convert_to_ipaddr(table[idx].RxGroup));
-		blobmsg_add_string(&bb,"source", convert_to_ipaddr(table[idx].source));
-		blobmsg_add_string(&bb,"reporter", convert_to_ipaddr(table[idx].reporter));
-		blobmsg_add_u32(&bb,"timeout", table[idx].timeout);
-		blobmsg_add_u32(&bb,"index", table[idx].Index);
-		blobmsg_add_u32(&bb,"excludpt", table[idx].ExcludPt);
-		blobmsg_close_table(&bb, t);
-	}
-	blobmsg_close_array(&bb, a);
-
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
diff --git a/questd/src/igmp.h b/questd/src/igmp.h
deleted file mode 100644
index bab9fffb81a0b8968c1cbd8f67ae2e6639a3099e..0000000000000000000000000000000000000000
--- a/questd/src/igmp.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * igmp.h
- *
- *  Created on: May 5, 2015
- *      Author: stefan
- */
-
-#ifndef IGMP_H_
-#define IGMP_H_
-#ifndef NULL
-#define NULL   ((void *) 0)
-#endif
-
-#define MAX_IGMP_ENTRY 128
-
-int igmp_rpc(struct ubus_context *ctx, struct ubus_object *obj,
-	struct ubus_request_data *req, const char *method,
-	struct blob_attr *msg);
-
-
-typedef struct igmp_table {
-	bool exists;
-	char bridge[32];
-	char device[32];
-	char srcdev[32];
-	char tags[32];
-	int lantci;
-	int wantci;
-	int group;
-	char mode[32];
-	int RxGroup;
-	int source;
-	int reporter;
-	int timeout;
-	int Index;
-	int ExcludPt;
-
-}IGMPtable;
-#endif /* IGMP_H_ */
diff --git a/questd/src/ndisc.c b/questd/src/ndisc.c
deleted file mode 100644
index bbbab31aa1420d0be6ad326f9190a3eb93b4c4f2..0000000000000000000000000000000000000000
--- a/questd/src/ndisc.c
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- *  ndisc.c - ICMPv6 neighbour discovery command line tool
- *
- *  Author: Rémi Denis-Courmont
- *  questd port: Sukru Senli sukru.senli@inteno.se
- *
- *  Copyright © 2004-2007 Rémi Denis-Courmont.
- *  This program is free software: you can redistribute and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, versions 2 of the license.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h> /* div() */
-#include <inttypes.h> /* uint8_t */
-#include <limits.h> /* UINT_MAX */
-#include <locale.h>
-#include <stdbool.h>
-
-#include <errno.h> /* EMFILE */
-#include <sys/types.h>
-#include <unistd.h> /* close() */
-#include <time.h> /* clock_gettime() */
-#include <poll.h> /* poll() */
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <fcntl.h>
-
-#include <sys/times.h> /* times() fallback */
-
-#include <netdb.h> /* getaddrinfo() */
-#include <arpa/inet.h> /* inet_ntop() */
-#include <net/if.h> /* if_nametoindex() */
-
-#include <netinet/in.h>
-#include <netinet/icmp6.h>
-
-#ifndef IPV6_RECVHOPLIMIT
-/* Using obsolete RFC 2292 instead of RFC 3542 */ 
-# define IPV6_RECVHOPLIMIT IPV6_HOPLIMIT
-#endif
-
-#ifndef AI_IDN
-# define AI_IDN 0
-#endif
-
-enum ndisc_flags
-{
-	NDISC_VERBOSE1=0x1,
-	NDISC_VERBOSE2=0x2,
-	NDISC_VERBOSE3=0x3,
-	NDISC_VERBOSE =0x3,
-	NDISC_NUMERIC =0x4,
-	NDISC_SINGLE  =0x8,
-};
-
-#if defined (CLOCK_HIGHRES) && !defined (CLOCK_MONOTONIC)
-# define CLOCK_MONOTONIC CLOCK_HIGHRES
-#endif
-
-static inline void
-mono_gettime (struct timespec *ts)
-{
-#ifdef CLOCK_MONOTONIC
-	if (clock_gettime (CLOCK_MONOTONIC, ts))
-#endif
-	{
-		static long freq = 0;
-		if (freq == 0)
-			freq = sysconf (_SC_CLK_TCK);
-
-		struct tms dummy;
-		clock_t t = times (&dummy);
-		ts->tv_sec = t / freq;
-		ts->tv_nsec = (t % freq) * (1000000000 / freq);
-	}
-}
-
-
-static int
-getipv6byname (const char *name, const char *ifname, int numeric, struct sockaddr_in6 *addr)
-{
-	struct addrinfo hints, *res;
-	memset (&hints, 0, sizeof (hints));
-	hints.ai_family = PF_INET6;
-	hints.ai_socktype = SOCK_DGRAM; /* dummy */
-	hints.ai_flags = numeric ? AI_NUMERICHOST : 0;
-
-	int val = getaddrinfo (name, NULL, &hints, &res);
-	if (val)
-	{
-		fprintf (stderr, "%s: %s\n", name, gai_strerror (val));
-		return -1;
-	}
-
-	memcpy (addr, res->ai_addr, sizeof (struct sockaddr_in6));
-	freeaddrinfo (res);
-
-	val = if_nametoindex (ifname);
-	if (val == 0)
-	{
-		perror (ifname);
-		return -1;
-	}
-	addr->sin6_scope_id = val;
-
-	return 0;
-}
-
-
-static inline int
-sethoplimit (int fd, int value)
-{
-	return (setsockopt (fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
-	                    &value, sizeof (value))
-	     || setsockopt (fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
-	                    &value, sizeof (value))) ? -1 : 0;
-}
-
-
-static char MACADDR[24];
-
-void
-clear_macaddr() {
-	memset(MACADDR, '\0', sizeof(MACADDR));
-}
-
-char *
-get_macaddr()
-{
-	return MACADDR;
-}
-
-
-static void
-printmacaddress (const uint8_t *ptr, size_t len)
-{
-	char mac[4];
-	while (len > 1)
-	{
-		sprintf(mac, "%02X:", *ptr);
-		strcat(MACADDR, mac);
-		ptr++;
-		len--;
-	}
-
-	if (len == 1) {
-		sprintf(mac, "%02X", *ptr);
-		strcat(MACADDR, mac);
-	}
-}
-
-
-# ifdef __linux__
-#  include <sys/ioctl.h>
-# endif
-
-static int
-getmacaddress (const char *ifname, uint8_t *addr)
-{
-# ifdef SIOCGIFHWADDR
-	struct ifreq req;
-	memset (&req, 0, sizeof (req));
-
-	if (((unsigned)strlen (ifname)) >= (unsigned)IFNAMSIZ)
-		return -1; /* buffer overflow = local root */
-	strcpy (req.ifr_name, ifname);
-
-	int fd = socket (AF_INET6, SOCK_DGRAM, 0);
-	if (fd == -1)
-		return -1;
-
-	if (ioctl (fd, SIOCGIFHWADDR, &req))
-	{
-		perror (ifname);
-		close (fd);
-		return -1;
-	}
-	close (fd);
-
-	memcpy (addr, req.ifr_hwaddr.sa_data, 6);
-	return 0;
-# else
-	(void)ifname;
-	(void)addr;
-	return -1;
-# endif
-}
-
-
-static const uint8_t nd_type_advert = ND_NEIGHBOR_ADVERT;
-static const unsigned nd_delay_ms = 1000;
-static const unsigned ndisc_default = NDISC_VERBOSE1 | NDISC_SINGLE;
-
-
-typedef struct
-{
-	struct nd_neighbor_solicit hdr;
-	struct nd_opt_hdr opt;
-	uint8_t hw_addr[6];
-} solicit_packet;
-
-
-static ssize_t
-buildsol (solicit_packet *ns, struct sockaddr_in6 *tgt, const char *ifname)
-{
-	/* builds ICMPv6 Neighbor Solicitation packet */
-	ns->hdr.nd_ns_type = ND_NEIGHBOR_SOLICIT;
-	ns->hdr.nd_ns_code = 0;
-	ns->hdr.nd_ns_cksum = 0; /* computed by the kernel */
-	ns->hdr.nd_ns_reserved = 0;
-	memcpy (&ns->hdr.nd_ns_target, &tgt->sin6_addr, 16);
-
-	/* determines actual multicast destination address */
-	memcpy (tgt->sin6_addr.s6_addr, "\xff\x02\x00\x00\x00\x00\x00\x00"
-	                                "\x00\x00\x00\x01\xff", 13);
-
-	/* gets our own interface's link-layer address (MAC) */
-	if (getmacaddress (ifname, ns->hw_addr))
-		return sizeof (ns->hdr);
-	
-	ns->opt.nd_opt_type = ND_OPT_SOURCE_LINKADDR;
-	ns->opt.nd_opt_len = 1; /* 8 bytes */
-	return sizeof (*ns);
-}
-
-
-static int
-parseadv (const uint8_t *buf, size_t len, const struct sockaddr_in6 *tgt, bool verbose)
-{
-	const struct nd_neighbor_advert *na =
-		(const struct nd_neighbor_advert *)buf;
-	const uint8_t *ptr;
-	
-	/* checks if the packet is a Neighbor Advertisement, and
-	 * if the target IPv6 address is the right one */
-	if ((len < sizeof (struct nd_neighbor_advert))
-	 || (na->nd_na_type != ND_NEIGHBOR_ADVERT)
-	 || (na->nd_na_code != 0)
-	 || memcmp (&na->nd_na_target, &tgt->sin6_addr, 16))
-		return -1;
-
-	len -= sizeof (struct nd_neighbor_advert);
-
-	/* looks for Target Link-layer address option */
-	ptr = buf + sizeof (struct nd_neighbor_advert);
-
-	while (len >= 8)
-	{
-		uint16_t optlen;
-
-		optlen = ((uint16_t)(ptr[1])) << 3;
-		if (optlen == 0)
-			break; /* invalid length */
-
-		if (len < optlen) /* length > remaining bytes */
-			break;
-		len -= optlen;
-
-
-		/* skips unrecognized option */
-		if (ptr[0] != ND_OPT_TARGET_LINKADDR)
-		{
-			ptr += optlen;
-			continue;
-		}
-
-		/* Found! displays link-layer address */
-		ptr += 2;
-		optlen -= 2;
-		if (verbose)
-			fputs ("Target link-layer address: ", stdout);
-
-		printmacaddress (ptr, optlen);
-		return 0;
-	}
-
-	return -1;
-}
-static ssize_t
-recvfromLL (int fd, void *buf, size_t len, int flags, struct sockaddr_in6 *addr)
-{
-	char cbuf[CMSG_SPACE (sizeof (int))];
-	struct iovec iov =
-	{
-		.iov_base = buf,
-		.iov_len = len
-	};
-	struct msghdr hdr =
-	{
-		.msg_name = addr,
-		.msg_namelen = sizeof (*addr),
-		.msg_iov = &iov,
-		.msg_iovlen = 1,
-		.msg_control = cbuf,
-		.msg_controllen = sizeof (cbuf)
-	};
-
-	ssize_t val = recvmsg (fd, &hdr, flags);
-	if (val == -1)
-		return val;
-
-	/* ensures the hop limit is 255 */
-	struct cmsghdr *cmsg;
-	for (cmsg = CMSG_FIRSTHDR (&hdr);
-	     cmsg != NULL;
-	     cmsg = CMSG_NXTHDR (&hdr, cmsg))
-	{
-		if ((cmsg->cmsg_level == IPPROTO_IPV6)
-		 && (cmsg->cmsg_type == IPV6_HOPLIMIT))
-		{
-			if (255 != *(int *)CMSG_DATA (cmsg))
-			{
-				// pretend to be a spurious wake-up
-				errno = EAGAIN;
-				return -1;
-			}
-		}
-	}
-
-	return val;
-}
-
-
-static ssize_t
-recvadv (int fd, const struct sockaddr_in6 *tgt, unsigned wait_ms, unsigned flags)
-{
-	struct timespec now, end;
-	unsigned responses = 0;
-
-	/* computes deadline time */
-	mono_gettime (&now);
-	{
-		div_t d;
-		
-		d = div (wait_ms, 1000);
-		end.tv_sec = now.tv_sec + d.quot;
-		end.tv_nsec = now.tv_nsec + (d.rem * 1000000);
-	}
-
-	/* receive loop */
-	for (;;)
-	{
-		/* waits for reply until deadline */
-		ssize_t val = 0;
-		if (end.tv_sec >= now.tv_sec)
-		{
-			val = (end.tv_sec - now.tv_sec) * 1000
-				+ (int)((end.tv_nsec - now.tv_nsec) / 1000000);
-			if (val < 0)
-				val = 0;
-		}
-
-		val = poll (&(struct pollfd){ .fd = fd, .events = POLLIN }, 1, val);
-		if (val < 0)
-			break;
-
-		if (val == 0)
-			return responses;
-
-		/* receives an ICMPv6 packet */
-		// TODO: use interface MTU as buffer size
-		union
-		{
-			uint8_t  b[1460];
-			uint64_t align;
-		} buf;
-		struct sockaddr_in6 addr;
-
-		val = recvfromLL (fd, &buf, sizeof (buf), MSG_DONTWAIT, &addr);
-		if (val == -1)
-		{
-			if (errno != EAGAIN)
-				perror ("Receiving ICMPv6 packet");
-			continue;
-		}
-
-		/* ensures the response came through the right interface */
-		if (addr.sin6_scope_id
-		 && (addr.sin6_scope_id != tgt->sin6_scope_id))
-			continue;
-
-		if (parseadv (buf.b, val, tgt, (flags & NDISC_VERBOSE) != 0) == 0)
-		{
-			if (flags & NDISC_VERBOSE)
-			{
-				char str[INET6_ADDRSTRLEN];
-
-				if (inet_ntop (AF_INET6, &addr.sin6_addr, str,
-						sizeof (str)) != NULL)
-					printf (" from %s\n", str);
-			}
-
-			if (responses < INT_MAX)
-				responses++;
-
-			if (flags & NDISC_SINGLE)
-				return 1 /* = responses */;
-		}
-		mono_gettime (&now);
-	}
-
-	return -1; /* error */
-}
-
-bool
-ndisc (const char *name, const char *ifname, unsigned flags, unsigned retry, unsigned wait_ms)
-{
-	struct sockaddr_in6 tgt;
-
-	int fd = socket (PF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
-
-	if (fd == -1)
-	{
-		perror ("Raw IPv6 socket");
-		return false;
-	}
-
-	fcntl (fd, F_SETFD, FD_CLOEXEC);
-
-	/* set ICMPv6 filter */
-	{
-		struct icmp6_filter f;
-
-		ICMP6_FILTER_SETBLOCKALL (&f);
-		ICMP6_FILTER_SETPASS (nd_type_advert, &f);
-		setsockopt (fd, IPPROTO_ICMPV6, ICMP6_FILTER, &f, sizeof (f));
-	}
-
-	setsockopt (fd, SOL_SOCKET, SO_DONTROUTE, &(int){ 1 }, sizeof (int));
-
-	/* sets Hop-by-hop limit to 255 */
-	sethoplimit (fd, 255);
-	setsockopt (fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT,
-	            &(int){ 1 }, sizeof (int));
-
-	/* resolves target's IPv6 address */
-	if (getipv6byname (name, ifname, (flags & NDISC_NUMERIC) ? 1 : 0, &tgt))
-		goto error;
-	else
-	{
-		char s[INET6_ADDRSTRLEN];
-
-		inet_ntop (AF_INET6, &tgt.sin6_addr, s, sizeof (s));
-		if (flags & NDISC_VERBOSE)
-			printf ("Soliciting %s (%s) on %s...\n", name, s, ifname);
-	}
-
-	{
-		solicit_packet packet;
-		struct sockaddr_in6 dst;
-		ssize_t plen;
-
-		memcpy (&dst, &tgt, sizeof (dst));
-		plen = buildsol (&packet, &dst, ifname);
-		if (plen == -1)
-			goto error;
-
-		while (retry > 0)
-		{
-			/* sends a Solitication */
-			if (sendto (fd, &packet, plen, 0,
-			            (const struct sockaddr *)&dst,
-			            sizeof (dst)) != plen)
-			{
-				//perror ("Sending ICMPv6 packet");
-				goto error;
-			}
-			retry--;
-	
-			/* receives an Advertisement */
-			ssize_t val = recvadv (fd, &tgt, wait_ms, flags);
-			if (val > 0)
-			{
-				close (fd);
-				return true;
-			}
-			else
-			if (val == 0)
-			{
-				if (flags & NDISC_VERBOSE)
-					puts ("Timed out.");
-			}
-			else
-				goto error;
-		}
-	}
-
-	close (fd);
-	if (flags & NDISC_VERBOSE)
-		puts ("No response.");
-	return false;
-
-error:
-	close (fd);
-	return false;
-}
-
diff --git a/questd/src/port.c b/questd/src/port.c
deleted file mode 100644
index 497ff64d24963d5f9b2395d42c2784132a28f17f..0000000000000000000000000000000000000000
--- a/questd/src/port.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * port -- collects port info for questd
- *
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * Author: sukru.senli@inteno.se
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#include "questd.h"
-#include <linux/if_bridge.h>
-#include <errno.h>
-
-#define CHUNK		128
-
-static long
-get_port_stat(char *dev, char *stat)
-{
-	FILE *in;
-	char cmnd[64];
-	char result[32];
-
-	sprintf(cmnd, "/sys/class/net/%s/statistics/%s", dev, stat);
-	if ((in = fopen(cmnd, "r"))) {
-		fgets(result, sizeof(result), in);
-		fclose(in);
-	}
-
-	return atoi(result);
-}
-
-void
-get_port_stats(Port *port)
-{
-	port->stat.rx_bytes = get_port_stat(port->device, "rx_bytes");
-	port->stat.rx_packets = get_port_stat(port->device, "rx_packets");
-	port->stat.rx_errors = get_port_stat(port->device, "rx_errors");
-	port->stat.tx_bytes = get_port_stat(port->device, "tx_bytes");
-	port->stat.tx_packets =get_port_stat(port->device, "tx_packets");
-	port->stat.tx_errors = get_port_stat(port->device, "tx_errors");
-}
-
-void
-get_port_name(Port *port)
-{
-	FILE *in;
-	char buf[32];
-	char cmnd[80];
-
-	sprintf(cmnd, ". /lib/network/config.sh && interfacename %s 2>/dev/null", port->device);
-	if (!(in = popen(cmnd, "r")))
-		exit(1);
-
-	fgets(buf, sizeof(buf), in);
-	pclose(in);
-	remove_newline(buf);
-	strcpy(port->name, buf);
-
-	memset(cmnd, '\0', sizeof(cmnd));
-	memset(buf, '\0', sizeof(buf));
-
-	if(!strncmp(port->device, "wl", 2)) {
-		sprintf(cmnd, "wlctl -i %s ssid | awk '{print$3}' | sed 's/\"//g' 2>/dev/null", port->device);
-		if (!(in = popen(cmnd, "r")))
-			exit(1);
-
-		fgets(buf, sizeof(buf), in);
-		pclose(in);
-		remove_newline(buf);
-		strcpy(port->ssid, buf);
-	}
-}
-
-void
-get_bridge_ports(char *bridge, char **ports)
-{
-	FILE *in;
-	char buf[64];
-	char cmnd[128];
-	
-	*ports = "";
-
-	sprintf(cmnd, "brctl showbr %s | awk '{print$NF}' | grep -v interfaces | tr '\n' ' '", bridge);
-	if (!(in = popen(cmnd, "r")))
-		exit(1);
-
-	fgets(buf, sizeof(buf), in);
-	pclose(in);
-	*ports = strdup(buf);
-}
-
-static int
-compare_fdbs(const void *_f0, const void *_f1)
-{
-	const struct fdb_entry *f0 = _f0;
-	const struct fdb_entry *f1 = _f1;
-
-	return memcmp(f0->mac_addr, f1->mac_addr, 6);
-}
-
-static inline void
-copy_fdb(struct fdb_entry *ent, const struct __fdb_entry *f)
-{
-	memcpy(ent->mac_addr, f->mac_addr, 6);
-	ent->port_no = f->port_no;
-	ent->is_local = f->is_local;
-}
-
-static int
-bridge_read_fdb(const char *bridge, struct fdb_entry *fdbs, unsigned long offset, int num)
-{
-	FILE *f;
-	int i, n;
-	struct __fdb_entry fe[num];
-	char path[256];
-	
-	snprintf(path, 256, "/sys/class/net/%s/brforward", bridge);
-	f = fopen(path, "r");
-	if (f) {
-		fseek(f, offset*sizeof(struct __fdb_entry), SEEK_SET);
-		n = fread(fe, sizeof(struct __fdb_entry), num, f);
-		fclose(f);
-	}
-
-	for (i = 0; i < n; i++) 
-		copy_fdb(fdbs+i, fe+i);
-
-	return n;
-}
-
-void
-get_clients_onport(char *bridge, int portno, char **macaddr)
-{
-	int i, n;
-	struct fdb_entry *fdb = NULL;
-	int offset = 0;
-	char tmpmac[2400];
-	char mac[24];
-	
-	*macaddr = "";
-
-	for(;;) {
-		fdb = realloc(fdb, (offset + CHUNK) * sizeof(struct fdb_entry));
-		if (!fdb) {
-			fprintf(stderr, "Out of memory\n");
-			return;
-		}
-			
-		n = bridge_read_fdb(bridge, fdb+offset, offset, CHUNK);
-		if (n == 0)
-			break;
-
-		if (n < 0) {
-			fprintf(stderr, "read of forward table failed: %s\n",
-				strerror(errno));
-			return;
-		}
-
-		offset += n;
-	}
-
-	qsort(fdb, offset, sizeof(struct fdb_entry), compare_fdbs);
-
-	for (i = 0; i < offset; i++) {
-		const struct fdb_entry *f = fdb + i;
-		if (f->port_no == portno && !f->is_local) {
-			sprintf(mac, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", f->mac_addr[0], f->mac_addr[1], f->mac_addr[2], f->mac_addr[3], f->mac_addr[4], f->mac_addr[5]);
-			strcat(tmpmac, " ");
-			strcat(tmpmac, mac);
-		}
-	}
-	*macaddr = strdup(tmpmac);
-
-	free(fdb);
-	memset(tmpmac, '\0', sizeof(tmpmac));
-}
diff --git a/questd/src/questd.c b/questd/src/questd.c
deleted file mode 100644
index 025d520a3581967c37edcc82c3f0bb08de0cdeff..0000000000000000000000000000000000000000
--- a/questd/src/questd.c
+++ /dev/null
@@ -1,2164 +0,0 @@
-/*
- * questd -- router info daemon for Inteno CPEs
- *
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * Author: sukru.senli@inteno.se
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#include <libubox/blobmsg.h>
-#include <libubox/uloop.h>
-#include <libubox/ustream.h>
-#include <libubox/utils.h>
-
-#include <libubus.h>
-
-#include "questd.h"
-
-#define DEFAULT_SLEEP	5000000
-
-static struct uci_context *uci_ctx;
-static struct uci_package *uci_network, *uci_wireless;
-static struct ubus_context *ctx = NULL;
-static struct blob_buf bb;
-static const char *ubus_path;
-
-static Radio radio[MAX_RADIO];
-static Wireless wireless[MAX_VIF];
-static Network network[MAX_NETWORK];
-static Detail details[MAX_CLIENT], details6[MAX_CLIENT];
-static Client clients[MAX_CLIENT];
-//static Client clients_old[MAX_CLIENT], clients_new[MAX_CLIENT];
-static Client6 clients6[MAX_CLIENT];
-static Sta stas[MAX_CLIENT];
-static Router router;
-static Memory memory;
-static Key keys;
-static Spec spec;
-static USB usb[MAX_USB];
-static int clnum = 0;
-static int cl6num = 0;
-
-/* POLICIES */
-enum {
-	QUEST_NAME,
-	__QUEST_MAX,
-};
-
-static const struct blobmsg_policy quest_policy[__QUEST_MAX] = {
-	[QUEST_NAME] = { .name = "info", .type = BLOBMSG_TYPE_STRING },
-};
-
-enum {
-	NETWORK_NAME,
-	__NETWORK_MAX,
-};
-
-static const struct blobmsg_policy network_policy[__NETWORK_MAX] = {
-	[NETWORK_NAME] = { .name = "network", .type = BLOBMSG_TYPE_STRING },
-};
-
-enum {
-	RADIO_NAME,
-	VIF_NAME,
-	__WL_MAX,
-};
-
-static const struct blobmsg_policy wl_policy[__WL_MAX] = {
-	[RADIO_NAME] = { .name = "radio", .type = BLOBMSG_TYPE_STRING },
-	[VIF_NAME] = { .name = "vif", .type = BLOBMSG_TYPE_STRING },
-};
-
-enum {
-	IP_ADDR,
-	MAC_ADDR,
-	__HOST_MAX,
-};
-
-static const struct blobmsg_policy host_policy[__HOST_MAX] = {
-	[IP_ADDR] = { .name = "ipaddr", .type = BLOBMSG_TYPE_STRING },
-	[MAC_ADDR] = { .name = "macaddr", .type = BLOBMSG_TYPE_STRING },
-};
-
-enum {
-	PIN,
-	__PIN_MAX,
-};
-
-
-static const struct blobmsg_policy pin_policy[__PIN_MAX] = {
-	[PIN] = { .name = "pin", .type = BLOBMSG_TYPE_STRING },
-};
-/* END POLICIES */
-
-pthread_t tid[1];
-static long sleep_time = DEFAULT_SLEEP;
-
-void recalc_sleep_time(bool calc, int toms)
-{
-	long dec = toms * 1000;
-	if (!calc)
-		sleep_time = DEFAULT_SLEEP;
-	else if(sleep_time >= dec)
-		sleep_time -= dec;
-}
-
-static struct uci_package *
-init_package(const char *config)
-{
-	struct uci_context *ctx = uci_ctx;
-	struct uci_package *p = NULL;
-
-	if (!ctx) {
-		ctx = uci_alloc_context();
-		uci_ctx = ctx;
-	} else {
-		p = uci_lookup_package(ctx, config);
-		if (p)
-			uci_unload(ctx, p);
-	}
-
-	if (uci_load(ctx, config, &p))
-		return NULL;
-
-	return p;
-}
-
-static void 
-system_fd_set_cloexec(int fd)
-{
-#ifdef FD_CLOEXEC
-	fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
-#endif
-}
-
-static bool
-wdev_already_there(const char *ifname, char *wdev)
-{
-	bool ret = false;
-	char *token;
-	char ifbuf[128];
-
-	strcpy(ifbuf, ifname);
-
-	token = strtok(ifbuf, " ");
-	while (token != NULL)
-	{
-		if(!strcmp(token, wdev)) {
-			ret = true;
-			break;
-		}
-		token = strtok (NULL, " ");
-	}
-
-	return ret;
-}
-
-static void
-get_wifs(char *netname, const char *ifname, char **wifs)
-{
-	struct uci_element *e;
-	const char *device = NULL;
-	const char *network = NULL;
-	char wdev[16];
-	char wrl[64];
-	const char *wdevs[2];		
-	int vif, wno;
-
-	wdevs[0] = "wl0";
-	wdevs[1] = "wl1";
-
-	*wifs = NULL;
-
-	memset(wrl, '\0', sizeof(wrl));
-	if((uci_wireless = init_package("wireless"))) {
-		for(wno = 0; wno <= 1; wno++) {
-			vif = 0;
-			uci_foreach_element(&uci_wireless->sections, e) {
-				struct uci_section *s = uci_to_section(e);
-
-				if (!strcmp(s->type, "wifi-iface")) {
-					device = uci_lookup_option_string(uci_ctx, s, "device");
-					if(!device || strcmp(device, wdevs[wno]))
-						continue;
-					network = uci_lookup_option_string(uci_ctx, s, "network");
-					if (network && device && !strcmp(network, netname)) {
-						if (vif > 0)
-							sprintf(wdev, "%s.%d", device, vif);
-						else
-							strcpy(wdev, device);
-
-						if(wdev_already_there(ifname, wdev))
-							continue;
-
-						strcat(wrl, " ");
-						strcat(wrl, wdev);
-						*wifs = strdup(wrl);
-					}
-					vif++;
-				}
-			}
-		}
-	}
-}
-
-static void
-load_networks()
-{
-	struct uci_element *e;
-	const char *is_lan = NULL;
-	const char *type = NULL;
-	const char *proto = NULL;
-	const char *ipaddr = NULL;
-	const char *netmask = NULL;
-	const char *ifname = NULL;
-	char *wifs;
-	int nno = 0;
-
-	memset(network, '\0', sizeof(network));
-
-	if((uci_network = init_package("network"))) {
-		uci_foreach_element(&uci_network->sections, e) {
-			struct uci_section *s = uci_to_section(e);
-
-			network[nno].exists = false;
-			network[nno].ports_populated = false;
-			if (!strcmp(s->type, "interface")) {
-				is_lan = uci_lookup_option_string(uci_ctx, s, "is_lan");
-				type = uci_lookup_option_string(uci_ctx, s, "type");
-				proto = uci_lookup_option_string(uci_ctx, s, "proto");
-				ipaddr = uci_lookup_option_string(uci_ctx, s, "ipaddr");
-				netmask = uci_lookup_option_string(uci_ctx, s, "netmask");
-				ifname = uci_lookup_option_string(uci_ctx, s, "ifname");
-				if(!(ifname))
-					ifname = "";
-				get_wifs(s->e.name, ifname, &wifs);
-				if ((ifname && strcmp(ifname, "lo")) || wifs) {
-					network[nno].exists = true;
-					if(is_lan && !strcmp(is_lan, "1"))
-						network[nno].is_lan = true;
-					network[nno].name = s->e.name;
-					(type) ? (network[nno].type = type) : (network[nno].type = "");
-					(proto) ? (network[nno].proto = proto) : (network[nno].proto = "");
-					if(proto && !strcmp(network[nno].proto, "static")) {
-						(ipaddr) ? (network[nno].ipaddr = ipaddr) : (network[nno].ipaddr = "");
-						(netmask) ? (network[nno].netmask = netmask) : (network[nno].netmask = "");
-					}
-					if(wifs)
-						sprintf(network[nno].ifname, "%s%s", ifname, wifs);
-					else
-						strcpy(network[nno].ifname, ifname);
-					nno++;
-				}
-			}
-		}
-	}
-}
-
-static void
-load_wireless()
-{
-	struct uci_element *e;
-	const char *device = NULL;
-	const char *network = NULL;
-	const char *ssid = NULL;
-	char *token;
-	char wdev[16];
-	int rno = 0;
-	int wno = 0;
-	int chn;
-	int vif;
-	int vif0 = 0;
-	int vif1 = 0;
-
-	memset(wireless, '\0', sizeof(wireless));
-	memset(radio, '\0', sizeof(radio));
-
-	if((uci_wireless = init_package("wireless"))) {
-		uci_foreach_element(&uci_wireless->sections, e) {
-			struct uci_section *s = uci_to_section(e);
-
-			if (!strcmp(s->type, "wifi-iface")) {
-				device = uci_lookup_option_string(uci_ctx, s, "device");
-				network = uci_lookup_option_string(uci_ctx, s, "network");
-				ssid = uci_lookup_option_string(uci_ctx, s, "ssid");
-				if (device) {
-					wireless[wno].device = device;
-					usleep(10000);
-					wireless[wno].noise = atoi(chrCmd("wlctl -i %s noise", wireless[wno].device));
-					(network) ? (wireless[wno].network = network) : (wireless[wno].network = "");
-					(ssid) ? (wireless[wno].ssid = ssid) : (wireless[wno].ssid = "");
-					if (!strcmp(device, "wl0")) {
-						vif = vif0;
-						vif0++;
-					} else {
-						vif = vif1;
-						vif1++;
-					}
-					if (vif > 0)
-						sprintf(wdev, "%s.%d", device, vif);
-					else
-						strcpy(wdev, device);
-
-					wireless[wno].vif = strdup(wdev);
-
-					wno++;
-				}
-			} else if (!strcmp(s->type, "wifi-device")) {
-				radio[rno].name = s->e.name;
-				if(!(radio[rno].band = uci_lookup_option_string(uci_ctx, s, "band")))
-					radio[rno].band = "b";
-				radio[rno].frequency = !strcmp(radio[rno].band, "a") ? 5 : 2;
-				usleep(10000);
-				runCmd("wlctl -i %s band %s", radio[rno].name, radio[rno].band);
-				usleep(10000);
-				radio[rno].pcid = chrCmd("wlctl -i %s revinfo | awk 'FNR == 2 {print}' | cut -d'x' -f2", radio[rno].name);
-				radio[rno].is_ac = false;
-				if (radio[rno].pcid && atoi(chrCmd("db -q get hw.%s.is_ac", radio[rno].pcid)) == 1)
-					radio[rno].is_ac = true;
-
-				if(radio[rno].frequency == 2) {
-					radio[rno].hwmodes[0] = "11b";
-					radio[rno].hwmodes[1] = "11g";
-					radio[rno].hwmodes[2] = "11bg";
-					radio[rno].hwmodes[3] = "11n";
-					radio[rno].bwcaps[0] = 20;
-					radio[rno].bwcaps[1] = 40;
-					radio[rno].bwcaps[2] = '\0';
-				} else if (radio[rno].frequency == 5) {
-					radio[rno].hwmodes[0] = "11a";
-					radio[rno].hwmodes[1] = "11n";
-					radio[rno].hwmodes[2] = '\0';
-					radio[rno].hwmodes[3] = '\0';
-					radio[rno].bwcaps[0] = 20;
-					radio[rno].bwcaps[1] = 40;
-					radio[rno].bwcaps[2] = 80;
-					radio[rno].bwcaps[3] = '\0';
-					if (radio[rno].is_ac)
-						radio[rno].hwmodes[2] = "11ac";
-				}
-
-				chn = 0;
-				usleep(10000);
-				token = strtok(chrCmd("wlctl -i %s channels", radio[rno].name), " ");
-				while (token != NULL)
-				{
-					radio[rno].channels[chn] = atoi(token);
-					if (radio[rno].channels[chn] > 48)
-						break;
-					token = strtok (NULL, " ");
-					chn++;
-				}
-				radio[rno].channels[chn] = '\0';
-
-				rno++;
-			}
-		}
-	}
-}
-
-static void
-match_client_to_network(Network *lan, char *ipaddr, bool *local, char *net, char *dev)
-{
-	if(!lan->ipaddr || !lan->netmask)
-		return;
-
-	struct in_addr ip, mask, snet, host, rslt;
-
-	inet_pton(AF_INET, lan->ipaddr, &(ip.s_addr));
-	inet_pton(AF_INET, lan->netmask, &(mask.s_addr));
-	inet_pton(AF_INET, ipaddr, &(host.s_addr));
-
-	snet.s_addr = (ip.s_addr & mask.s_addr);
-	rslt.s_addr = (host.s_addr & mask.s_addr);
-
-	if((snet.s_addr ^ rslt.s_addr) == 0) {
-		*local = true;
-		snprintf(net, 32, lan->name);
-		if (lan->type && !strcmp(lan->type, "bridge"))
-			snprintf(dev, 32, "br-%s", lan->name);
-		else
-			snprintf(dev, 32, lan->ifname);
-	}
-}
-
-static void
-handle_client(Client *clnt)
-{
-	int ip[4];
-	int netno;
-
-	clnt->local = false;
-	if (sscanf(clnt->ipaddr, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]) == 4) {
-		for (netno=0; network[netno].exists; netno++) {
-			if (network[netno].is_lan) {
-				match_client_to_network(&network[netno], clnt->ipaddr, &clnt->local, clnt->network, clnt->device);
-				if (clnt->local)
-					break;
-			}
-		}
-	}
-}
-
-static void
-wireless_assoclist()
-{
-	FILE *assoclist;
-	char cmnd[64];
-	char line[64];
-	int i = 0;
-	int j = 0;
-	int rssi = 0;
-
-	memset(stas, '\0', sizeof(stas));
-
-	for (i = 0; wireless[i].device; i++) {
-		if (wireless[i].noise > -60) {
-			usleep(10000);
-			wireless[i].noise = atoi(chrCmd("wlctl -i %s noise", wireless[i].device));
-		}
-		usleep(10000);
-		sprintf(cmnd, "wlctl -i %s assoclist", wireless[i].vif);
-		if ((assoclist = popen(cmnd, "r"))) {
-			while(fgets(line, sizeof(line), assoclist) != NULL)
-			{
-				remove_newline(line);
-				stas[j].exists = false;
-				if (sscanf(line, "assoclist %s", stas[j].macaddr) == 1) {
-					stas[j].exists = true;
-					strcpy(stas[j].wdev, wireless[i].vif);
-					usleep(10000);
-					rssi = atoi(chrCmd("wlctl -i %s rssi %s", wireless[i].vif, stas[j].macaddr));
-					stas[j].snr = rssi - wireless[i].noise;
-					j++;
-				}
-			}
-			pclose(assoclist);
-		}
-	}
-}
-
-static void
-wireless_details(Client *clnt, Detail *dtl)
-{
-	FILE *stainfo;
-	char cmnd[64];
-	char line[128];
-	int i = 0;
-	int tmp;
-	int noise;
-
-	sprintf(cmnd, "wlctl -i %s sta_info %s 2>/dev/null", clnt->wdev, clnt->macaddr);
-	if ((stainfo = popen(cmnd, "r"))) {
-		while(fgets(line, sizeof(line), stainfo) != NULL)
-		{
-			remove_newline(line);
-			sscanf(line, "\t idle %d seconds", &(dtl->idle));
-			sscanf(line, "\t in network %d seconds", &(dtl->in_network));
-			sscanf(line, "\t tx total bytes: %ld\n", &(dtl->tx_bytes));
-			sscanf(line, "\t rx data bytes: %ld", &(dtl->rx_bytes));
-			sscanf(line, "\t rate of last tx pkt: %d kbps - %d kbps", &tmp, &(dtl->tx_rate));
-			if (dtl->tx_rate < 0) dtl->tx_rate = tmp;
-			sscanf(line, "\t rate of last rx pkt: %d kbps", &(dtl->rx_rate));
-		}
-		pclose(stainfo);
-	}
-
-	sprintf(cmnd, "wlctl -i %s noise", clnt->wdev);
-	if ((stainfo = popen(cmnd, "r"))) {
-		fgets(line, sizeof(line), stainfo);
-		remove_newline(line);
-		noise = atoi(line);
-		pclose(stainfo);
-	}
-
-	sprintf(cmnd, "wlctl -i %s rssi %s", clnt->wdev, clnt->macaddr);
-	if ((stainfo = popen(cmnd, "r"))) {
-		fgets(line, sizeof(line), stainfo);
-		remove_newline(line);
-		dtl->snr = atoi(line) - noise;
-		pclose(stainfo);
-	}
-}
-
-static bool
-wireless_sta(Client *clnt, Detail *dtl)
-{
-	bool there = false;
-	int i = 0;
-
-	while(stas[i].exists) {
-		if (!strcasecmp(stas[i].macaddr, clnt->macaddr)) {
-			there = true;
-			strncpy(clnt->wdev, stas[i].wdev, sizeof(clnt->wdev));
-			dtl->snr = stas[i].snr;
-			break;
-		}
-		i++;
-	}
-	return there;
-}
-
-static bool
-wireless_sta6(Client6 *clnt, Detail *dtl)
-{
-	bool there = false;
-	int i = 0;
-
-	while(stas[i].exists) {
-		if (!strcasecmp(stas[i].macaddr, clnt->macaddr)) {
-			there = true;
-			strncpy(clnt->wdev, stas[i].wdev, sizeof(clnt->wdev));
-			dtl->snr = stas[i].snr;
-			break;
-		}
-		i++;
-	}
-	return there;
-}
-
-static int
-active_connections(char *ipaddr)
-{
-	FILE *f;
-	int i;
-	char *p, line[512];
-	int connum = 0;
-
-	if ((f = fopen("/proc/net/nf_conntrack", "r")) != NULL)
-	{
-		while (fgets(line, sizeof(line) - 1, f))
-		{
-			for (i = 0, p = strtok(line, " "); p; i++, p = strtok(NULL, " "))
-			{
-				if (i == 6 && !strcmp(p+4, ipaddr))
-					connum++;
-			}
-		}
-
-		fclose(f);
-	}
-
-	return connum;
-}
-
-static void
-ipv4_clients()
-{
-	FILE *leases, *arpt;
-	char line[256];
-	int cno = 0;
-	int lno = 0;
-	int conn = 0;
-	int hw;
-	int flag;
-	char mask[256];
-	int i;
-	bool there;
-	int toms = 1000;
-
-	//memset(clients_new, '\0', sizeof(clients));
-
-	if ((leases = fopen("/var/dhcp.leases", "r"))) {
-		while(fgets(line, sizeof(line), leases) != NULL)
-		{
-			remove_newline(line);
-			clients[cno].exists = false;
-			clients[cno].wireless = false;
-			memset(clients[cno].hostname, '\0', sizeof(clients[cno].hostname));
-			if (sscanf(line, "%s %s %s %s %s", clients[cno].leaseno, clients[cno].macaddr, clients[cno].ipaddr, clients[cno].hostname, mask) == 5) {
-				clients[cno].exists = true;
-				clients[cno].dhcp = true;
-				handle_client(&clients[cno]);
-				if((clients[cno].connected = wireless_sta(&clients[cno], &details[cno]))) {
-					clients[cno].wireless = true;
-					wireless_details(&clients[cno], &details[cno]);
-				}
-				else if(!(clients[cno].connected = arping(clients[cno].ipaddr, clients[cno].device, toms)))
-					recalc_sleep_time(true, toms);
-
-				if (clients[cno].connected)
-					conn++;
-					//details[cno].connum = active_connections(clients[cno].ipaddr);
-
-				cno++;
-			}
-		}
-		fclose(leases);
-	}
-
-	if ((arpt = fopen("/proc/net/arp", "r"))) {
-		while(fgets(line, sizeof(line), arpt) != NULL)
-		{
-			remove_newline(line);
-			there = false;
-			clients[cno].exists = false;
-			clients[cno].wireless = false;
-			memset(clients[cno].hostname, '\0', sizeof(clients[cno].hostname));
-			if ((lno > 0) && sscanf(line, "%s 0x%d 0x%d %s %s %s", clients[cno].ipaddr, &hw, &flag, clients[cno].macaddr, mask, clients[cno].device)) {
-				for (i=0; i < cno; i++) {
-					if (!strcmp(clients[cno].macaddr, clients[i].macaddr)) {
-						if (clients[i].connected) {
-							there = true;
-							break;
-						} else {
-							strcpy(clients[cno].hostname, clients[i].hostname);
-						}
-					}
-					if (!strcmp(clients[cno].ipaddr, clients[i].ipaddr)) {
-						there = true;
-						break;
-					}
-				}
-				if (!there) {
-					handle_client(&clients[cno]);
-					if(clients[cno].local) {
-						clients[cno].exists = true;
-						clients[cno].dhcp = false;
-						if((clients[cno].connected = wireless_sta(&clients[cno], &details[cno]))) {
-							clients[cno].wireless = true;
-							wireless_details(&clients[cno], &details[cno]);
-						} else if(!(clients[cno].connected = arping(clients[cno].ipaddr, clients[cno].device, toms)))
-							recalc_sleep_time(true, toms);
-
-						if (clients[cno].connected)
-							conn++;
-							//details[cno].connum = active_connections(clients[cno].ipaddr);
-						cno++;
-					}
-				}
-			}
-			lno++;
-		}
-		fclose(arpt);
-	}
-
-	if (clnum != conn)
-		system("ubus send client");
-	clnum = conn;
-
-/*	memcpy(&clients_new, &clients, sizeof(clients));*/
-/*	if(memcmp(&clients_new, &clients_old, sizeof(clients)))*/
-/*		system("ubus send client");*/
-/*	memcpy(&clients_old, &clients_new, sizeof(clients));*/
-}
-
-static void
-ipv6_clients()
-{
-	FILE *hosts6;
-	char line[512];
-	int cno = 0;
-	int conn = 0;
-	int iaid, ts, id, length;
-	int toms = 500;
-
-	if ((hosts6 = fopen("/tmp/hosts/odhcpd", "r"))) {
-		while(fgets(line, sizeof(line), hosts6) != NULL)
-		{
-			remove_newline(line);
-			clients6[cno].exists = false;
-			clients6[cno].wireless = false;
-			memset(clients6[cno].hostname, '\0', sizeof(clients[cno].hostname));
-			if (sscanf(line, "# %s %s %x %s %d %x %d %s", clients6[cno].device, clients6[cno].duid, &iaid, clients6[cno].hostname, &ts, &id, &length, clients6[cno].ip6addr)) {
-				clients6[cno].exists = true;
-				clear_macaddr();
-				if((clients6[cno].connected = ndisc (clients6[cno].hostname, clients6[cno].device, 0x8, 1, toms))) {
-					sprintf(clients6[cno].macaddr, get_macaddr());
-					if (wireless_sta6(&clients6[cno], &details6[cno])) {
-						clients6[cno].wireless = true;
-						//wireless_details(&clients6[cno], &details6[cno]);
-					}
-				} else
-					recalc_sleep_time(true, toms);
-
-				if (clients6[cno].connected)
-					conn++;
-
-				cno++;
-			}
-		}
-		fclose(hosts6);
-	}
-
-	if (cl6num != conn)
-		system("ubus send client6");
-	cl6num = conn;
-}
-
-static void
-populate_clients()
-{
-	wireless_assoclist();
-	ipv4_clients();
-	ipv6_clients();
-}
-
-static void
-populate_ports(Network *network)
-{
-	char bridge[32];
-	char *macaddr;
-	char *theports;
-	char *prt, *mac;
-	int i = 1;
-	int j, k, l;
-	Port *port = (Port*)&network->port;
-	
-	sprintf(bridge, "br-%s", network->name);
-
-	if (network->ports_populated)
-		goto get_clients;
-
-	get_bridge_ports(bridge, &theports);
-	memset(port, '\0', sizeof(Port));
-
-	prt = strtok(theports, " ");
-	while (prt != NULL)
-	{
-		strcpy(port[i].device, prt);
-		get_port_name(&port[i]);
-		prt = strtok (NULL, " ");
-		i++;
-	}
-	
-	network->ports_populated = true;
-		
-get_clients:	
-	for(i=1; strlen(port[i].device)>2; i++)
-	{				
-		memset(&port[i].stat, '\0', sizeof(Statistic));
-		for (j=0; port[i].client[j].exists; j++) {
-			memset(&port[i].client[j], '\0', sizeof(Client));
-		}
-		
-		get_port_stats(&port[i]);
-		get_clients_onport(bridge, i, &macaddr);
-
-		l = 0;
-		if(network->is_lan) {
-			for (k=0; clients[k].exists; k++) {
-				if (strstr(macaddr, clients[k].macaddr) && clients[k].connected) {
-					port[i].client[l] = clients[k];
-					l++;
-				}
-			}
-		} else {
-			mac = strtok(macaddr, " ");
-			while (mac != NULL)
-			{
-				port[i].client[l].exists = true;
-				strcpy(port[i].client[l].macaddr, mac);
-				mac = strtok (NULL, " ");
-				l++;
-			}	
-		}
-	}
-}
-
-static void
-router_dump_specs(struct blob_buf *b, bool table)
-{
-	void *t;
-
-	if (table) t = blobmsg_open_table(b, "specs");
-	blobmsg_add_u8(b, "wifi", spec.wifi);
-	blobmsg_add_u8(b, "adsl", spec.adsl);
-	blobmsg_add_u8(b, "vdsl", spec.vdsl);
-	blobmsg_add_u8(b, "voice", spec.voice);
-	blobmsg_add_u32(b, "voice_ports", spec.vports);
-	blobmsg_add_u32(b, "eth_ports", spec.eports);
-	if (table) blobmsg_close_table(b, t);
-}
-
-static void
-router_dump_keys(struct blob_buf *b, bool table)
-{
-	void *t;
-
-	if (table) t = blobmsg_open_table(b, "keys");
-	blobmsg_add_string(b, "auth", keys.auth);
-	blobmsg_add_string(b, "des", keys.des);
-	blobmsg_add_string(b, "wpa", keys.wpa);
-	if (table) blobmsg_close_table(b, t);
-}
-
-static int uci_get_value(const char *config_path, const char *varname, char *output, size_t out_size){
-	FILE *fp; 
-	char cmd[256], buffer[256]; 
-	char *ptr = output; 
-	snprintf(cmd, sizeof(cmd), "uci -c %s get %s", config_path, varname); 
-	
-	if(!(fp = popen(cmd, "r"))) return 0;  
-	
-	int len; 
-	memset(buffer, 0, sizeof(buffer)); 
-	
-	while(len = fgets(buffer, sizeof(buffer), fp)){
-		if(len > 0) {
-			remove_newline(buffer); 
-			strcpy(ptr, buffer); 
-			ptr += len; 
-		}
-		if(len >= (out_size - (ptr - output))) break; 
-	} 
-	
-	pclose(fp); 
-	
-	return len; 
-}
-
-static void router_dump_boardinfo(struct blob_buf *b){
-	void *t, *l, *p;
-	static char ports[256], port_order[256], lan_ports[256], wan_ports[256], adsl_ports[256], vdsl_ports[256]; 
-	
-	t = blobmsg_open_table(b, "ethernet");
-	//p = blobmsg_open_array(b, "ports"); 
-	uci_get_value("/lib/db/config", "hw.board.ethernetPortNames", ports, sizeof(ports)); 
-	uci_get_value("/lib/db/config", "hw.board.ethernetPortOrder", port_order, sizeof(port_order)); 
-	uci_get_value("/lib/db/config", "hw.board.ethernetLanPorts", lan_ports, sizeof(lan_ports)); 
-	uci_get_value("/lib/db/config", "hw.board.ethernetWanPort", wan_ports, sizeof(wan_ports)); 
-	blobmsg_add_string(b, "port_names", ports);
-	blobmsg_add_string(b, "port_order", port_order);
-	blobmsg_add_string(b, "lan_ports", lan_ports);
-	blobmsg_add_string(b, "wan_port", wan_ports);
-	//blobmsg_close_array(b, p);
-	blobmsg_close_table(b, t);
-	
-	t = blobmsg_open_table(b, "adsl");
-	uci_get_value("/lib/db/config", "hw.board.adslWanPort", adsl_ports, sizeof(adsl_ports)); 
-	blobmsg_add_string(b, "ports", adsl_ports);
-	blobmsg_close_table(b, t);
-	
-	t = blobmsg_open_table(b, "vdsl");
-	uci_get_value("/lib/db/config", "hw.board.vdslWanPort", vdsl_ports, sizeof(vdsl_ports)); 
-	blobmsg_add_string(b, "ports", vdsl_ports);
-	blobmsg_close_table(b, t);
-}
-
-static int
-quest_board_info(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	blob_buf_init(&bb, 0);
-	router_dump_boardinfo(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static void
-router_dump_system_info(struct blob_buf *b, bool table)
-{
-	void *t;
-
-	if (table) t = blobmsg_open_table(b, "system");
-	blobmsg_add_string(b, "name", router.name);
-	blobmsg_add_string(b, "hardware", router.hardware);
-	blobmsg_add_string(b, "model", router.model);
-	blobmsg_add_string(b, "boardid", router.boardid);
-	blobmsg_add_string(b, "firmware", router.firmware);
-	blobmsg_add_string(b, "brcmver", router.brcmver);
-	blobmsg_add_string(b, "filesystem", router.filesystem);
-	blobmsg_add_string(b, "socmod", router.socmod);
-	blobmsg_add_string(b, "socrev", router.socrev);
-	blobmsg_add_string(b, "cfever", router.cfever);
-	blobmsg_add_string(b, "kernel", router.kernel);
-	blobmsg_add_string(b, "basemac", router.basemac);
-	blobmsg_add_string(b, "serialno", router.serialno);
-	blobmsg_add_string(b, "uptime", router.uptime);
-	blobmsg_add_u32(b, "procs", router.procs);
-	blobmsg_add_u32(b, "cpu_per", router.cpu);
-	if (table) blobmsg_close_table(b, t);
-}
-
-static void
-router_dump_memory_info(struct blob_buf *b, bool table)
-{
-	void *t;
-
-	if (table) t = blobmsg_open_table(b, "memoryKB");
-	blobmsg_add_u64(b, "total", memory.total);
-	blobmsg_add_u64(b, "used", memory.used);
-	blobmsg_add_u64(b, "free", memory.free);
-	blobmsg_add_u64(b, "shared", memory.shared);
-	blobmsg_add_u64(b, "buffers", memory.buffers);
-	if (table) blobmsg_close_table(b, t);
-}
-
-static void
-router_dump_networks(struct blob_buf *b)
-{
-	void *t;
-	int i;
-
-	for (i = 0; i < MAX_NETWORK; i++) {
-		if (!network[i].exists)
-			break;
-		t = blobmsg_open_table(b, network[i].name);
-		blobmsg_add_u8(b, "is_lan", network[i].is_lan);
-		blobmsg_add_string(b, "type", network[i].type);
-		blobmsg_add_string(b, "proto", network[i].proto);
-		if (!strcmp(network[i].proto, "static")) {
-			blobmsg_add_string(b, "ipaddr", network[i].ipaddr);
-			blobmsg_add_string(b, "netmask", network[i].netmask);
-		}
-		blobmsg_add_string(b, "ifname", network[i].ifname);
-		blobmsg_close_table(b, t);
-	}
-}
-
-static void
-router_dump_clients(struct blob_buf *b)
-{
-	void *t;
-	char clientnum[10];
-	int num = 1;
-	int i;
-
-	for (i = 0; i < MAX_CLIENT; i++) {
-		if (!clients[i].exists)
-			break;
-		sprintf(clientnum, "client-%d", num);
-		t = blobmsg_open_table(b, clientnum);
-		blobmsg_add_string(b, "hostname", clients[i].hostname);
-		blobmsg_add_string(b, "ipaddr", clients[i].ipaddr);
-		blobmsg_add_string(b, "macaddr", clients[i].macaddr);
-		blobmsg_add_string(b, "network", clients[i].network);
-		blobmsg_add_string(b, "device", clients[i].device);
-		blobmsg_add_u8(b, "dhcp", clients[i].dhcp);
-		blobmsg_add_u8(b, "connected", clients[i].connected);
-		blobmsg_add_u8(b, "wireless", clients[i].wireless);
-		/*if(clients[i].connected)
-			blobmsg_add_u32(b, "active_cons", active_connections(clients[i].ipaddr));*/
-		if(clients[i].wireless) {
-			blobmsg_add_string(b, "wdev", clients[i].wdev);
-			blobmsg_add_u32(b, "idle", details[i].idle);
-			blobmsg_add_u32(b, "in_network", details[i].in_network);
-			blobmsg_add_u32(b, "snr", details[i].snr);
-			blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes);
-			blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes);
-			blobmsg_add_u32(b, "tx_rate", details[i].tx_rate);
-			blobmsg_add_u32(b, "rx_rate", details[i].rx_rate);
-		}
-		blobmsg_close_table(b, t);
-		num++;
-	}
-}
-
-static void
-router_dump_connected_clients(struct blob_buf *b)
-{
-	void *t;
-	char clientnum[10];
-	int num = 1;
-	int i;
-
-	for (i = 0; i < MAX_CLIENT; i++) {
-		if (!clients[i].exists)
-			break;
-		if (!(clients[i].connected))
-			continue;
-		sprintf(clientnum, "client-%d", num);
-		t = blobmsg_open_table(b, clientnum);
-		blobmsg_add_string(b, "hostname", clients[i].hostname);
-		blobmsg_add_string(b, "ipaddr", clients[i].ipaddr);
-		blobmsg_add_string(b, "macaddr", clients[i].macaddr);
-		blobmsg_add_string(b, "network", clients[i].network);
-		blobmsg_add_string(b, "device", clients[i].device);
-		blobmsg_add_u8(b, "dhcp", clients[i].dhcp);
-		blobmsg_add_u8(b, "wireless", clients[i].wireless);
-		blobmsg_add_u32(b, "active_cons", details[i].connum);
-		if(clients[i].wireless) {
-			blobmsg_add_string(b, "wdev", clients[i].wdev);
-			blobmsg_add_u32(b, "idle", details[i].idle);
-			blobmsg_add_u32(b, "in_network", details[i].in_network);
-			blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes);
-			blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes);
-			blobmsg_add_u32(b, "tx_rate", details[i].tx_rate);
-			blobmsg_add_u32(b, "rx_rate", details[i].rx_rate);
-		}
-		blobmsg_close_table(b, t);
-		num++;
-	}
-}
-
-static void
-router_dump_network_clients(struct blob_buf *b, char *net)
-{
-	void *t;
-	char clientnum[10];
-	int num = 1;
-	int i;
-
-	for (i = 0; i < MAX_CLIENT; i++) {
-		if (!clients[i].exists)
-			break;
-		if (strcmp(clients[i].network, net))
-			continue;
-		sprintf(clientnum, "client-%d", num);
-		t = blobmsg_open_table(b, clientnum);
-		blobmsg_add_string(b, "hostname", clients[i].hostname);
-		blobmsg_add_string(b, "ipaddr", clients[i].ipaddr);
-		blobmsg_add_string(b, "macaddr", clients[i].macaddr);
-		blobmsg_add_string(b, "network", clients[i].network);
-		blobmsg_add_string(b, "device", clients[i].device);
-		blobmsg_add_u8(b, "dhcp", clients[i].dhcp);
-		blobmsg_add_u8(b, "connected", clients[i].connected);
-		blobmsg_add_u8(b, "wireless", clients[i].wireless);
-		if(clients[i].connected)
-			blobmsg_add_u32(b, "active_cons", details[i].connum);
-		if(clients[i].wireless) {
-			blobmsg_add_string(b, "wdev", clients[i].wdev);
-			blobmsg_add_u32(b, "idle", details[i].idle);
-			blobmsg_add_u32(b, "in_network", details[i].in_network);
-			blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes);
-			blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes);
-			blobmsg_add_u32(b, "tx_rate", details[i].tx_rate);
-			blobmsg_add_u32(b, "rx_rate", details[i].rx_rate);
-		}
-		blobmsg_close_table(b, t);
-		num++;
-	}
-}
-
-static void
-router_dump_connected_clients6(struct blob_buf *b)
-{
-	void *t;
-	char clientnum[10];
-	int num = 1;
-	int i;
-
-	for (i = 0; i < MAX_CLIENT; i++) {
-		if (!clients6[i].exists)
-			break;
-		if (!(clients6[i].connected))
-			continue;
-		sprintf(clientnum, "client-%d", num);
-		t = blobmsg_open_table(b, clientnum);
-		blobmsg_add_string(b, "hostname", clients6[i].hostname);
-		blobmsg_add_string(b, "ip6addr", clients6[i].ip6addr);
-		blobmsg_add_string(b, "macaddr", clients6[i].macaddr);
-		blobmsg_add_string(b, "duid", clients6[i].duid);
-		blobmsg_add_string(b, "device", clients6[i].device);
-		blobmsg_add_u8(b, "wireless", clients6[i].wireless);
-		if(clients6[i].wireless) {
-			blobmsg_add_string(b, "wdev", clients6[i].wdev);
-		}
-		blobmsg_close_table(b, t);
-		num++;
-	}
-}
-
-static void
-router_dump_clients6(struct blob_buf *b)
-{
-	void *t;
-	char clientnum[10];
-	int num = 1;
-	int i;
-
-	for (i = 0; i < MAX_CLIENT; i++) {
-		if (!clients6[i].exists)
-			break;
-		sprintf(clientnum, "client-%d", num);
-		t = blobmsg_open_table(b, clientnum);
-		blobmsg_add_string(b, "hostname", clients6[i].hostname);
-		blobmsg_add_string(b, "ip6addr", clients6[i].ip6addr);
-		blobmsg_add_string(b, "macaddr", clients6[i].macaddr);
-		blobmsg_add_string(b, "duid", clients6[i].duid);
-		blobmsg_add_string(b, "device", clients6[i].device);
-		blobmsg_add_u8(b, "connected", clients6[i].connected);
-		blobmsg_add_u8(b, "wireless", clients6[i].wireless);
-		if(clients6[i].wireless) {
-			blobmsg_add_string(b, "wdev", clients6[i].wdev);
-		}
-		blobmsg_close_table(b, t);
-		num++;
-	}
-}
-
-static void
-router_dump_stas(struct blob_buf *b)
-{
-	void *t;
-	char stanum[8];
-	int num = 1;
-	int i;
-
-	for (i = 0; i < MAX_CLIENT; i++) {
-		if (!clients[i].exists)
-			break;
-		if (!(clients[i].wireless))
-			continue;
-		sprintf(stanum, "sta-%d", num);
-		t = blobmsg_open_table(b, stanum);
-		blobmsg_add_string(b, "hostname", clients[i].hostname);
-		blobmsg_add_string(b, "ipaddr", clients[i].ipaddr);
-		blobmsg_add_string(b, "macaddr", clients[i].macaddr);
-		blobmsg_add_string(b, "network", clients[i].network);
-		blobmsg_add_u8(b, "dhcp", clients[i].dhcp);
-		if(strstr(clients[i].device, "br-"))
-			blobmsg_add_string(b, "bridge", clients[i].device);
-		blobmsg_add_string(b, "wdev", clients[i].wdev);
-		blobmsg_add_u32(b, "active_cons", details[i].connum);
-		blobmsg_add_u32(b, "idle", details[i].idle);
-		blobmsg_add_u32(b, "in_network", details[i].in_network);
-		blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes);
-		blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes);
-		blobmsg_add_u32(b, "tx_rate", details[i].tx_rate);
-		blobmsg_add_u32(b, "rx_rate", details[i].rx_rate);
-		blobmsg_close_table(b, t);
-		num++;
-	}
-}
-
-static void
-router_dump_wireless_stas(struct blob_buf *b, char *wname, bool vif)
-{
-	void *t;
-	char stanum[8];
-	char compare[8];
-	int num = 1;
-	int i;
-
-	for (i = 0; i < MAX_CLIENT; i++) {
-		if (!clients[i].exists)
-			break;
-		if(!(clients[i].wireless))
-			continue;
-
-		memset(compare, '\0', sizeof(compare));
-		if (vif)
-			strcpy(compare, clients[i].wdev);
-		else
-			strncpy(compare, clients[i].wdev, 3);
-
-		if (strcmp(compare, wname))
-			continue;
-
-		sprintf(stanum, "sta-%d", num);
-		t = blobmsg_open_table(b, stanum);
-		blobmsg_add_string(b, "hostname", clients[i].hostname);
-		blobmsg_add_string(b, "ipaddr", clients[i].ipaddr);
-		blobmsg_add_string(b, "macaddr", clients[i].macaddr);
-		blobmsg_add_string(b, "network", clients[i].network);
-		blobmsg_add_u8(b, "dhcp", clients[i].dhcp);
-		if(strstr(clients[i].device, "br-"))
-			blobmsg_add_string(b, "bridge", clients[i].device);
-		if(!vif)
-			blobmsg_add_string(b, "wdev", clients[i].wdev);
-		blobmsg_add_u32(b, "active_cons", details[i].connum);
-		blobmsg_add_u32(b, "idle", details[i].idle);
-		blobmsg_add_u32(b, "in_network", details[i].in_network);
-		blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes);
-		blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes);
-		blobmsg_add_u32(b, "tx_rate", details[i].tx_rate);
-		blobmsg_add_u32(b, "rx_rate", details[i].rx_rate);
-		blobmsg_close_table(b, t);
-		num++;
-	}
-}
-
-static void
-router_dump_usbs(struct blob_buf *b)
-{
-	void *t;
-	int uno = 0;
-	FILE *usbdevs;
-	char cmnd[64];
-	char line[16];
-
-	memset(usb, '\0', sizeof(usb));
-	sprintf(cmnd, "ls /sys/bus/usb/devices/ | grep -v ':' | grep -v 'usb'");
-	if ((usbdevs = popen(cmnd, "r"))) {
-		while(fgets(line, sizeof(line), usbdevs) != NULL)
-		{
-			remove_newline(line);
-			dump_usb_info(&usb[uno], line);
-			if(strlen(usb[uno].product) < 1)
-				continue;
-			t = blobmsg_open_table(b, usb[uno].name);
-			blobmsg_add_string(b, "product", usb[uno].product);
-			//blobmsg_add_string(b, "speed", usb[uno].speed);
-			if (usb[uno].maxchild && strcmp(usb[uno].maxchild, "0")) {
-				blobmsg_add_u32(b, "maxchild", atoi(usb[uno].maxchild));
-			}
-			else {
-				blobmsg_add_string(b, "vendor", usb[uno].vendor);
-				blobmsg_add_string(b, "serial", usb[uno].serial);
-				if(usb[uno].device) {
-					blobmsg_add_string(b, "device", usb[uno].device);
-					blobmsg_add_u64(b, "sizeMB", usb[uno].size);
-					blobmsg_add_string(b, "mntdir", usb[uno].mount);
-				}
-			}
-			blobmsg_close_table(b, t);
-			uno++;
-		}
-		pclose(usbdevs);
-	}
-}
-
-
-static void
-router_dump_ports(struct blob_buf *b, char *interface)
-{
-	void *t, *c, *h, *s;
-	int pno, i, j;
-	const char *ports[8];
-	bool found = false;
-
-	ports[0] = "LAN";
-	ports[1] = "LAN1";
-	ports[2] = "LAN2";
-	ports[3] = "LAN3";
-	ports[4] = "LAN4";
-	ports[5] = "GbE";
-	ports[6] = "WAN";
-	ports[7] = "WLAN";
-
-	Port *port;
-	
-	for (i = 0; i < MAX_NETWORK; i++) {
-		if (network[i].exists && !strcmp(network[i].name, interface)) {
-			populate_ports(&network[i]);
-			port = (Port*)&network[i].port;
-			found = true;
-			break;
-		}
-	}
-	
-	if (!found)
-		return;
-
-	for (pno=0; pno<=7; pno++) {
-		for (i = 1; strlen(port[i].name) > 2; i++) {
-			if(strcmp(port[i].name, ports[pno]))
-				continue;
-			if(!strncmp(port[i].device, "wl", 2) && strlen(port[i].ssid) > 2)
-				t = blobmsg_open_table(b, port[i].ssid);
-			else
-				t = blobmsg_open_table(b, port[i].name);
-			blobmsg_add_string(b, "device", port[i].device);
-			c = blobmsg_open_array(b, "hosts");
-			for(j=0; port[i].client[j].exists; j++) {
-				h = blobmsg_open_table(b, "NULL");
-				blobmsg_add_string(b, "hostname", port[i].client[j].hostname);
-				blobmsg_add_string(b, "ipaddr", port[i].client[j].ipaddr);
-				blobmsg_add_string(b, "macaddr", port[i].client[j].macaddr);
-				blobmsg_close_table(b, h);
-			}
-			blobmsg_close_array(b, c);
-			s = blobmsg_open_table(b, "statistics");
-			blobmsg_add_u64(b, "rx_packets", port[i].stat.rx_packets);
-			blobmsg_add_u64(b, "rx_bytes", port[i].stat.rx_bytes);
-			blobmsg_add_u64(b, "rx_errors", port[i].stat.rx_errors);				
-			blobmsg_add_u64(b, "tx_packets", port[i].stat.tx_packets);
-			blobmsg_add_u64(b, "tx_bytes", port[i].stat.tx_bytes);
-			blobmsg_add_u64(b, "tx_errors", port[i].stat.tx_errors);
-			blobmsg_close_table(b, s);
-			blobmsg_close_table(b, t);
-		}
-	}
-}
-
-static void
-network_dump_leases(struct blob_buf *b, char *leasenet)
-{
-	void *t;
-	char leasenum[16];
-	int i;
-
-	for (i = 0; i < MAX_CLIENT; i++) {
-		if (!clients[i].exists)
-			break;
-		if (clients[i].dhcp && !strcmp(clients[i].network, leasenet)) {
-			sprintf(leasenum, "lease-%d", i + 1);
-			t = blobmsg_open_table(b, leasenum);
-			blobmsg_add_string(b, "leaseno", clients[i].leaseno);
-			blobmsg_add_string(b, "hostname", clients[i].hostname);
-			blobmsg_add_string(b, "ipaddr", clients[i].ipaddr);
-			blobmsg_add_string(b, "macaddr", clients[i].macaddr);
-			blobmsg_add_string(b, "device", clients[i].device);
-			blobmsg_add_u8(b, "connected", clients[i].connected);
-			blobmsg_close_table(b, t);
-		}
-	}
-}
-
-static void
-host_dump_status(struct blob_buf *b, char *addr, bool byIP)
-{
-	int i;
-
-	if(byIP) {
-		for (i=0; clients[i].exists; i++)
-			if(!strcmp(clients[i].ipaddr, addr)) {
-				blobmsg_add_string(b, "hostname", clients[i].hostname);
-				blobmsg_add_string(b, "macaddr", clients[i].macaddr);
-				blobmsg_add_string(b, "network", clients[i].network);
-				blobmsg_add_string(b, "device", clients[i].device);
-				blobmsg_add_u8(b, "connected", clients[i].connected);
-				blobmsg_add_u8(b, "wireless", clients[i].wireless);
-				if(clients[i].connected)
-					blobmsg_add_u32(b, "active_cons", details[i].connum);
-				if(clients[i].wireless) {
-					blobmsg_add_string(b, "wdev", clients[i].wdev);
-					blobmsg_add_u32(b, "idle", details[i].idle);
-					blobmsg_add_u32(b, "in_network", details[i].in_network);
-					blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes);
-					blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes);
-					blobmsg_add_u32(b, "tx_rate", details[i].tx_rate);
-					blobmsg_add_u32(b, "rx_rate", details[i].rx_rate);
-				}
-				break;
-			}
-	}
-	else {
-		for (i=0; clients[i].exists; i++)
-			if(!strcasecmp(clients[i].macaddr, addr)) {
-				blobmsg_add_string(b, "hostname", clients[i].hostname);
-				blobmsg_add_string(b, "ipaddr", clients[i].ipaddr);
-				blobmsg_add_string(b, "network", clients[i].network);
-				blobmsg_add_string(b, "device", clients[i].device);
-				blobmsg_add_u8(b, "connected", clients[i].connected);
-				blobmsg_add_u8(b, "wireless", clients[i].wireless);
-				if(clients[i].connected)
-					blobmsg_add_u32(b, "active_cons", details[i].connum);
-				if(clients[i].wireless) {
-					blobmsg_add_string(b, "wdev", clients[i].wdev);
-					blobmsg_add_u32(b, "idle", details[i].idle);
-					blobmsg_add_u32(b, "in_network", details[i].in_network);
-					blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes);
-					blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes);
-					blobmsg_add_u32(b, "tx_rate", details[i].tx_rate);
-					blobmsg_add_u32(b, "rx_rate", details[i].rx_rate);
-				}
-				break;
-			}
-	}
-}
-
-/* ROUTER OBJECT */
-static int
-quest_router_specific(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[QUEST_NAME]) || (strcmp(blobmsg_data(tb[QUEST_NAME]), "system") && strcmp(blobmsg_data(tb[QUEST_NAME]), "memory")
-		&& strcmp(blobmsg_data(tb[QUEST_NAME]), "keys") && strcmp(blobmsg_data(tb[QUEST_NAME]), "specs")))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	blob_buf_init(&bb, 0);
-
-	if (!strcmp(blobmsg_data(tb[QUEST_NAME]), "system"))
-		router_dump_system_info(&bb, false);
-	else if (!strcmp(blobmsg_data(tb[QUEST_NAME]), "memory"))
-		router_dump_memory_info(&bb, false);
-	else if (!strcmp(blobmsg_data(tb[QUEST_NAME]), "keys"))
-		router_dump_keys(&bb, false);
-	else if (!strcmp(blobmsg_data(tb[QUEST_NAME]), "specs"))
-		router_dump_specs(&bb, false);
-
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_info(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	router_dump_system_info(&bb, true);
-	router_dump_memory_info(&bb, true);
-	router_dump_keys(&bb, true);
-	router_dump_specs(&bb, true);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_networks(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	router_dump_networks(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_clients(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	router_dump_clients(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_connected_clients(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	router_dump_connected_clients(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_network_clients(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__NETWORK_MAX];
-	bool nthere = false;
-	int i;
-
-	blobmsg_parse(network_policy, __NETWORK_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[NETWORK_NAME]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	for (i=0; network[i].is_lan; i++)
-		if(!strcmp(network[i].name, blobmsg_data(tb[NETWORK_NAME]))) {
-			nthere = true;
-			break;
-		}
-
-	if (!(nthere))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	blob_buf_init(&bb, 0);
-	router_dump_network_clients(&bb, blobmsg_data(tb[NETWORK_NAME]));
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_wl(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__WL_MAX];
-	char wldev[8];
-	bool nthere = false;
-	int i;
-
-	blobmsg_parse(wl_policy, __WL_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[RADIO_NAME]) && !(tb[VIF_NAME]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	if (tb[RADIO_NAME] && strchr(blobmsg_data(tb[RADIO_NAME]), '.'))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	memset(wldev, '\0', sizeof(wldev));
-	if (tb[VIF_NAME])
-		strcpy(wldev, blobmsg_data(tb[VIF_NAME]));
-	else
-		strcpy(wldev, blobmsg_data(tb[RADIO_NAME]));
-
-	for (i=0; wireless[i].device; i++)
-		if(!strcmp(wireless[i].vif, wldev)) {
-			nthere = true;
-			break;
-		}
-
-	if (!(nthere))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	void *t;
-	int freq = 2;
-	int bw = 20;
-	int channel;
-
-	const char *chanspec = strdup(chrCmd("wlctl -i %s chanspec | awk '{print$1}'", wldev));
-	const char *bssid = strdup(chrCmd("wl -i %s cur_etheraddr | awk '{print$2}'", wldev));
-	int isup = atoi(strdup(chrCmd("wlctl -i %s isup", wldev)));
-
-
-	if (strstr(chanspec, "/80") && sscanf(chanspec, "%d/80", &channel) == 1)
-		bw = 80;
-	else if ((strstr(chanspec, "u") || strstr(chanspec, "l")) &&
-			(sscanf(chanspec, "%dl", &channel) == 1 || sscanf(chanspec, "%du", &channel) == 1))
-		bw = 40;
-	else
-		channel = atoi(chanspec);
-
-	if (channel >= 36)
-		freq = 5;
-
-	blob_buf_init(&bb, 0);
-	blobmsg_add_string(&bb, "wldev", wldev);
-	blobmsg_add_u32(&bb, "radio", isup);
-	blobmsg_add_string(&bb, "bssid", bssid);
-	blobmsg_add_u32(&bb, "frequency", freq);
-	blobmsg_add_u32(&bb, "channel", channel);
-	blobmsg_add_u32(&bb, "bandwidth", bw);
-
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_connected_clients6(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	router_dump_connected_clients6(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-/*
-static int
-quest_router_igmp_table(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	igpm_rpc(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}*/
-
-static int
-quest_router_clients6(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	router_dump_clients6(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_stas(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	router_dump_stas(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_wireless_stas(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__WL_MAX];
-	char lookup[8];
-	bool nthere = false;
-	int i;
-
-	blobmsg_parse(wl_policy, __WL_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[RADIO_NAME]) && !(tb[VIF_NAME]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	if (tb[RADIO_NAME] && strchr(blobmsg_data(tb[RADIO_NAME]), '.'))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	memset(lookup, '\0', sizeof(lookup));
-	if (tb[VIF_NAME])
-		strcpy(lookup, blobmsg_data(tb[VIF_NAME]));
-	else
-		strcpy(lookup, blobmsg_data(tb[RADIO_NAME]));
-
-	for (i=0; wireless[i].device; i++)
-		if(!strcmp(wireless[i].vif, lookup)) {
-			nthere = true;
-			break;
-		}
-
-	if (!(nthere))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-
-	blob_buf_init(&bb, 0);
-	if (tb[RADIO_NAME])
-		router_dump_wireless_stas(&bb, blobmsg_data(tb[RADIO_NAME]), false);
-	else
-		router_dump_wireless_stas(&bb, blobmsg_data(tb[VIF_NAME]), true);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_usbs(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__QUEST_MAX];
-
-	blobmsg_parse(quest_policy, __QUEST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	blob_buf_init(&bb, 0);
-	router_dump_usbs(&bb);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_network_leases(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__NETWORK_MAX];
-	bool nthere = false;
-	int i;
-
-	blobmsg_parse(network_policy, __NETWORK_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[NETWORK_NAME]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	for (i=0; network[i].is_lan; i++)
-		if(!strcmp(network[i].name, blobmsg_data(tb[NETWORK_NAME])))
-			nthere = true;
-
-	if (!(nthere))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	blob_buf_init(&bb, 0);
-	network_dump_leases(&bb, blobmsg_data(tb[NETWORK_NAME]));
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_ports(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__NETWORK_MAX];
-	bool nthere = false;
-	int i;
-
-	blobmsg_parse(network_policy, __NETWORK_MAX, tb, blob_data(msg), blob_len(msg));
-	
-	if (!(tb[NETWORK_NAME]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-		
-	for (i=0; network[i].exists; i++) {
-		if(!strcmp(network[i].name, blobmsg_data(tb[NETWORK_NAME])))
-			if(!strcmp(network[i].type, "bridge")) {
-			nthere = true;
-			break;
-		}
-	}
-
-	if (!(nthere))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-	
-	blob_buf_init(&bb, 0);
-	router_dump_ports(&bb, blobmsg_data(tb[NETWORK_NAME]));
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_host_status(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__HOST_MAX];
-
-	blobmsg_parse(host_policy, __HOST_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[IP_ADDR]) && !(tb[MAC_ADDR]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	blob_buf_init(&bb, 0);
-	if (tb[IP_ADDR])
-		host_dump_status(&bb, blobmsg_data(tb[IP_ADDR]), true);
-	else
-		host_dump_status(&bb, blobmsg_data(tb[MAC_ADDR]), false);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-quest_router_radios(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	void *t, *c;
-	int i, j;
-
-	blob_buf_init(&bb, 0);
-
-	for (i = 0; i < MAX_RADIO; i++) {
-		if (!radio[i].name)
-			break;
-		t = blobmsg_open_table(&bb, radio[i].name);
-		blobmsg_add_string(&bb, "band", radio[i].band);
-		blobmsg_add_u32(&bb, "frequency", radio[i].frequency);
-		c = blobmsg_open_array(&bb, "hwmodes");
-		for(j=0; radio[i].hwmodes[j]; j++) {
-			blobmsg_add_string(&bb, "", radio[i].hwmodes[j]);
-		}
-		blobmsg_close_array(&bb, c);
-		c = blobmsg_open_array(&bb, "bwcaps");
-		for(j=0; radio[i].bwcaps[j]; j++) {
-			blobmsg_add_u32(&bb, "", radio[i].bwcaps[j]);
-		}
-		blobmsg_close_array(&bb, c);
-		c = blobmsg_open_array(&bb, "channels");
-		for(j=0; radio[i].channels[j]; j++) {
-			blobmsg_add_u32(&bb, "", radio[i].channels[j]);
-		}
-		blobmsg_close_array(&bb, c);
-		blobmsg_close_table(&bb, t);
-	}
-
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-
-static int
-quest_reload(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	dump_hostname(&router);
-	load_networks();
-	load_wireless();
-	return 0;
-}
-
-static struct ubus_method router_object_methods[] = {
-	UBUS_METHOD_NOARG("info", quest_router_info),
-	UBUS_METHOD_NOARG("boardinfo", quest_board_info), 
-	UBUS_METHOD("quest", quest_router_specific, quest_policy),
-	UBUS_METHOD_NOARG("networks", quest_router_networks),
-	UBUS_METHOD("wl", quest_router_wl, wl_policy),
-	UBUS_METHOD_NOARG("dslstats", dslstats_rpc), 
-	UBUS_METHOD("client", quest_router_network_clients, network_policy),
-	UBUS_METHOD_NOARG("clients", quest_router_clients),
-	UBUS_METHOD_NOARG("clients6", quest_router_clients6),
-	UBUS_METHOD_NOARG("connected", quest_router_connected_clients),
-	UBUS_METHOD_NOARG("connected6", quest_router_connected_clients6),
-	UBUS_METHOD_NOARG("igmptable", igmp_rpc),
-	UBUS_METHOD("sta", quest_router_wireless_stas, wl_policy),
-	UBUS_METHOD_NOARG("stas", quest_router_stas),
-	UBUS_METHOD("ports", quest_router_ports, network_policy),
-	UBUS_METHOD("leases", quest_network_leases, network_policy),
-	UBUS_METHOD("host", quest_host_status, host_policy),
-	UBUS_METHOD_NOARG("usb", quest_router_usbs),
-	UBUS_METHOD_NOARG("radios", quest_router_radios),
-	UBUS_METHOD_NOARG("reload", quest_reload),
-};
-
-static struct ubus_object_type router_object_type =
-	UBUS_OBJECT_TYPE("system", router_object_methods);
-
-static struct ubus_object router_object = {
-	.name = "router",
-	.type = &router_object_type,
-	.methods = router_object_methods,
-	.n_methods = ARRAY_SIZE(router_object_methods),
-};
-/* END OF ROUTER OBJECT */
-
-/* WPS OBJECT */
-/* JUCI does not use this object */
-
-static int
-wps_status(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	const char *status = "unknown";
-	int code = atoi(chrCmd("nvram get wps_proc_status"));
-
-	switch (code) {
-		case 0:
-			status = "init";
-			break;
-		case 1:
-			status = "processing";
-			break;
-		case 2:
-			status = "success";
-			break;
-		case 3:
-			status = "fail";
-			break;
-		case 4:
-			status = "timeout";
-			break;
-		case 7:
-			status = "msgdone";
-			break;
-		default:
-			break;
-	}
-
-	blob_buf_init(&bb, 0);
-	blobmsg_add_u32(&bb, "code", code);
-	blobmsg_add_string(&bb, "status", status);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-wps_pbc(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	system("killall -SIGUSR2 wps_monitor");
-	return 0;
-}
-
-static int
-wps_genpin(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	FILE *genpin;
-	char cmnd[16];
-	char pin[9] = { '\0' };
-
-	sprintf(cmnd, "wps_cmd genpin");
-	if ((genpin = popen(cmnd, "r"))) {
-		fgets(pin, sizeof(pin), genpin);
-		remove_newline(pin);
-		pclose(genpin);
-	}
-
-	blob_buf_init(&bb, 0);
-
-	blobmsg_add_string(&bb, "pin", pin);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-wps_checkpin(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__PIN_MAX];
-
-	blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[PIN]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	FILE *checkpin;
-	char cmnd[32];
-	char pin[9] = { '\0' };
-	bool valid = false;
-
-	snprintf(cmnd, 32, "wps_cmd checkpin %s", (char*)blobmsg_data(tb[PIN]));
-	if ((checkpin = popen(cmnd, "r"))) {
-		fgets(pin, sizeof(pin), checkpin);
-		remove_newline(pin);
-		pclose(checkpin);
-	}
-
-	if(strlen(pin))
-		valid = true;
-
-	blob_buf_init(&bb, 0);
-	blobmsg_add_u8(&bb, "valid", valid);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-wps_stapin(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__PIN_MAX];
-
-	blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[PIN]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	runCmd("wps_cmd addenrollee wl0 sta_pin=%s &", blobmsg_data(tb[PIN]));
-
-	return 0;
-}
-
-static int
-wps_setpin(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	struct blob_attr *tb[__PIN_MAX];
-
-	blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
-
-	if (!(tb[PIN]))
-		return UBUS_STATUS_INVALID_ARGUMENT;
-
-	runCmd("wps_cmd setpin %s &", blobmsg_data(tb[PIN]));
-
-	return 0;
-}
-
-static int
-wps_showpin(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	FILE *showpin;
-	char cmnd[32];
-	char pin[9] = { '\0' };
-
-	sprintf(cmnd, "nvram get wps_device_pin");
-	if ((showpin = popen(cmnd, "r"))) {
-		fgets(pin, sizeof(pin), showpin);
-		remove_newline(pin);
-		pclose(showpin);
-	}
-
-	blob_buf_init(&bb, 0);
-
-	blobmsg_add_string(&bb, "pin", pin);
-	ubus_send_reply(ctx, req, bb.head);
-
-	return 0;
-}
-
-static int
-wps_stop(struct ubus_context *ctx, struct ubus_object *obj,
-		  struct ubus_request_data *req, const char *method,
-		  struct blob_attr *msg)
-{
-	system("killall -SIGTERM wps_monitor");
-	system("nvram set wps_proc_status=0");
-	system("wps_monitor &");
-	return 0;
-}
-
-
-static struct ubus_method wps_object_methods[] = {
-	UBUS_METHOD_NOARG("status", wps_status),
-	UBUS_METHOD_NOARG("pbc", wps_pbc),
-	UBUS_METHOD_NOARG("genpin", wps_genpin),
-	UBUS_METHOD("checkpin", wps_checkpin, pin_policy),
-	UBUS_METHOD("stapin", wps_stapin, pin_policy),
-	UBUS_METHOD("setpin", wps_setpin, pin_policy),
-	UBUS_METHOD_NOARG("showpin", wps_showpin),
-	UBUS_METHOD_NOARG("stop", wps_stop),
-};
-
-static struct ubus_object_type wps_object_type =
-	UBUS_OBJECT_TYPE("wps", wps_object_methods);
-
-static struct ubus_object wps_object = {
-	.name = "wps",
-	.type = &wps_object_type,
-	.methods = wps_object_methods,
-	.n_methods = ARRAY_SIZE(wps_object_methods),
-};
-
-/* END OF WPS OBJECT */
-
-static void
-quest_ubus_add_fd(void)
-{
-	ubus_add_uloop(ctx);
-	system_fd_set_cloexec(ctx->sock.fd);
-}
-
-static void
-quest_ubus_reconnect_timer(struct uloop_timeout *timeout)
-{
-	static struct uloop_timeout retry = {
-		.cb = quest_ubus_reconnect_timer,
-	};
-	int t = 2;
-
-	if (ubus_reconnect(ctx, ubus_path) != 0) {
-		printf("failed to reconnect, trying again in %d seconds\n", t);
-		uloop_timeout_set(&retry, t * 1000);
-		return;
-	}
-
-	printf("reconnected to ubus, new id: %08x\n", ctx->local_id);
-	quest_ubus_add_fd();
-}
-
-
-
-static void
-quest_ubus_connection_lost(struct ubus_context *ctx)
-{
-	quest_ubus_reconnect_timer(NULL);
-}
-
-static void
-quest_add_object(struct ubus_object *obj)
-{
-	int ret = ubus_add_object(ctx, obj);
-
-	if (ret != 0)
-		fprintf(stderr, "Failed to publish object '%s': %s\n", obj->name, ubus_strerror(ret));
-}
-
-static int
-quest_ubus_init(const char *path)
-{
-	uloop_init();
-	ubus_path = path;
-
-	ctx = ubus_connect(path);
-	if (!ctx)
-		return -EIO;
-
-	printf("connected as %08x\n", ctx->local_id);
-	ctx->connection_lost = quest_ubus_connection_lost;
-	quest_ubus_add_fd();
-
-	quest_add_object(&router_object);
-	quest_add_object(&wps_object);
-
-	return 0;
-}
-
-void *dump_router_info(void *arg)
-{
-	int lpcnt = 0;
-	bool popc = true;
-
-	jiffy_counts_t cur_jif = {0}, prev_jif = {0};
-	
-	init_db_hw_config();
-	load_networks();
-	load_wireless();
-	dump_keys(&keys);
-	dump_specs(&spec);
-	dump_static_router_info(&router);
-	dump_hostname(&router);
-	while (true) {
-		dump_sysinfo(&router, &memory);
-		dump_cpuinfo(&router, &prev_jif, &cur_jif);
-		if (popc) {
-			populate_clients();
-			popc = false;
-		} else
-			popc = true;
-
-		get_jif_val(&prev_jif);
-		usleep(sleep_time);
-		recalc_sleep_time(false, 0);
-		get_jif_val(&cur_jif);
-		lpcnt++;
-		if (lpcnt == 20) {
-			lpcnt = 0;
-			memset(clients, '\0', sizeof(clients));
-			memset(clients6, '\0', sizeof(clients6));
-		}
-	}
-
-	return NULL;
-}
-
-int main(int argc, char **argv)
-{
-	int pt;
-
-	if (quest_ubus_init(NULL) < 0) {
-		fprintf(stderr, "Failed to connect to ubus\n");
-		return 1;
-	}
-	
-	if ((pt = pthread_create(&(tid[0]), NULL, &dump_router_info, NULL) != 0)) {
-		fprintf(stderr, "Failed to create thread\n");
-		return 1;
-	}
-	uloop_run();
-	ubus_free(ctx);	
-
-	return 0;
-}
-
diff --git a/questd/src/questd.h b/questd/src/questd.h
deleted file mode 100644
index 9794e60bb3244536a76e134abce282d45fdcccc0..0000000000000000000000000000000000000000
--- a/questd/src/questd.h
+++ /dev/null
@@ -1,219 +0,0 @@
-//#define _GNU_SOURCE 
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <stdbool.h>
-
-#include <sys/sysinfo.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <fcntl.h>
-
-#include <uci.h>
-
-#include <libubox/blobmsg.h>
-#include <libubox/uloop.h>
-#include <libubox/ustream.h>
-#include <libubox/utils.h>
-
-#include <libubus.h>
-
-#include "dslstats.h"
-#include "igmp.h"
-
-#define MAX_RADIO	4
-#define MAX_VIF		8
-#define MAX_NETWORK	16
-#define MAX_CLIENT	128
-#define MAX_PORT	8
-#define MAX_USB		18
-
-typedef struct {
-	const char *vif;
-	const char *device;
-	const char *ssid;
-	const char *network;
-	int noise;
-} Wireless;
-
-typedef struct {
-	const char *name;
-	const char *band;
-	int frequency;
-	const char *hwmodes[6];
-	int channels[16];
-	const char *pcid;
-	int bwcaps[4];
-	bool is_ac;
-} Radio;
-
-typedef struct {
-	int connum;
-	int idle;
-	int in_network;
-	long tx_bytes;
-	long rx_bytes;
-	int tx_rate;
-	int rx_rate;
-	int snr;
-} Detail;
-
-typedef struct {
-	bool exists;
-	bool local;
-	bool dhcp;
-	char leaseno[24];
-	char macaddr[24];
-	char ipaddr[24];
-	char hostname[64];
-	char network[32];
-	char device[32];
-	bool wireless;
-	char wdev[8];
-	bool connected;
-} Client;
-
-typedef struct {
-	bool exists;
-	char macaddr[24];
-	char wdev[8];
-	int snr;
-} Sta;
-
-typedef struct {
-	bool exists;
-	char ip6addr[128];
-	char macaddr[24];
-	char hostname[64];
-	char duid[64];
-	char device[32];
-	bool wireless;
-	char wdev[8];
-	bool connected;
-} Client6;
-
-typedef struct {
-        unsigned long rx_bytes;
-        unsigned long rx_packets;
-        unsigned long rx_errors;
-        unsigned long tx_bytes;
-        unsigned long tx_packets;
-        unsigned long tx_errors;
-} Statistic;
-
-typedef struct {
-	char name[16];
-	char ssid[32];
-	char device[32];
-	Statistic stat;
-	Client client[MAX_CLIENT];
-} Port;
-
-typedef struct {
-	bool exists;
-	bool is_lan;
-	const char *name;
-	const char *type;
-	const char *proto;
-	const char *ipaddr;
-	const char *netmask;
-	char ifname[128];
-	Port port[MAX_PORT];
-	bool ports_populated;
-} Network;
-
-typedef struct {
-	char name[64];
-	char *hardware;
-	char *model;
-	char *boardid;
-	char *firmware;
-	char *brcmver;
-	char *filesystem;
-	char *socmod;
-	char *socrev;
-	char *cfever;
-	char *kernel;
-	char *basemac;
-	char *serialno;
-	char uptime[64];
-	unsigned int procs;
-	unsigned int cpu;
-} Router;
-
-typedef struct {
-	unsigned long total;
-	unsigned long used;
-	unsigned long free;
-	unsigned long shared;
-	unsigned long buffers;
-} Memory;
-
-typedef struct {
-	char *auth;
-	char *des;
-	char *wpa;
-} Key;
-
-typedef struct {
-	bool wifi;
-	bool adsl;
-        bool vdsl;
-        bool voice;
-        bool dect;
-        int vports;
-	int eports;
-} Spec;
-
-typedef struct {
-	char mount[64];
-	char product[64];
-	char no[8];
-	char name[8];
-	unsigned long size;
-	char *device;
-	char *vendor;
-	char *serial;
-	char *speed;
-	char *maxchild;
-} USB;
-
-typedef struct jiffy_counts_t {
-	unsigned long long usr, nic, sys, idle;
-	unsigned long long iowait, irq, softirq, steal;
-	unsigned long long total;
-	unsigned long long busy;
-} jiffy_counts_t;
-
-struct fdb_entry
-{
-	u_int8_t mac_addr[6];
-	u_int16_t port_no;
-	unsigned char is_local;
-};
-
-void recalc_sleep_time(bool calc, int toms);
-void init_db_hw_config(void);
-bool arping(char *target, char *device, int toms);
-void remove_newline(char *buf);
-void replace_char(char *buf, char a, char b);
-void runCmd(const char *pFmt, ...);
-const char *chrCmd(const char *pFmt, ...);
-void get_jif_val(jiffy_counts_t *p_jif);
-void dump_keys(Key *keys);
-void dump_specs(Spec *spec);
-void dump_static_router_info(Router *router);
-void dump_hostname(Router *router);
-void dump_sysinfo(Router *router, Memory *memory);
-void dump_cpuinfo(Router *router, jiffy_counts_t *prev_jif, jiffy_counts_t *cur_jif);
-void get_port_name(Port *port);
-void get_port_stats(Port *port);
-void get_bridge_ports(char *network, char **ifname);
-void get_clients_onport(char *bridge, int portno, char **macaddr);
-void dump_usb_info(USB *usb, char *usbno);
-void clear_macaddr(void);
-char *get_macaddr(void);
-bool ndisc (const char *name, const char *ifname, unsigned flags, unsigned retry, unsigned wait_ms);
diff --git a/questd/src/tools.c b/questd/src/tools.c
deleted file mode 100644
index 306a27fdc1406e5e7d94bd680d85fa17864ed0ff..0000000000000000000000000000000000000000
--- a/questd/src/tools.c
+++ /dev/null
@@ -1,84 +0,0 @@
-#include <string.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-#include "questd.h"
-
-void 
-remove_newline(char *buf)
-{
-	int len;
-	len = strlen(buf) - 1;
-	if (buf[len] == '\n') 
-		buf[len] = 0;
-}
-
-void
-replace_char(char *buf, char a, char b)
-{
-	int i = 0;
-
-	while (buf[i]) {
-		if (buf[i] == a)
-			buf[i] = b;
-		i++;
-	}
-	buf[i] = '\0';
-}
-
-void
-runCmd(const char *pFmt, ...)
-{
-	va_list ap;
-	char cmd[256] = {0};
-	int len=0, maxLen;
-
-	maxLen = sizeof(cmd);
-
-	va_start(ap, pFmt);
-
-	if (len < maxLen)
-	{
-		maxLen -= len;
-		vsnprintf(&cmd[len], maxLen, pFmt, ap);
-	}
-
-	system(cmd);
-
-	va_end(ap);
-}
-
-const char*
-chrCmd(const char *pFmt, ...)
-{
-	va_list ap;
-	char cmd[256] = {0};
-	int len=0, maxLen;
-
-	maxLen = sizeof(cmd);
-
-	va_start(ap, pFmt);
-
-	if (len < maxLen)
-	{
-		maxLen -= len;
-		vsnprintf(&cmd[len], maxLen, pFmt, ap);
-	}
-
-	va_end(ap);
-
-	FILE *pipe = 0;
-	static char buffer[128] = {0};
-	if ((pipe = popen(cmd, "r"))){
-		fgets(buffer, sizeof(buffer), pipe);
-		pclose(pipe);
-
-		remove_newline(buffer);
-		if (strlen(buffer))
-			return (const char*)buffer;
-		else
-			return "";
-	} else {
-		return ""; 
-	}
-}
diff --git a/questd/src/usb.c b/questd/src/usb.c
deleted file mode 100644
index 559ff5d5509363754696eec683aea6757651213f..0000000000000000000000000000000000000000
--- a/questd/src/usb.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * usb -- collects usb info for questd
- *
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * Author: sukru.senli@inteno.se
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#include "questd.h"
-#include <string.h>
-
-static void
-remove_space(char *buf)
-{
-	char *newbuf = malloc(strlen(buf)+1);
-	int i = 0;
-	int j = 0;
-
-	while (buf[i]) {
-		newbuf[j] = buf[i];
-		if (buf[i] != ' ')
-			j++;
-		i++;
-	}
-	newbuf[j] = '\0';
-	strcpy(buf, newbuf);
-	free(newbuf); 
-}
-
-static void
-get_usb_infos(char **val, char *usbno, char *info) {
-	FILE *in;
-	char cmnd[64];
-	char result[32];
-
-	*val = "";
-
-	sprintf(cmnd, "/sys/bus/usb/devices/%s/%s", usbno, info);
-	if ((in = fopen(cmnd, "r"))) {
-		fgets(result, sizeof(result), in);
-		remove_newline(result);
-		fclose(in);
-		*val = strdup(result);
-	}	
-}
-
-static void
-get_usb_device(char **val, char *mount) {
-	FILE *mounts;
-	char line[128];
-	char dev[16];
-	char mnt[64];
-
-	*val = NULL;
-
-	if ((mounts = fopen("/var/usbmounts", "r"))) {
-		while(fgets(line, sizeof(line), mounts) != NULL)
-		{
-			remove_newline(line);
-			if (sscanf(line, "/dev/%s /mnt/%s", dev, mnt) == 2) {
-				if (!strcmp(mnt, mount) || strstr(mount, mnt)) {
-					*val = strdup(dev);
-					break;
-				}
-			}
-		}
-		fclose(mounts);
-	}
-}
-
-static void
-get_usb_size(unsigned long *val, char *device) {
-	FILE *in;
-	char cmnd[64];
-	char result[32];
-
-	*val = 0;
-
-	sprintf(cmnd, "/sys/class/block/%s/size", device);
-	if ((in = fopen(cmnd, "r"))) {
-		fgets(result, sizeof(result), in);
-		remove_newline(result);
-		fclose(in);
-		*val = (long)(atoi(result) / 2048);
-	}
-}
-
-void
-dump_usb_info(USB *usb, char *usbno)
-{
-	FILE *in;
-	char cmnd[64];
-	char result[32];
-
-	sprintf(cmnd, "/sys/bus/usb/devices/%s/product", usbno);
-	if ((in = fopen(cmnd, "r"))) {
-		fgets(result, sizeof(result), in);
-		remove_newline(result);
-		fclose(in);
-
-		strcpy(usb->product, result);
-		sprintf(usb->no, "%s", usbno);
-		sprintf(usb->name, "USB%s", strndup(usbno+2, strlen(usbno)));
-		get_usb_infos(&usb->vendor, usb->no, "manufacturer");
-		get_usb_infos(&usb->serial, usb->no, "serial");
-		//get_usb_infos(&usb->speed, usb->no, "speed");
-		get_usb_infos(&usb->maxchild, usb->no, "maxchild");
-		sprintf(usb->mount, "%s%s", usb->vendor, usb->serial);
-		remove_space(usb->mount);
-		if(!strcmp(usb->mount, usb->serial)) {
-			sprintf(usb->mount, "%s%s", usb->product, usb->serial);
-			remove_space(usb->mount);
-		}
-		get_usb_device(&usb->device, usb->mount);
-		get_usb_size(&usb->size, usb->device);
-	}
-}
diff --git a/statd/Makefile b/statd/Makefile
index a53c9963833f7da7c8b0be4179831750862840a8..f09d326f1c1fda150639635eca549981480d430f 100644
--- a/statd/Makefile
+++ b/statd/Makefile
@@ -8,32 +8,39 @@ PKG_NAME:=statd
 PKG_VERSION:=0.0.1
 PKG_RELEASE:=1
 
+PKG_SOURCE_VERSION:=54125a06399b378a27db31f722d891a5b23baf2d
+PKG_SOURCE_PROTO:=git
+ifeq ($(CONFIG_BCM_OPEN),y)
+PKG_SOURCE_URL:=http://public.inteno.se/statd
+else
+PKG_SOURCE_URL:=git@public.inteno.se:statd
+endif
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
 include $(INCLUDE_DIR)/package.mk
 
 target=$(firstword $(subst -, ,$(BOARD)))
 
 TARGET_LDFLAGS+= \
-        -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
-		-Wl,-rpath-link=$(STAGING_DIR)/lib -luci -lubus -lblobmsg_json
+	-Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
+	-Wl,-rpath-link=$(STAGING_DIR)/lib -luci -lubus -lblobmsg_json
 
 TARGET_CFLAGS += $(FPIC) -Dtarget_$(target)=1 -Wall
 MAKE_FLAGS += TARGET="$(target)"
 
 define Package/statd
-  CATEGORY:=Utilities
-  TITLE:=Statistics manager
-  DEPENDS:=+libuci +ubus +libblobmsg-json
+	CATEGORY:=Utilities
+	TITLE:=Statistics manager
+	DEPENDS:=+libuci +ubus +libblobmsg-json
 endef
 
 define Package/statd/description
 	Application that listen on ubus events to be sent on syslog or snmp
 endef
 
-define Build/Prepare
-	mkdir -p $(PKG_BUILD_DIR)
-	$(CP) ./src/* $(PKG_BUILD_DIR)/
-endef
-
 define Build/Compile
 	$(MAKE) -C $(PKG_BUILD_DIR) \
 		$(TARGET_CONFIGURE_OPTS) LINUX_DIR=$(LINUX_DIR) LDFLAGS="$(TARGET_LDFLAGS)" CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include -I$(STAGING_DIR)/usr/include"
diff --git a/statd/src/Makefile b/statd/src/Makefile
deleted file mode 100644
index 75e0ba2e58937113411f9d913b07af72973ed570..0000000000000000000000000000000000000000
--- a/statd/src/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-# Makefile for statd application
-
-CC		= gcc
-MAKEDEPEND	= makedepend
-CDEBUG		= -g
-CFLAGS		= ${CDEBUG} ${INCL} -Wall
-LDFLAGS		= ${CDEBUG}
-LIBDIR		= 
-LOCLIBS		= 
-LIBS		= ${LOCLIBS} ${SYSLIBS}
-OBJS		= statd.o statd_rules.o
-SRCS		= statd.c statd_rules.c
-LIBSRCS		= 
-ISRCS		= statd.h statd_rules.h
-ALLSRCS		= ${SRCS} ${ISRCS} ${LIBSRCS}
-
-all: statd
-
-statd: ${OBJS}
-	${CC} ${LDFLAGS} -o statd ${OBJS} ${LIBDIR} ${LIBS}
-
-clean:
-	rm -f statd ${OBJS}
-
-depend: 
-	${MAKEDEPEND} ${INCL} ${SRCS} ${LIBSRCS}
diff --git a/statd/src/statd.c b/statd/src/statd.c
deleted file mode 100644
index dca9131b71993ae61a16f19ada221508e050bc9c..0000000000000000000000000000000000000000
--- a/statd/src/statd.c
+++ /dev/null
@@ -1,256 +0,0 @@
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <stdlib.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <time.h>
-#include <arpa/inet.h>
-#include <syslog.h>
-
-#include <libubox/blobmsg.h>
-#include <libubox/uloop.h>
-#include <libubox/ustream.h>
-#include <libubox/utils.h>
-#include <libubox/blobmsg_json.h>
-#include <libubus.h>
-
-#include <uci.h>
-
-#include "statd_rules.h"
-
-#define CFG_PATH "/etc/config/"
-#define CFG_FILE "statd"
-
-static struct ubus_event_handler ubus_listener_syslog;
-
-static bool ubus_connected = false;
-static struct ubus_context *ubus_ctx = NULL;
-
-static void system_fd_set_cloexec(int fd)
-{
-#ifdef FD_CLOEXEC
-	fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
-#endif
-}
-
-static void ubus_receive_event_syslog_cb(struct ubus_context *ctx, struct ubus_event_handler *ev,
-			  const char *type, struct blob_attr *msg)
-{
-	char *tmp;
-	char *str;
-
-	tmp = blobmsg_format_json(msg, true);
-	str = (char *) malloc(strlen(type) + strlen(tmp) + /* Curly braces, null terminator etc... */ 9);
-	sprintf(str, "{ \"%s\": %s }", type, tmp);
-	printf("Sending to syslog: %s\n", str);
-	syslog(LOG_INFO, str);
-
-	free(str);
-	free(tmp);
-}
-
-static void ubus_connection_lost_cb(struct ubus_context *ctx)
-{
-	fprintf(stderr, "UBUS connection lost\n");
-	ubus_connected = false;
-}
-
-static struct ubus_event_handler *get_ubus_event_handler(const struct statd_rule *rule)
-{
-	static struct ubus_event_handler *ubus_listener = NULL;
-	switch (statd_rule_get_destination(rule)) {
-		case DEST_SYSLOG:
-			ubus_listener = &ubus_listener_syslog;
-			break;
-		default:
-			fprintf(stderr, "Unknown destination, can't register\n");
-			break;
-	}
-
-	return ubus_listener;
-}
-
-static int load_rules()
-{
-	struct uci_context *uci_ctx = uci_alloc_context();
-	if (!uci_ctx) {
-		fprintf(stderr, "Failed to initialize uci\n");
-		return 1;
-	}
-	uci_set_confdir(uci_ctx, CFG_PATH);
-	if (uci_load(uci_ctx, CFG_FILE, NULL) != UCI_OK) {
-		fprintf(stderr, "Configuration missing or corrupt (%s/%s)\n", CFG_PATH, CFG_FILE);
-		uci_free_context(uci_ctx);
-		return 1;
-	}
-
-	struct uci_element *package_element;
-	uci_foreach_element(&uci_ctx->root, package_element) {
-		struct uci_package *package = uci_to_package(package_element);
-	
-		struct uci_element *section_element;
-		uci_foreach_element(&package->sections, section_element)
-		{
-			struct uci_section *section = uci_to_section(section_element);
-			if (strcmp(section->type, "rule")) {
-				fprintf(stderr, "Ignoring unknown uci section type %s\n", section->type);
-				continue;
-			}
-
-			struct uci_element *option_element;
-			const char *filter = NULL;
-			enum statd_destination destination = DEST_UNKNOWN;
-			uci_foreach_element(&section->options, option_element)
-			{
-				struct uci_option *option = uci_to_option(option_element);
-				if (option->type != UCI_TYPE_STRING) {
-					fprintf(stderr, "Ignoring uci option, type is not string\n");
-					continue;
-				}
-
-				if (!strcmp(option_element->name, "filter")) {
-					filter = option->v.string;
-				} else if (!strcmp(option_element->name, "destination")) {
-					if (strcmp(option->v.string, "syslog")) {
-						fprintf(stderr, "Ignoring unknown uci option destination %s\n", option->v.string);
-						continue;
-					}
-					destination = DEST_SYSLOG;
-				} else {
-					fprintf(stderr, "Ignoring unknown uci option %s\n", option_element->name);
-					continue;
-				}
-			}
-			if (filter && destination != DEST_UNKNOWN) {
-				statd_rule_add(filter, destination);
-			}
-		}
-	}
-
-	uci_free_context(uci_ctx);
-
-	if (!statd_rule_get_head()) {
-		fprintf(stderr, "No valid rules found in configuration\n");
-		return 1;
-	}
-
-	return 0;
-}
-
-int main(int argc, char *argv[])
-{
-	int ret;
-	fd_set fdset;
-	struct timeval timeout;
-
-	/* Read configuration */
-	if (load_rules()) {
-		return 1;
-	}
-
-	/* Listener for events to be sent on syslog */
-	memset(&ubus_listener_syslog, 0, sizeof(ubus_listener_syslog));
-	ubus_listener_syslog.cb = ubus_receive_event_syslog_cb;
-	openlog(NULL, LOG_NDELAY, LOG_LOCAL0);
-
-	/* TODO: Listener for events to be sent using snmp trap */
-	
-	/* Initialize ubus connection */
-	ubus_ctx = ubus_connect(NULL);
-	if (!ubus_ctx) {
-		fprintf(stderr, "Failed to connect to UBUS\n");
-	} else {
-		ubus_ctx->connection_lost = ubus_connection_lost_cb;
-		system_fd_set_cloexec(ubus_ctx->sock.fd);
-		printf("Connected to UBUS, id: %08x\n", ubus_ctx->local_id);
-
-		/* Register ubus event listeners */
-		ret = 0;
-		struct statd_rule *current_rule = statd_rule_get_head();
-		while (current_rule) {
-			printf("Registering for event: %s\n", statd_rule_get_filter(current_rule));
-			struct ubus_event_handler *ubus_listener = get_ubus_event_handler(current_rule);
-			if (ubus_listener) {
-				ret |= ubus_register_event_handler(ubus_ctx, ubus_listener, statd_rule_get_filter(current_rule));
-			}
-			current_rule = statd_rule_get_next(current_rule);
-		}
-
-		if (ret == 0) {
-			ubus_connected = true;
-		} else {
-			fprintf(stderr, "Error while registering for events: %s\n", ubus_strerror(ret));
-			ubus_free(ubus_ctx);
-			ubus_ctx = NULL;
-		}
-	}
-
-	/* Main application loop */
-	while(1) {
-		FD_ZERO(&fdset);
-		timeout.tv_sec = 1;
-		timeout.tv_usec = 0;
-
-		if (ubus_connected) {
-			FD_SET(ubus_ctx->sock.fd, &fdset);
-		}
-
-		/* Wait for events from ubus (or in the future SNMP requests) */
-		ret = select(FD_SETSIZE, &fdset, NULL, NULL, &timeout);
-		if (ret < 0) {
-			fprintf(stderr, "Error: %s\n", strerror(errno));
-			if (errno == EINTR) {
-				break;
-			}
-			continue;
-		}
-
-		if (ubus_connected) {
-			if (FD_ISSET(ubus_ctx->sock.fd, &fdset)) {
-				ubus_handle_event(ubus_ctx);
-			}
-			continue;
-		}
-		
-		if (ubus_ctx) {
-			if (ubus_reconnect(ubus_ctx, NULL) == 0) {
-				printf("UBUS reconnected\n");
-				ubus_connected = true;
-				system_fd_set_cloexec(ubus_ctx->sock.fd);
-			}
-			continue;
-		}
-		
-		ubus_ctx = ubus_connect(NULL);
-		if (ubus_ctx) {
-			ubus_ctx->connection_lost = ubus_connection_lost_cb;
-			system_fd_set_cloexec(ubus_ctx->sock.fd);
-
-			ret = 0;
-			struct statd_rule *current_rule = statd_rule_get_head();
-			while (current_rule) {
-				struct ubus_event_handler *ubus_listener = get_ubus_event_handler(current_rule);
-				if (ubus_listener) {
-					ret |= ubus_register_event_handler(ubus_ctx, ubus_listener, statd_rule_get_filter(current_rule));
-				}
-				current_rule = statd_rule_get_next(current_rule);
-			}
-			if (ret == 0) {
-				ubus_connected = true;
-				printf("Connected to UBUS, id: %08x\n", ubus_ctx->local_id);
-			} else {
-				ubus_free(ubus_ctx);
-				ubus_ctx = NULL;
-			}
-			continue;
-		}
-	}
-
-	ubus_free(ubus_ctx); //Shut down UBUS connection
-	printf("UBUS connection closed\n");
-
-	statd_rule_destroy_all();
-	return 0;
-}
diff --git a/statd/src/statd_rules.c b/statd/src/statd_rules.c
deleted file mode 100644
index e51baf7d20641ea6b098c9304d54b16962d607cd..0000000000000000000000000000000000000000
--- a/statd/src/statd_rules.c
+++ /dev/null
@@ -1,72 +0,0 @@
-#include "statd_rules.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-static struct statd_rule *head = NULL;
-static struct statd_rule *tail = NULL;
-
-struct statd_rule *statd_rule_add(const char* filter, enum statd_destination destination)
-{
-	struct statd_rule *rule = NULL;
-
-	rule = malloc(sizeof(*rule)); 
-	rule->filter = strdup(filter);
-	rule->destination = destination;
-	rule->next = NULL;
-
-	if (!head) {
-		head = rule;
-	}
-
-	if (tail) {
-		tail->next = rule;
-	}
-	tail = rule;
-
-	return rule;
-}
-
-static void statd_rule_destroy(struct statd_rule *rule)
-{
-	free(rule->filter);
-	free(rule);
-}
-
-void statd_rule_destroy_all()
-{
-	struct statd_rule *current_rule = head;
-	while (current_rule) {
-		struct statd_rule *next = statd_rule_get_next(current_rule);
-		statd_rule_destroy(current_rule);
-		current_rule = next;
-	}
-
-	head = NULL;
-	tail = NULL;
-}
-
-struct statd_rule *statd_rule_get_head()
-{
-	return head;
-}
-
-struct statd_rule *statd_rule_get_next(const struct statd_rule *rule)
-{
-	return rule->next;
-}
-
-const char *statd_rule_get_filter(const struct statd_rule *rule)
-{
-	return rule->filter;
-}
-
-enum statd_destination statd_rule_get_destination(const struct statd_rule *rule)
-{
-	return rule->destination;
-}
-
-int statd_rule_has_next(const struct statd_rule *rule)
-{
-	return rule->next != NULL;
-}
diff --git a/statd/src/statd_rules.h b/statd/src/statd_rules.h
deleted file mode 100644
index affe8d989cb1b15396bc7af9ad907866efd5f5bb..0000000000000000000000000000000000000000
--- a/statd/src/statd_rules.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef _RULES_H_
-#define _RULES_H_
-
-enum statd_destination
-{
-	DEST_SYSLOG,
-	DEST_UNKNOWN
-};
-
-struct statd_rule
-{
-	char *filter;
-	enum statd_destination destination;
-	struct statd_rule *next;
-};
-
-/* Create rule and add to internal list */
-struct statd_rule *statd_rule_add(const char* filter, enum statd_destination destination);
-
-/* Destroy all rules */
-void statd_rule_destroy_all();
-
-/* Get first rule. Useful for looping over all rules */
-struct statd_rule *statd_rule_get_head();
-
-/* Get ubus filter for rule */
-const char *statd_rule_get_filter(const struct statd_rule *rule);
-
-/* Get log destination for rule */
-enum statd_destination statd_rule_get_destination(const struct statd_rule *rule);
-
-/* Get next rule in list */
-struct statd_rule *statd_rule_get_next(const struct statd_rule *rule);
-
-/* Returns true if current rule has a next */
-int statd_rule_has_next(const struct statd_rule *rule);
-
-#endif
diff --git a/tptest/Makefile b/tptest/Makefile
index 1030e3f7d3329b842fe326b0c73f8c6ff53db287..519237844987277dcc8b61aee9fabc38b8151cb9 100644
--- a/tptest/Makefile
+++ b/tptest/Makefile
@@ -1,37 +1,44 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=tptest
-PKG_RELEASE:=0
 PKG_VERSION:=1.3
+PKG_RELEASE:=0
+
+PKG_SOURCE_VERSION:=4dfab45a92328226c8182347df50e86a5d72ca5f
+PKG_SOURCE_PROTO:=git
+ifeq ($(CONFIG_BCM_OPEN),y)
+PKG_SOURCE_URL:=http://public.inteno.se/tptest
+else
+PKG_SOURCE_URL:=git@public.inteno.se:tptest
+endif
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
 
 TARGET_LDFLAGS+= \
-        -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
-		-Wl,-rpath-link=$(STAGING_DIR)/lib
+	-Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
+	-Wl,-rpath-link=$(STAGING_DIR)/lib
 
 TARGET_CFLAGS+= \
-		-DUNIX -DLINUX
+	-DUNIX -DLINUX
 
 MAKE_OPTS:= \
-    ARCH="$(LINUX_KARCH)" \
-    CROSS_COMPILE="$(TARGET_CROSS)" \
-    SUBDIRS="$(PKG_BUILD_DIR)" \
+	ARCH="$(LINUX_KARCH)" \
+	CROSS_COMPILE="$(TARGET_CROSS)" \
+	SUBDIRS="$(PKG_BUILD_DIR)" \
 
 define Package/tptest
-  CATEGORY:=Utilities
-  TITLE:=TPTEST speed test utility
+	CATEGORY:=Utilities
+	TITLE:=TPTEST speed test utility
 endef
 
 define Package/tptest/description
 	TPTEST speed test utility
 endef
 
-define Build/Prepare
-	mkdir -p $(PKG_BUILD_DIR)
-	$(CP) ./src/* $(PKG_BUILD_DIR)/
-endef
-
 define Build/Compile
 	$(MAKE) -C $(PKG_BUILD_DIR) \
 		$(TARGET_CONFIGURE_OPTS) LINUX_DIR=$(LINUX_DIR) MAKE_OPTS=$(MAKE_OPTS) LDFLAGS="$(TARGET_LDFLAGS)" CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include -I$(STAGING_DIR)/usr/include"
diff --git a/tptest/src/CHANGELOG b/tptest/src/CHANGELOG
deleted file mode 100644
index ef211fced6b7c5150c0bb2a4106d8cc5cfc55e51..0000000000000000000000000000000000000000
--- a/tptest/src/CHANGELOG
+++ /dev/null
@@ -1,49 +0,0 @@
-TPTEST engine changelog
------------------------
-
-
-Version 3.15:
-
- - Modified TPEngine struct to include "UINT32 start_tcpsend_bytes" and 
-   "UINT32 start_tcprecv_bytes", which are used by tpclient.c:AdvanceTest() 
-   as start values for tcpBytes when doing TCP send and receive tests.
-   Previously, the values were a #define (START_TCP_BYTES).
-
-   This modification allows a (TPTEST/Statistik) client program to perform
-   auto-TCP tests more effectively.
-
- - Added "char email[101]" and "char pwd[101]" to TPEngine struct.
-   (more TPTEST/Statistik support).
-
- - Stat reports now include "email=x;pwd=y" also, no matter if email or
-   pwd exists/is used or not.
-
- - New test modes supported by AdvanceTest(): 
-   M_TCP_AUTO, M_TCP_AUTO_SEND, M_TCP_AUTO_RECV
-
-
-Version 3.16:
-
- - Added "int socket_sndbuf, socket_rcvbuf, cur_socket_sndbuf, cur_socket_rcvbuf"
-   to TPEngine struct. socket_sndbuf/socket_rcvbuf are used by the application
-   to tell the IO module that it would like certain SO_SNDBUF/SO_RCVBUF values
-   set for data sockets (only. The control socket will use default values for
-   SO_SNDBUF/SO_RCVBUF). If the IO module sees that these variables are non-zero
-   it should try to set the send- and receive buffers for new data sockets
-   accordingly. The IO module should also do a getsockopt() or similar, asking
-   for the actual SO_SNDBUF/SO_RCVBUF values used (after trying to set them) and 
-   store the results in cur_socket_rcvbuf/cur_socket_sndbuf. The application may
-   then determine what buffer settings were actually used for the test.
-
-   Note that data sockets aren't created by the engine until a test has been
-   initiated and test parameters have been negotiated between client and server.
-   This means that an application has to e.g. wait until the engine state is
-   "engp->state == CLSM_TESTLOOP" before checking what actual values for
-   SO_SNDBUF/SO_RCVBUF are used.
-
-   Also worth knowing is that SO_SNDBUF and SO_RCVBUF are used by most Unix-like
-   OS's to determine TCP window size. Setting both values to e.g. 65536 on both
-   the client and server side will cause the machines to negotiate that value
-   for the TCP window size when the data connection is set up in a TCP test.
-
-
diff --git a/tptest/src/LICENSE b/tptest/src/LICENSE
deleted file mode 100644
index 0b3700ec8d698cad0f2805e4a5e7dc6e4611f5a3..0000000000000000000000000000000000000000
--- a/tptest/src/LICENSE
+++ /dev/null
@@ -1,459 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
diff --git a/tptest/src/Makefile b/tptest/src/Makefile
deleted file mode 100644
index d7ce812fa324752e1eaffdc4cb42c91734ded538..0000000000000000000000000000000000000000
--- a/tptest/src/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-CC		= gcc
-MAKEDEPEND	= makedepend
-CDEBUG		= -g
-EXTRADEFINES	= -DUNIX -DLINUX
-CFLAGS		= ${CDEBUG} ${EXTRADEFINES} ${INCL} -Wall
-LDFLAGS		= ${CDEBUG}
-LIBDIR		= 
-LOCLIBS		= 
-LIBS		= ${LOCLIBS} ${SYSLIBS}
-OBJS		= tpio_unix.o tpengine.o tpcommon.o client.o tpclient.o getopt.o
-SRCS		= tpio_unix.c tpengine.c tpcommon.c client.c tpclient.c getopt.c
-LIBSRCS		= 
-ISRCS		= tpengine.h tpio.h tpio_unix.h server.h tpclient.h
-ALLSRCS		= ${SRCS} ${ISRCS} ${LIBSRCS}
-
-all: tptest
-
-tptest: ${OBJS}
-	${CC} ${LDFLAGS} -o tptest ${OBJS} ${LIBDIR} ${LIBS}
-
-clean:
-	rm -f tptest core *.o *.BAK *.bak *.CKP a.out
-
-depend: 
-	${MAKEDEPEND} ${INCL} ${SRCS} ${LIBSRCS}
-
diff --git a/tptest/src/README b/tptest/src/README
deleted file mode 100644
index 9078e72d297a1d9cd702128e977c67bf995e2a3a..0000000000000000000000000000000000000000
--- a/tptest/src/README
+++ /dev/null
@@ -1,19 +0,0 @@
-$Id: README,v 1.1 2002/09/12 19:28:38 rlonn Exp $
-$Source: /cvsroot/tptest/os-dep/unix/README,v $
-
-tpio_unix is the platform-dependent communications module for Unix.
-It has been compiled and tested on Solaris 2.8, Redhat Linux 7.0, 
-OpenBSD 2.7 and NetBSD 1.5.
-
-To build tpio_unix.o
-
-Do:
-
-On Solaris: 	gcc -c tpio_unix.c -DUNIX -DSOLARIS
-On *BSD:	gcc -c tpio_unix.c -DUNIX -DOPENBSD
-On Linux:	gcc -c tpio_unix.c -DUNIX -DLINUX
-
-The resulting tpio_unix.o is used together with the test engine files
-(tpengine.o, tpcommon.o, tpclient.o) to create clients and servers.
-
-
diff --git a/tptest/src/client.c b/tptest/src/client.c
deleted file mode 100644
index e55b1407dfff00087beb57e28ffae440f9463d7f..0000000000000000000000000000000000000000
--- a/tptest/src/client.c
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- * $Id: client.c,v 1.6 2004/05/17 15:11:55 rlonn Exp $
- * $Source: /cvsroot/tptest/apps/unix/client/client.c,v $
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * client.c - TPTEST 3.0 client
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by       
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.       
- *
- * You should have received a copy of the GNU General Public License       
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-
-#include <stdio.h>
-#ifdef UNIX
-#include <unistd.h>
-#include <syslog.h>
-#include <time.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-#include "tpengine.h"
-#include "tpcommon.h"
-#include "tpclient.h"
-#include "tpio.h"
-
-/* globals */
-int verbosity = 0;
-int syslog_verbosity = 0;
-int no_output = 0;
-int is_v4 = 0;
-int use_delay = 0;
-int repeat = 1;
-char output_text[400];
-
-/* prototypes */
-void usage(char *);
-void log_error(char *);
-void log_text(int);
-LONG_LONG timediff(struct timeval *, struct timeval *);
-void ReportResults(int, TPEngine *, time_t *, time_t *);
-
-void usage(char *s) {
-  printf("Usage: tptestclient [options] <-m mode> <parameters> <address> <port>\n");
-  printf("\n");
-  printf("options: <> = required argument, [] = optional argument\n");
-  printf("  -b <local address>        Bind to local address/interface\n");
-  printf("  -n <repetitions>          Repeat test n number of times (0 = infinite)\n");
-  printf("  -v <verbosity>            Set verbosity level\n");
-  printf("  -s <verbosity>            Set syslog verbosity level\n");
-  printf("  -e <email>                Set email for TPTEST/Statistik\n");
-  printf("  -p <password>             Set password for TPTEST/Statistik\n");
-  printf("  -d <delaytime>            Set delaytime between repeated tests\n");
-  printf("  -S <sendbuf size>         Set size of socket send buffer\n");
-  printf("  -R <recvbuf size>         Set size of socket receive buffer\n");
-  printf("  -t                        No text output\n");
-  printf("\n");
-  printf("test modes & parameters:\n");
-  printf("  udp-send | us             UDP send to server\n");
-  printf("    parameters: <testtime> <bitrate>\n");
-  printf("    parameters: <testtime> <packetsize> <packets/sec>\n");
-  printf("  udp-receive | ur          UDP receive from server\n");
-  printf("    parameters: <testtime> <bitrate>\n");
-  printf("    parameters: <testtime> <packetsize> <packets/sec>\n");
-  printf("  udp-fdx | uf              UDP full duplex\n");
-  printf("    parameters: <testtime> <bitrate>\n");
-  printf("    parameters: <testtime> <packetsize> <packets/sec>\n");
-  printf("  tcp-send | ts             TCP send to server\n");
-  printf("    parameters: <max testtime> <bytes to send>\n");
-  printf("  tcp-receive | tr          TCP receive from server\n");
-  printf("    parameters: <max testtime> <bytes to receive>\n");
-  printf("  tcp-send-auto | tsa       TCP auto send to server\n");
-  printf("  tcp-receive-auto | tra    TCP auto receive from server\n");
-  printf("  tcp-auto | ta             TCP auto (auto send + auto receive)\n");
-  printf("\n");
-  if (strlen(s)) {
-    printf("%s\n", s);
-  }
-  printf("\n");
-  exit(1);
-}
-
-
-int main(int argc, char **argv) {
-
-  TPEngine *engp;
-  int selectedMode, ch;
-  int succeeds = 0;
-  int fails = 0;
-  int not_checked = 1;
-  int delay = 30;
-  double tmp;
-  struct timespec sleeptime;
-  time_t starttime, stoptime;
-
-  extern char *optarg;
-  extern int optind;
-
-  /* 0.5 sec wait between automatic tests */
-  sleeptime.tv_sec = 0;
-  sleeptime.tv_nsec = 500000000;
-
-  /* create engine context */
-  engp = CreateContext();
-
-  /* check command line arguments */
-  while ((ch = getopt(argc, argv, "m:b:v:s:n:e:p:d:S:R:t")) != -1) {
-    switch (ch) {
-      case 'm':
-        if (strcasecmp(optarg, "udp-send")==0 ||  strcasecmp(optarg, "us")==0)
-          selectedMode = CLM_UDP_SEND;
-        else if (strcasecmp(optarg, "udp-receive")==0 || strcasecmp(optarg, "ur")==0)
-          selectedMode = CLM_UDP_RECV;
-        else if (strcasecmp(optarg, "udp-full-duplex")==0 || strcasecmp(optarg, "uf")==0)
-          selectedMode = CLM_UDP_FDX;
-        else if (strcasecmp(optarg, "tcp-send")==0 || strcasecmp(optarg, "ts")==0)
-          selectedMode = CLM_TCP_SEND;
-        else if (strcasecmp(optarg, "tcp-receive")==0 || strcasecmp(optarg, "tr")==0)
-          selectedMode = CLM_TCP_RECV;
-        else if (strcasecmp(optarg, "tcp-send-auto")==0 || strcasecmp(optarg, "tsa")==0)
-          selectedMode = CLM_AUTO_TCP_SEND;
-        else if (strcasecmp(optarg, "tcp-receive-auto")==0 || strcasecmp(optarg, "tra")==0)
-          selectedMode = CLM_AUTO_TCP_RECV;
-        else if (strcasecmp(optarg, "tcp-auto")==0 || strcasecmp(optarg, "ta")==0)
-          selectedMode = CLM_AUTO_TCP;
-	else {
-          /* error, no mode supplied */
-          usage("Error: no test mode supplied");
-        }
-        break;
-      case 'b':
-        if (inet_addr(optarg) != INADDR_NONE)
-          engp->myLocalAddress.s_addr = inet_addr(optarg);
-        else {
-          /* error - invalid IP address */
-          usage("Error: invalid IP address argument for -b option");
-        }
-        break;
-      case 'S':
-        engp->socket_sndbuf = atoi(optarg);
-        if (engp->socket_sndbuf == 0) {
-          usage("Error: invalid socket send buffer size\n");
-        }
-        break;
-      case 'R':
-        engp->socket_rcvbuf = atoi(optarg);
-        if (engp->socket_rcvbuf == 0) {
-          usage("Error: invalid socket receive buffer size\n");
-        }
-        break;
-      case 't':
-        no_output = 1;
-        break;
-      case 'e':
-        strncpy(engp->stats.email, optarg, 99);
-        engp->stats.email[99] = '\0';
-        is_v4 = 1;
-        break;
-      case 'd':
-        delay = atoi(optarg);
-        use_delay = 1;
-        break;
-      case 'p':
-        strncpy(engp->stats.pwd, optarg, 99);
-        engp->stats.pwd[99] = '\0';
-        is_v4 = 1;
-        break;
-      case 'n':
-        repeat = atoi(optarg);
-        if (repeat == 0 && optarg[0] != '0') {
-          /* error. non-number argument */
-          usage("Error: invalid argument to -n option");
-        }
-        break;
-      case 'v':
-        verbosity = atoi(optarg);
-        if (verbosity == 0 && optarg[0] != '0') {
-          /* error - missing argument */
-          usage("Error: invalid argument to -v option");
-        }
-        break;
-      case 's':
-        syslog_verbosity = atoi(optarg);
-        if (syslog_verbosity == 0 && optarg[0] != '0') {
-          /* error - missing argument */
-          usage("Error: invalid argument to -s option");
-        }
-        break;
-      case '?':
-      default:
-        usage("Error: command line syntax error");
-    }
-  }
-  argc -= optind;
-  argv += optind;
-
-  /* check test params for individual tests */
-  switch (selectedMode) {
-    case CLM_UDP_SEND:
-    case CLM_UDP_RECV:
-    case CLM_UDP_FDX:
-      /* determine test params */
-      if (argc == 4) {
-        engp->sessionTime = atoi(argv[0]);
-        engp->bitsPerSecond = atoi(argv[1]);
-	strncpy(engp->hostName, argv[2], TP_HOST_NAME_SIZE);
-        engp->hostCtrlPort = atoi(argv[3]);
-        RecalculatePPSSZ(engp);
-      }
-      else if (argc == 5) {
-        engp->sessionTime = atoi(argv[0]);
-        engp->packetSize = atoi(argv[1]);
-        engp->packetsPerSecond = atoi(argv[2]);
-	strncpy(engp->hostName, argv[3], TP_HOST_NAME_SIZE);
-        engp->hostCtrlPort = atoi(argv[4]);
-      }
-      /* check that we have necessary values */
-      if (engp->sessionTime == 0) 
-        usage("Error: no test session time set");
-      if (engp->bitsPerSecond == 0) {
-        if (engp->packetsPerSecond == 0 || engp->packetSize == 0)
-          usage("Error: no bitrate (or packet size + packet rate) set");
-      }
-      break;
-    case CLM_TCP_SEND:
-    case CLM_TCP_RECV:
-      if (argc == 4) {
-        engp->sessionMaxTime = atoi(argv[0]);
-        engp->tcpBytes = atoi(argv[1]);
-	strncpy(engp->hostName, argv[2], TP_HOST_NAME_SIZE);
-        engp->hostCtrlPort = atoi(argv[3]);
-      }
-      if (engp->sessionMaxTime == 0)
-        usage("Error: no max time set for test session");
-      if (engp->tcpBytes == 0)
-        usage("Error: number of TCP bytes to transfer not set");
-      break;
-    case CLM_AUTO_TCP_SEND:
-    case CLM_AUTO_TCP_RECV:
-    case CLM_AUTO_TCP:
-      if (argc == 2) {
-	strncpy(engp->hostName, argv[0], TP_HOST_NAME_SIZE);
-        engp->hostCtrlPort = atoi(argv[1]);
-      }
-      break;
-    default:
-      /* shouldn't happen */
-      usage("Error: unknown test mode");
-  }
-
-  if (argc < 2) {
-    /* error - need server and server port as commandline args */
-    usage("Error: need server address and control port");
-  }
-
-  if (engp->hostCtrlPort == 0) {
-    /* error - invalid server port argument */
-    usage("Error: invalid server control port argument");
-  }
-
-  /* check server address argument */
-  if (inet_addr(engp->hostName) == INADDR_NONE) {
-    struct hostent * hent;
-    hent = gethostbyname(engp->hostName);
-    if (hent == NULL) {
-      log_error("Error: hostname lookup failed");
-      exit(1);
-    }
-    engp->hostIP.s_addr = ((struct in_addr *)(hent->h_addr))->s_addr;
-  }
-  else 
-    engp->hostIP.s_addr = inet_addr(engp->hostName);
-
-  engp->tpMode = CLM_NONE;
-
-  /* init syslog, if we want that facility */
-  if (syslog_verbosity) {
-    openlog("tptestclient", LOG_CONS | LOG_PID, LOG_USER);
-  }
-
-  engp->stats.MajorVersion = MAJORVERSION;
-  engp->stats.MinorVersion = MINORVERSION;
-
-  if (is_v4) {
-    delay = 30;
-    use_delay = 1;
-  }
-
-  /* ********************************* */
-  /* Main loop. May run multiple tests */
-  /* ********************************* */
-
-  while (1) {
-
-    time(&starttime);
-
-    /* Inner main loop. This loop runs individual tests or auto-tests */
-
-    while (1) {
-
-      /* use AdvanceTest() to set test params and new test mode */
-      engp->tpMode = AdvanceTest(engp, selectedMode, engp->tpMode, 0);
-      if (engp->tpMode == CLM_NONE)
-        break;
-
-      /* initiate new test */
-      if (StartClientContext(engp) != 0) {
-        log_error("Error: StartClientContext() failed");
-        exit(1);
-      }
-
-      not_checked = 1;
-
-      if (engp->tpMode == CLM_TCP_SEND || engp->tpMode == CLM_TCP_RECV) {
-        sprintf(output_text, "Server: %s:%u  Test:%d  Time:%u  Maxtime:%u  Bytes: %u\n",
-          inet_ntoa(engp->hostIP), engp->hostCtrlPort, 
-          (int)engp->tpMode, (unsigned int)engp->sessionTime, 
-          (unsigned int)engp->sessionMaxTime, (unsigned int)engp->tcpBytes);
-      }
-      else {
-        sprintf(output_text, "Server: %s:%u  Test:%d  Time:%u  Maxtime:%u  Bitrate: %s\n",
-          inet_ntoa(engp->hostIP), engp->hostCtrlPort, 
-          (int)engp->tpMode, (unsigned int)engp->sessionTime, 
-          (unsigned int)engp->sessionMaxTime, Int32ToString(engp->bitsPerSecond));
-      }
-      log_text(2);
-
-      /* run test until finished or an error occurs */
-      while (1) {
-        if (engp->state == CLSM_FAILED) {
-          /* Backoff algorithm to avoid overloading the servers. */
-          /* If we fail more than 2 consecutive times, we increase */
-          /* the delay between tests. If we succeed more than two */
-          /* consecutive times, we decrease the delay between tests */
-          /* (down to a minimum of 30 seconds) */
-          if (is_v4) {
-            succeeds = 0;
-            if (++fails > 2) {
-              delay += 30;
-              fails = 0;
-            }
-          }
-          sprintf(output_text, "Test failed. Failcode:%d  Ioerror:%d\n", 
-            (int)engp->failCode, (int)engp->ioError);
-          log_text(0);
-          break;
-        }
-        else if (engp->state == CLSM_COMPLETE) {
-          /* more backoff stuff */
-          if (is_v4) {
-            fails = 0;
-            if (++succeeds > 2) {
-              delay -= 30;
-              if (delay < 30)
-                delay = 30;
-              succeeds = 0;
-            }
-          }
-          break;
-        }
-        else if (engp->state == CLSM_TESTLOOP && not_checked) {
-          not_checked = 0;
-          if (engp->socket_sndbuf != 0) {
-            sprintf(output_text, "Wanted SO_SNDBUF: %d   Actual SO_SNDBUF: %d\n",
-              engp->socket_sndbuf, engp->cur_socket_sndbuf); log_text(2);
-          }
-          if (engp->socket_rcvbuf != 0) {
-            sprintf(output_text, "Wanted SO_RCVBUF: %d   Actual SO_RCVBUF: %d\n",
-              engp->socket_rcvbuf, engp->cur_socket_rcvbuf); log_text(2);
-          }
-        }
-        RunClientContext(engp);
-      }
-
-      if (engp->state == CLSM_COMPLETE && 
-         (selectedMode != CLM_UDP_SEND && 
-          selectedMode != CLM_UDP_RECV && 
-          selectedMode != CLM_UDP_FDX) ) {
-        tmp = (engp->stats.BytesRecvd * 8.0) / 
-               timediff(&engp->stats.StartRecv, &engp->stats.StopRecv);
-        sprintf(output_text, "Received %u/%u bytes in %0.2f seconds.\n",
-          (unsigned int)engp->stats.BytesRecvd, (unsigned int)engp->tcpBytes, 
-	  (double)timediff(&engp->stats.StartRecv, &engp->stats.StopRecv) / 1000000.0);
-        log_text(2);
-      }
-
-      /* sleep 0.5 seconds before starting next test, if any */
-      nanosleep(&sleeptime, NULL);
-
-    }
-
-    /* note when this test stopped */
-
-    time(&stoptime);
-
-    /* Update starting values for TCP tests so future tests will find */
-    /* optimal value for tcpBytes quicker */
-
-    if (engp->bestTCPRecvRate > 0.0)
-      engp->start_tcprecv_bytes = engp->bestTCPRecvRate * 20;
-    if (engp->bestTCPSendRate > 0.0)
-      engp->start_tcpsend_bytes = engp->bestTCPSendRate * 20;
-
-    /* report results */
-    ReportResults(selectedMode, engp, &starttime, &stoptime);
-
-    /* perform more tests or quit? */
-    if (repeat != 0) {
-      if (--repeat <= 0)
-        break;
-    }
-
-    /* perform more tests */
-    engp->tpMode = CLM_NONE;
-    engp->bestTCPRecvRate = 0.0f;
-    engp->bestTCPSendRate = 0.0f;
-    engp->bestUDPRecvRate = 0.0f;
-    engp->bestUDPSendRate = 0.0f;
-
-    if (use_delay) {
-      sprintf(output_text, "Sleeping %d seconds until next test...\n", delay); log_text(2);
-      sleep(delay);
-    }
-
-  }
-
-  return 0;
-
-}
-
-
-void log_text(int level) {
-  if (no_output) return;
-  if (syslog_verbosity >= level)
-    syslog(LOG_NOTICE, output_text);
-  if (verbosity >= level)
-    printf(output_text);
-}
-
-
-void ReportResults(int selectedMode, TPEngine *engp, time_t * starttime, time_t * stoptime) {
-  int throughput;
-  LONG_LONG recvtime;
-  struct tm *tmPnt;
-
-  sprintf(output_text, "Test results:\n");  log_text(1);
-  sprintf(output_text, "-------------\n");  log_text(1);
-  sprintf(output_text, "Server: %s:%d\n", inet_ntoa(engp->hostIP), engp->hostCtrlPort);  log_text(1);
-  sprintf(output_text, "Test:   %d\n", selectedMode);  log_text(1);
-
-  if (selectedMode == CLM_UDP_SEND || selectedMode == CLM_UDP_RECV ||
-      selectedMode == CLM_TCP_SEND || selectedMode == CLM_TCP_RECV ||
-      selectedMode == CLM_UDP_FDX) {
-    sprintf(output_text, "Time:	%lu            Timelimit:    %lu\n",
-      engp->sessionTime, engp->sessionMaxTime);  log_text(1);
-  }
-
-  sprintf(output_text, "Test started: %s", ctime(starttime));  log_text(1);
-  sprintf(output_text, "Test ended:   %s", ctime(stoptime));  log_text(1);
-
-  /* report results from an auto test (series of tests) */
-
-  if (selectedMode == CLM_AUTO_TCP || selectedMode == CLM_AUTO_TCP_SEND) {
-    /* report best TCP SEND results */
-    sprintf(output_text, "TCP Send: %d bps (%s)\n",
-      (int)(engp->bestTCPSendRate * 8.0), Int32ToString((int)(engp->bestTCPSendRate * 8.0)));
-    log_text(0);
-  }
-  if (selectedMode == CLM_AUTO_TCP || selectedMode == CLM_AUTO_TCP_RECV) {
-    /* report best TCP RECV results */
-    sprintf(output_text, "TCP Recv: %d bps (%s)\n",
-      (int)(engp->bestTCPRecvRate * 8.0), Int32ToString((int)(engp->bestTCPRecvRate * 8.0)));
-    log_text(0);
-  }
-  if (selectedMode == CLM_AUTO_TCP_SEND || selectedMode == CLM_AUTO_TCP_RECV ||
-      selectedMode == CLM_AUTO_TCP) {
-    return;
-  }
-
-  /* report results from an individual test */
-
-  if (selectedMode == CLM_TCP_SEND || selectedMode == CLM_TCP_RECV) {
-    sprintf(output_text, "TCP Bytes: %lu\n", engp->tcpBytes);  log_text(1);
-  }
-  else {
-    sprintf(output_text, "# of packets: %lu\n", engp->nPackets);  log_text(1);
-    sprintf(output_text, "Packetsize:   %lu\n", engp->packetSize);  log_text(1);
-  }
-
-  tmPnt = localtime( (time_t *)(&engp->stats.StartSend.tv_sec) );
-  sprintf(output_text, "Send start: %04d-%02d-%02d %02d:%02d:%02d.%03ld\n",
-    tmPnt->tm_year + 1900, tmPnt->tm_mon + 1, tmPnt->tm_mday,
-    tmPnt->tm_hour, tmPnt->tm_min, tmPnt->tm_sec,
-    engp->stats.StartSend.tv_usec / 1000L );  log_text(1);
-	
-  tmPnt = localtime( (time_t *)(&engp->stats.StopSend.tv_sec) );
-  sprintf(output_text, "Send stop : %04d-%02d-%02d %02d:%02d:%02d.%03ld\n",
-    tmPnt->tm_year + 1900, tmPnt->tm_mon + 1, tmPnt->tm_mday,
-    tmPnt->tm_hour, tmPnt->tm_min, tmPnt->tm_sec,
-    engp->stats.StopSend.tv_usec / 1000L );  log_text(1);
-
-  tmPnt = localtime( (time_t *)(&engp->stats.StartRecv.tv_sec) );
-  sprintf(output_text, "Recv start: %04d-%02d-%02d %02d:%02d:%02d.%03ld\n",
-    tmPnt->tm_year + 1900, tmPnt->tm_mon + 1, tmPnt->tm_mday,
-    tmPnt->tm_hour, tmPnt->tm_min, tmPnt->tm_sec,
-    engp->stats.StartRecv.tv_usec / 1000L );  log_text(1);
-
-  tmPnt = localtime( (time_t *)(&engp->stats.StopRecv.tv_sec) );
-  sprintf(output_text, "Recv stop : %04d-%02d-%02d %02d:%02d:%02d.%03ld\n",
-    tmPnt->tm_year + 1900, tmPnt->tm_mon + 1, tmPnt->tm_mday,
-    tmPnt->tm_hour, tmPnt->tm_min, tmPnt->tm_sec,
-    engp->stats.StopRecv.tv_usec / 1000L );  log_text(1);
-
-  if (selectedMode == CLM_UDP_SEND || selectedMode == CLM_UDP_RECV || selectedMode == CLM_UDP_FDX) {
-    sprintf(output_text, "Packets sent:     %lu\n", engp->stats.PktsSent);  log_text(1);
-    sprintf(output_text, "Packets received: %lu\n", engp->stats.PktsRecvd);  log_text(1);
-    sprintf(output_text, "Packets lost:     %lu (%0.2f%%)\n", engp->stats.PktsSent - engp->stats.PktsRecvd, 
-      ((float)(engp->stats.PktsSent - engp->stats.PktsRecvd) / (float)engp->stats.PktsSent) * 100.0);  
-    log_text(1);
-    sprintf(output_text, "Packets unsent:   %lu\n", engp->stats.PktsUnSent);  log_text(1);
-    sprintf(output_text, "OO Packets:       %lu\n", engp->stats.ooCount);  log_text(1);
-    if (selectedMode == CLM_UDP_FDX) {
-      if (engp->stats.nRoundtrips > 0) {
-        sprintf(output_text, "Max roundtrip: %0.3fms\n", 
-          (double)engp->stats.MaxRoundtrip / 1000.0);  log_text(1);
-        sprintf(output_text, "Min roundtrip: %0.3fms\n", 
-          (double)engp->stats.MinRoundtrip / 1000.0);  log_text(1);
-        sprintf(output_text, "Avg roundtrip: %0.3fms\n", 
-          ((double)engp->stats.TotalRoundtrip / (double)engp->stats.nRoundtrips) / 1000.0);  log_text(1);
-      }
-    }
-  }
-  sprintf(output_text, "Bytes sent: %" LONG_LONG_PREFIX "d\n", engp->stats.BytesSent); log_text(1);
-  sprintf(output_text, "Bytes rcvd: %" LONG_LONG_PREFIX "d\n", engp->stats.BytesRecvd); log_text(1);
-  recvtime = timediff(&engp->stats.StartRecv, &engp->stats.StopRecv);
-  if (recvtime > 0) 
-    throughput = (int)((double)(engp->stats.BytesRecvd * 8)/((double)recvtime / 1000000.0));
-  else
-    throughput = 0;
-  sprintf(output_text, "Throughput: %d bps (%s)\n", (int)throughput, Int32ToString((int)throughput));
-  log_text(0);
-}
-
-LONG_LONG timediff(struct timeval * tv1, struct timeval * tv2) {
-  LONG_LONG t1, t2;
-  t1 = (LONG_LONG)tv1->tv_sec * (LONG_LONG)1000000 + 
-       (LONG_LONG)tv1->tv_usec;
-  t2 = (LONG_LONG)tv2->tv_sec * (LONG_LONG)1000000 + 
-       (LONG_LONG)tv2->tv_usec;
-  return t1 > t2 ? t1 - t2 : t2 - t1;
-}
-
-void log_error(char *str) {
-  fprintf(stderr, "%s\n", str);
-  if (syslog_verbosity)
-    syslog(LOG_ERR, "%s\n", str);
-}
diff --git a/tptest/src/getopt.c b/tptest/src/getopt.c
deleted file mode 100644
index c9bb7afcceb024406d54b41b114a2d01e40042ab..0000000000000000000000000000000000000000
--- a/tptest/src/getopt.c
+++ /dev/null
@@ -1,126 +0,0 @@
-#ifndef UNIX
-
-/*
- * Copyright (c) 1987, 1993, 1994
- *      The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *      This product includes software developed by the University of
- *      California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-/*
- * static char sccsid[] = "from: @(#)getopt.c   8.2 (Berkeley) 4/2/94"; 
- */
-static char    *rcsid =
-    "$Id: getopt.c,v 1.1 2004/04/07 13:23:00 rlonn Exp $";
-#endif                          /* LIBC_SCCS and not lint */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef _BSD
-extern char    *__progname;
-#else
-#define __progname "getopt"
-#endif
-
-int             opterr = 1,     /* if error message should be printed */
-                optind = 1,     /* index into parent argv vector */
-                optopt,         /* character checked for validity */
-                optreset;       /* reset getopt */
-char           *optarg;         /* argument associated with option */
-char            EMSG[] = "";
-
-#define BADCH   (int)'?'
-#define BADARG  (int)':'
-
-/*
- * getopt --
- *      Parse argc/argv argument vector.
- */
-int
-getopt(int nargc, char *const *nargv, const char *ostr)
-{
-    static char    *place = EMSG;       /* option letter processing */
-    char           *oli;        /* option letter list index */
-
-    if (optreset || !*place) {  /* update scanning pointer */
-        optreset = 0;
-        if (optind >= nargc || *(place = nargv[optind]) != '-') {
-            place = EMSG;
-            return (-1);
-        }
-        if (place[1] && *++place == '-') {      /* found "--" */
-            ++optind;
-            place = EMSG;
-            return (-1);
-        }
-    }                           /* option letter okay? */
-    if ((optopt = (int) *place++) == (int) ':' ||
-        !(oli = strchr(ostr, optopt))) {
-        /*
-         * if the user didn't specify '-' as an option,
-         * assume it means -1.
-         */
-        if (optopt == (int) '-')
-            return (-1);
-        if (!*place)
-            ++optind;
-        if (opterr && *ostr != ':')
-            (void) fprintf(stderr,
-                           "%s: illegal option -- %c\n", __progname,
-                           optopt);
-        return (BADCH);
-    }
-    if (*++oli != ':') {        /* don't need argument */
-        optarg = NULL;
-        if (!*place)
-            ++optind;
-    } else {                    /* need an argument */
-        if (*place)             /* no white space */
-            optarg = place;
-        else if (nargc <= ++optind) {   /* no arg */
-            place = EMSG;
-            if (*ostr == ':')
-                return (BADARG);
-            if (opterr)
-                (void) fprintf(stderr,
-                               "%s: option requires an argument -- %c\n",
-                               __progname, optopt);
-            return (BADCH);
-        } else                  /* white space */
-            optarg = nargv[optind];
-        place = EMSG;
-        ++optind;
-    }
-    return (optopt);            /* dump back option letter */
-}
-
-#endif
diff --git a/tptest/src/tpclient.c b/tptest/src/tpclient.c
deleted file mode 100644
index 8fa4f369d2b1503d015a4529768860fbe84fac1c..0000000000000000000000000000000000000000
--- a/tptest/src/tpclient.c
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- * $Id: tpclient.c,v 1.9 2004/03/22 20:49:12 rlonn Exp $
- * $Source: /cvsroot/tptest/engine/tpclient.c,v $
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpclient.c - test client support functions
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-
-#include "tpclient.h"
-#include "tpengine.h"
-
-void RecalculatePPSSZ(TPEngine *);
-int AdvanceTest(TPEngine *, int, int, int);
-
-#ifdef UNIX
-double min(double a, double b) { return a < b ? a : b; }
-#endif
-
-/*
-// Recalculate good PPS and Packetsize values after the user has changed
-// the desired data rate. Most modern PCs can output several thousand UDP packets
-// per second without stalling due to CPU shortage so I have changed the old
-// behaviour somewhat: this program increases the packetsize up to 1400
-// bytes then starts increasing the packet rate until it reaches 3000 pps.
-// It doesn't continue increasing the packet size before reaching 3000 pps.
-// This function also decreases packet rate and size until the data rate
-// matches the desired data rate as closely as possible.
-//
-*/
-
-void RecalculatePPSSZ(TPEngine *engp)
-{
-	if (engp->bitsPerSecond > 
-		(engp->packetsPerSecond * engp->packetSize * 8)) {
-		while (engp->bitsPerSecond > (engp->packetsPerSecond * engp->packetSize * 8)) {
-			while (engp->packetsPerSecond < 20) {
-				engp->packetsPerSecond++;
-				continue;
-			}
-			if (engp->packetSize < 1400) {
-				engp->packetSize++;
-				continue;
-			}
-			if (engp->packetsPerSecond < 3000) {
-				engp->packetsPerSecond++;
-				continue;
-			}
-			if (engp->packetSize < 32000) {
-				engp->packetSize++;
-				continue;
-			}
-			if (engp->packetsPerSecond < 6000) {
-				engp->packetsPerSecond++;
-				continue;
-			}
-			if (engp->packetSize < 65000) {
-				engp->packetSize++;
-				continue;
-			}
-			engp->packetsPerSecond++;
-		}
-	}
-	else if (engp->bitsPerSecond < (engp->packetsPerSecond * engp->packetSize * 8)) {
-		while (engp->bitsPerSecond < (engp->packetsPerSecond * engp->packetSize * 8)) {
-			if (engp->packetsPerSecond > 6000) {
-				engp->packetsPerSecond--;
-				continue;
-			}
-			if (engp->packetSize > 32000) {
-				engp->packetSize--;
-				continue;
-			}
-			if (engp->packetsPerSecond > 3000) {
-				engp->packetsPerSecond--;
-				continue;
-			}
-			if (engp->packetSize > 1400) {
-				engp->packetSize--;
-				continue;
-			}
-			if (engp->packetsPerSecond > 20) {
-				engp->packetsPerSecond--;
-				continue;
-			}
-			if (engp->packetSize > MIN_PKT_SIZE) {
-				engp->packetSize--;
-				continue;
-			}
-			engp->packetsPerSecond--;
-		}
-	}
-	// Lower value so we don't *exceed* selected datarate
-	while ((engp->packetsPerSecond * engp->packetSize * 8) > engp->bitsPerSecond)
-	{
-		if (engp->packetsPerSecond > 10 || engp->packetSize == 60)
-			engp->packetsPerSecond--;
-		else
-			engp->packetSize--;
-	}
-
-	engp->nPackets = 0;
-}
-
-
-
-
-int AdvanceTest(TPEngine * engp, int SelMode, int Cur, int LastRet)
-{
-	double BytesPerSecondRecv;
-
-	static double LastBytesPerSecondRecv = 0;
-	static double bestTCPSendRate = 0;
-	static double bestTCPRecvRate = 0;
-	static double bestUDPSendRate = 0;
-	static double bestUDPRecvRate = 0;
-
-	int msRecv;
-
-	if (Cur != CLM_NONE) {
-		msRecv = ( engp->stats.StopRecv.tv_sec - engp->stats.StartRecv.tv_sec ) * 1000;
-		msRecv += ( engp->stats.StopRecv.tv_usec - engp->stats.StartRecv.tv_usec ) / 1000;
-		
-		if( msRecv != 0 )
-			BytesPerSecondRecv = ( (double)(engp->stats.BytesRecvd) * 1000.0 )
-								/ (double)(msRecv);
-		else
-			BytesPerSecondRecv = 0.0;
-	}
-	else {
-		LastBytesPerSecondRecv = 0;
-		bestTCPSendRate = bestTCPRecvRate = bestUDPSendRate = bestUDPRecvRate = 0.0;
-	}
-
-	switch (SelMode) {
-	
-		case CLM_AUTO:
-			switch (Cur) {
-				case CLM_NONE:
-					engp->tcpBytes = engp->start_tcpsend_bytes;
-					engp->sessionMaxTime = 60;
-					LastBytesPerSecondRecv = 0.0;
-					return CLM_TCP_SEND;
-				case CLM_TCP_SEND:
-					if (msRecv < 18000 && LastRet == 0) {
-						// aim for 20 secs if last receive time was > 1 sec
-                        // The *5 multiplication can work badly for connections
-                        // with high, but very fluctuating bandwidth
-                        if (msRecv > 1000) 
-						    engp->tcpBytes = (UINT32)
-							    min(	(float)(engp->tcpBytes) * 5.0, 
-									((float)(engp->tcpBytes) * (20000.0 / (float)msRecv))
-								    );
-                        else
-						    engp->tcpBytes = (UINT32)(engp->tcpBytes * 1.8);
-						return Cur;
-					}
-					if (BytesPerSecondRecv > bestTCPSendRate) { 
-						bestTCPSendRate = BytesPerSecondRecv;
-					}
-					if (BytesPerSecondRecv > engp->bestTCPSendRate) {
-						engp->bestTCPSendRate = BytesPerSecondRecv;
-					}
-					LastBytesPerSecondRecv = 0.0;
-					engp->tcpBytes = engp->start_tcprecv_bytes;
-					engp->sessionMaxTime = 60;
-					return CLM_TCP_RECV;
-				case CLM_TCP_RECV:
-					if (msRecv < 18000 && LastRet == 0) {
-						// aim for 20 secs if last receive time was > 1 sec
-                        // The *5 multiplication can work badly for connections
-                        // with high, but very fluctuating bandwidth
-                        if (msRecv > 1000) 
-						    engp->tcpBytes = (UINT32)
-							    min(	(float)(engp->tcpBytes) * 5.0, 
-									((float)(engp->tcpBytes) * (20000.0 / (float)msRecv))
-								    );
-                        else
-						    engp->tcpBytes = (UINT32)(engp->tcpBytes * 1.8);
-						return Cur;
-					}
-					if (BytesPerSecondRecv > bestTCPRecvRate) { 
-						bestTCPRecvRate = BytesPerSecondRecv;
-					}
-					if (BytesPerSecondRecv > engp->bestTCPRecvRate) {
-						engp->bestTCPRecvRate = BytesPerSecondRecv;
-					}
-					LastBytesPerSecondRecv = 0.0;
-					if ((bestTCPSendRate * 8) < 20000.0)
-						engp->bitsPerSecond = 20000;
-					else
-						engp->bitsPerSecond = (UINT32)((bestTCPSendRate*8)*0.75);
-					engp->sessionTime = 5;
-					RecalculatePPSSZ(engp);
-					return CLM_UDP_SEND;
-				case CLM_UDP_SEND:
-					if (engp->stats.PktsRecvd > ((engp->nPackets / 2) + 1) && LastRet == 0) {
-						if (BytesPerSecondRecv > bestUDPSendRate) { 
-							bestUDPSendRate = BytesPerSecondRecv;
-						}
-						if (BytesPerSecondRecv > engp->bestUDPSendRate) {
-							engp->bestUDPSendRate = BytesPerSecondRecv;
-						}
-						if (BytesPerSecondRecv > (LastBytesPerSecondRecv * 1.1)) {
-							engp->bitsPerSecond = (int)((double)(engp->bitsPerSecond) * 1.5);
-							RecalculatePPSSZ(engp);
-							LastBytesPerSecondRecv = BytesPerSecondRecv;
-							return Cur;
-						}
-					}
-					LastBytesPerSecondRecv = 0.0;
-					if ((bestTCPRecvRate * 8) < 20000.0)
-						engp->bitsPerSecond = 20000;
-					else
-						engp->bitsPerSecond = (UINT32)((bestTCPRecvRate*8)*0.75);
-					engp->sessionTime = 5;
-					RecalculatePPSSZ(engp);
-					return CLM_UDP_RECV;
-				case CLM_UDP_RECV: /// ***
-					if (engp->stats.PktsRecvd > ((engp->nPackets / 2) + 1) && LastRet == 0) {
-						if (BytesPerSecondRecv > bestUDPRecvRate) { 
-							bestUDPRecvRate = BytesPerSecondRecv;
-						}
-						if (BytesPerSecondRecv > engp->bestUDPRecvRate) {
-							engp->bestUDPRecvRate = BytesPerSecondRecv;
-						}
-						if (BytesPerSecondRecv > (LastBytesPerSecondRecv * 1.1)) {
-							engp->bitsPerSecond = (int)((double)(engp->bitsPerSecond) * 1.5);
-							RecalculatePPSSZ(engp);
-							LastBytesPerSecondRecv = BytesPerSecondRecv;
-							return Cur;
-						}
-					}
-					return CLM_NONE;
-					
-				default: // not reached
-					return CLM_NONE;
-			}
-			// not reached
-		
-		case CLM_AUTO_TCP:
-			if (Cur == M_NONE) {
-				engp->tcpBytes = engp->start_tcpsend_bytes;
-				engp->sessionMaxTime = 60;
-				return CLM_TCP_SEND;
-			}
-			if (msRecv < 18000 && LastRet == 0) {
-				// aim for 20 secs if last receive time was > 1 sec
-                		// The *5 multiplication can work badly for connections
-                		// with high, but very fluctuating bandwidth
-                		if (msRecv > 1000) 
-   				    engp->tcpBytes = (UINT32)
-					    min(	(float)(engp->tcpBytes) * 5.0, 
-							((float)(engp->tcpBytes) * (20000.0 / (float)msRecv))
-    					    );
-                		else
-				    engp->tcpBytes = (UINT32)(engp->tcpBytes * 1.8);
-			    	return Cur;
-			}
-			if (Cur == M_TCP_SEND) {
-				if (BytesPerSecondRecv > engp->bestTCPSendRate) { 
-					engp->bestTCPSendRate = BytesPerSecondRecv;
-				}
-				if (BytesPerSecondRecv > bestTCPSendRate) {
-					bestTCPSendRate = BytesPerSecondRecv;
-				}
-				engp->tcpBytes = engp->start_tcprecv_bytes;
-				engp->sessionMaxTime = 60;
-				return CLM_TCP_RECV;
-			}
-			else {
-				if (BytesPerSecondRecv > engp->bestTCPRecvRate) { 
-					engp->bestTCPRecvRate = BytesPerSecondRecv;
-				}
-				if (BytesPerSecondRecv > bestTCPRecvRate) {
-					bestTCPRecvRate = BytesPerSecondRecv;
-				}
-			}
-			return CLM_NONE;
-	
-		case CLM_AUTO_TCP_SEND:
-		case CLM_AUTO_TCP_RECV:
-			if (Cur == M_NONE) {
-				engp->sessionMaxTime = 60;
-				if (SelMode == CLM_AUTO_TCP_SEND) {
-					engp->tcpBytes = engp->start_tcpsend_bytes;
-					return CLM_TCP_SEND;
-				}
-				else {
-					engp->tcpBytes = engp->start_tcprecv_bytes;
-					return CLM_TCP_RECV;
-				}
-			}
-			if (msRecv < 18000 && LastRet == 0) {
-				// aim for 20 secs if last receive time was > 1 sec
-                		// The *5 multiplication can work badly for connections
-                		// with high, but very fluctuating bandwidth
-                		if (msRecv > 1000) 
-   				    engp->tcpBytes = (UINT32)
-					    min(	(float)(engp->tcpBytes) * 5.0, 
-							((float)(engp->tcpBytes) * (20000.0 / (float)msRecv))
-    					    );
-                		else
-				    engp->tcpBytes = (UINT32)(engp->tcpBytes * 1.8);
-			    	return Cur;
-			}
-			if (Cur == M_TCP_SEND) {
-				if (BytesPerSecondRecv > engp->bestTCPSendRate) { 
-					engp->bestTCPSendRate = BytesPerSecondRecv;
-				}
-				if (BytesPerSecondRecv > bestTCPSendRate) {
-					bestTCPSendRate = BytesPerSecondRecv;
-				}
-			}
-			else {
-				if (BytesPerSecondRecv > engp->bestTCPRecvRate) { 
-					engp->bestTCPRecvRate = BytesPerSecondRecv;
-				}
-				if (BytesPerSecondRecv > bestTCPRecvRate) {
-					bestTCPRecvRate = BytesPerSecondRecv;
-				}
-			}
-			return CLM_NONE;
-			
-		case CLM_AUTO_UDP_SEND:
-		case CLM_AUTO_UDP_RECV:
-			if (Cur == M_NONE) {
-				engp->bitsPerSecond = 30000;
-				engp->sessionTime = 5;
-				RecalculatePPSSZ(engp);
-				if (SelMode == CLM_AUTO_UDP_SEND)
-					return CLM_UDP_SEND;
-				else
-					return CLM_UDP_RECV;
-			}
-			if (engp->stats.PktsRecvd > ((engp->nPackets / 2) + 1) && LastRet == 0) {
-				if (Cur == M_UDP_SEND) {
-					if (BytesPerSecondRecv > engp->bestUDPSendRate) { 
-						engp->bestUDPSendRate = BytesPerSecondRecv;
-					}
-					if (BytesPerSecondRecv > bestUDPSendRate) {
-						bestUDPSendRate = BytesPerSecondRecv;
-					}
-				}
-				else {
-					if (BytesPerSecondRecv > engp->bestUDPRecvRate) { 
-						engp->bestUDPRecvRate = BytesPerSecondRecv;
-					}
-					if (BytesPerSecondRecv > bestUDPRecvRate) {
-						bestUDPRecvRate = BytesPerSecondRecv;
-					}
-				}
-				if (BytesPerSecondRecv > (LastBytesPerSecondRecv * 1.1)) {
-					engp->bitsPerSecond = (int)((double)(engp->bitsPerSecond) * 1.5);
-					engp->sessionTime = 5;
-					RecalculatePPSSZ(engp);
-					LastBytesPerSecondRecv = BytesPerSecondRecv;
-					return Cur;
-				}
-			}
-			return CLM_NONE;
-			
-		case CLM_AUTO_SEND:
-			switch (Cur) {
-				case CLM_NONE:
-					engp->tcpBytes = engp->start_tcpsend_bytes;
-					engp->sessionMaxTime = 60;
-					return CLM_TCP_SEND;
-				case CLM_TCP_SEND:
-					if (msRecv < 18000 && LastRet == 0) {
-						// aim for 20 secs if last receive time was > 1 sec
-                        // The *5 multiplication can work badly for connections
-                        // with high, but very fluctuating bandwidth
-                        if (msRecv > 1000) 
-						    engp->tcpBytes = (UINT32)
-							    min(	(float)(engp->tcpBytes) * 5.0, 
-									((float)(engp->tcpBytes) * (20000.0 / (float)msRecv))
-								    );
-                        else
-						    engp->tcpBytes = (UINT32)(engp->tcpBytes * 1.8);
-						return Cur;
-					}
-					if (BytesPerSecondRecv > engp->bestTCPSendRate) { 
-						engp->bestTCPSendRate = BytesPerSecondRecv;
-					}
-					if (BytesPerSecondRecv > bestTCPSendRate) {
-						bestTCPSendRate = BytesPerSecondRecv;
-					}
-					LastBytesPerSecondRecv = 0.0;
-					if ((engp->bestTCPSendRate * 8) < 20000.0)
-						engp->bitsPerSecond = 20000;
-					else
-						engp->bitsPerSecond = (UINT32)((bestTCPSendRate * 8)*0.75);
-					engp->sessionTime = 5;
-					RecalculatePPSSZ(engp);
-					return CLM_UDP_SEND;
-				case CLM_UDP_SEND:
-
-					if (engp->stats.PktsRecvd > ((engp->nPackets / 2) + 1) && LastRet == 0) {
-						if (BytesPerSecondRecv > engp->bestUDPSendRate) { 
-							engp->bestUDPSendRate = BytesPerSecondRecv;
-						}
-						if (BytesPerSecondRecv > bestUDPSendRate) {
-							bestUDPSendRate = BytesPerSecondRecv;
-						}
-						if (BytesPerSecondRecv > (LastBytesPerSecondRecv * 1.1)) {
-							engp->bitsPerSecond = (int)((double)(engp->bitsPerSecond) * 1.5);
-							engp->sessionTime = 5;
-							RecalculatePPSSZ(engp);
-							LastBytesPerSecondRecv = BytesPerSecondRecv;
-							return Cur;
-						}
-					}
-					return CLM_NONE;
-			}
-			return CLM_NONE;
-			
-		case CLM_AUTO_RECV:
-			switch (Cur) {
-				case CLM_NONE:
-					engp->tcpBytes = engp->start_tcprecv_bytes;
-					engp->sessionMaxTime = 60;
-					return CLM_TCP_RECV;
-					
-				case CLM_TCP_RECV:
-					if (msRecv < 18000 && LastRet == 0) {
-						// aim for 20 secs if last receive time was > 1 sec
-                        // The *5 multiplication can work badly for connections
-                        // with high, but very fluctuating bandwidth
-                        if (msRecv > 1000) 
-						    engp->tcpBytes = (UINT32)
-							    min(	(float)(engp->tcpBytes) * 5.0, 
-									((float)(engp->tcpBytes) * (20000.0 / (float)msRecv))
-								    );
-                        else
-						    engp->tcpBytes = (UINT32)(engp->tcpBytes * 1.8);
-						return Cur;
-					}
-					if (BytesPerSecondRecv > engp->bestTCPRecvRate) { 
-						engp->bestTCPRecvRate = BytesPerSecondRecv;
-					}
-					if (BytesPerSecondRecv > bestTCPRecvRate) {
-						bestTCPRecvRate = BytesPerSecondRecv;
-					}
-					LastBytesPerSecondRecv = 0.0;
-					if ((engp->bestTCPRecvRate * 8) < 20000.0)
-						engp->bitsPerSecond = 20000;
-					else
-						engp->bitsPerSecond = (UINT32)((bestTCPRecvRate * 8)*0.75);
-					engp->sessionTime = 5;
-					RecalculatePPSSZ(engp);					
-					return CLM_UDP_RECV;
-					
-				case CLM_UDP_RECV:
-					if (engp->stats.PktsRecvd > ((engp->nPackets / 2) + 1) && LastRet == 0) {
-						if (BytesPerSecondRecv > engp->bestUDPRecvRate) { 
-							engp->bestUDPRecvRate = BytesPerSecondRecv;
-						}
-						if (BytesPerSecondRecv > bestUDPRecvRate) {
-							bestUDPRecvRate = BytesPerSecondRecv;
-						}
-						if (BytesPerSecondRecv > (LastBytesPerSecondRecv * 1.1)) {
-							engp->bitsPerSecond = (int)((double)(engp->bitsPerSecond) * 1.5);
-							engp->sessionTime = 5;
-							RecalculatePPSSZ(engp);
-							LastBytesPerSecondRecv = BytesPerSecondRecv;
-							return Cur;
-						}
-					}
-					return CLM_NONE;
-			}
-			return CLM_NONE;
-		
-			
-		case CLM_TCP_SEND:
-			if (Cur == CLM_NONE) return SelMode;
-			if (msRecv >= 18000 && LastRet == 0) {
-				if (BytesPerSecondRecv > engp->bestTCPSendRate) { 
-					engp->bestTCPSendRate = BytesPerSecondRecv;
-				}
-			}
-			return CLM_NONE;
-			
-		case CLM_TCP_RECV:
-			if (Cur == CLM_NONE) return SelMode;
-			if (msRecv >= 18000 && LastRet == 0) {
-				if (BytesPerSecondRecv > engp->bestTCPRecvRate) { 
-					engp->bestTCPRecvRate = BytesPerSecondRecv;
-				}
-			}
-			return CLM_NONE;
-
-		case CLM_UDP_SEND:
-			if (Cur == CLM_NONE) return SelMode;
-			if (engp->stats.PktsRecvd > ((engp->nPackets / 2) + 1) &&
-				LastRet == 0) {
-				if (BytesPerSecondRecv > engp->bestUDPSendRate) { 
-					engp->bestUDPSendRate = BytesPerSecondRecv;
-				}
-			}
-			return CLM_NONE;
-
-		case CLM_UDP_RECV:
-			if (Cur == CLM_NONE) return SelMode;
-			if (engp->stats.PktsRecvd > ((engp->nPackets / 2) + 1) &&
-				LastRet == 0) {
-				if (BytesPerSecondRecv > engp->bestUDPRecvRate) { 
-					engp->bestUDPRecvRate = BytesPerSecondRecv;
-				}
-			}
-			return CLM_NONE;
-
-		case CLM_UDP_FDX:
-			if (Cur == CLM_NONE) return SelMode;
-			return CLM_NONE;
-
-		case CLM_QUERY_MASTER:
-			if (Cur == CLM_NONE) return SelMode;
-			return CLM_NONE;
-
-		case CLM_NAME_LOOKUP:
-			if (Cur == CLM_NONE) return SelMode;
-			return CLM_NONE;
-
-			// not reached
-	}
-	// not reached
-	return 0;
-}
diff --git a/tptest/src/tpclient.h b/tptest/src/tpclient.h
deleted file mode 100644
index 3b2e99d9a254aba40ef819521be54c3c5891d55c..0000000000000000000000000000000000000000
--- a/tptest/src/tpclient.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * $Id: tpclient.h,v 1.4 2004/03/22 20:49:12 rlonn Exp $
- * $Source: /cvsroot/tptest/engine/tpclient.h,v $
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpclient.h - header file
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-#ifndef _TPCLIENT_H_
-#define _TPCLIENT_H_
-
-#include "tpengine.h"
-
-/*
-* Modes recognized by tpengine.c and tpclient.c
-*/
-#define CLM_NONE		M_NONE
-#define CLM_UDP_FDX		M_UDP_FDX
-#define CLM_UDP_SEND		M_UDP_SEND
-#define CLM_UDP_RECV		M_UDP_RECV
-#define CLM_TCP_SEND		M_TCP_SEND
-#define CLM_TCP_RECV		M_TCP_RECV
-#define CLM_QUERY_MASTER	M_QUERY_MASTER
-#define CLM_NAME_LOOKUP		M_NAME_LOOKUP
-
-/*
-* Modes used exclusively by tpclient.c
-*/
-#define	CLM_SERVER_MODE		301
-#define CLM_AUTO		302
-#define	CLM_AUTO_TCP_SEND	303
-#define	CLM_AUTO_TCP_RECV	304
-#define CLM_AUTO_UDP_SEND	305
-#define CLM_AUTO_UDP_RECV	306
-#define	CLM_AUTO_SEND		307
-#define	CLM_AUTO_RECV		308
-#define CLM_AUTO_TCP		309
-
-// Client defaults
-
-#define DEFAULT_TCPBYTES	(START_TCP_BYTES * 2)
-#define DEFAULT_TESTTIME	10
-#define MIN_PKT_SIZE ( sizeof( struct tpHeader ) + IP_UDP_SIZE )
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-void RecalculatePPSSZ(TPEngine *);
-int AdvanceTest(TPEngine *, int, int, int);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif // _TPCLIENT_H_
-
-
diff --git a/tptest/src/tpcommon.c b/tptest/src/tpcommon.c
deleted file mode 100644
index a38793036e5741c3518af661a6a630be3c017a9a..0000000000000000000000000000000000000000
--- a/tptest/src/tpcommon.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
- * $Id: tpcommon.c,v 1.6 2004/03/22 20:49:12 rlonn Exp $
- * $Source: /cvsroot/tptest/engine/tpcommon.c,v $
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpcommon.c - common TPTEST functions
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *  Hans Green <hg@3tag.com>
- *
- * Based on earlier work by
- *  Hans N�st�n
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-
-#ifdef UNIX
-#include <sys/time.h>
-#endif
-
-#include "tpengine.h"
-#include "tpcommon.h"
-#include "tpio.h"
-
-
-
-/*
- * Convert a int value to a string formatted as
- * "64.25 kbit/s" or "10.16 Mbit/s" or "103 bit/s".
- */
-
-char *Int32ToString( int iVal )
-{
-        static char sBuf[ 256 ];
-
-        if ( iVal >= TP_1MBPS ) {
-                sprintf( sBuf, "%.2f Mbit/s", (double)(iVal) / (double)(TP_1MBPS) );
-        } else if( iVal > TP_1KBPS ) {
-                sprintf( sBuf, "%.2f kbit/s", (double)(iVal) / (double)(TP_1KBPS ) );
-        } else {
-                sprintf( sBuf, "%d bit/s", iVal );
-        }
-        return( sBuf );
-}
-
-
-
-/*
- * Convert a ulong value to a string formatted as
- * "64.25 Kbyte" or "10.16 Mbyte" or "103 byte".
- */
-char *UInt32ToString( UINT32 lVal )
-{
-  static char sBuf[ 256 ];
-
-  if ( lVal >= 1024*1024 ) {
-    sprintf( sBuf, "%.2f Mbyte",
-	      (double)(lVal) / ( 1024.0 * 1024.0 ) );
-  }
-  else if( lVal > 1024 ) {
-    sprintf( sBuf, "%.2f Kbyte", (double)(lVal) / 1024.0 );
-  }
-  else {
-    sprintf( sBuf, "%lu byte", lVal );
-  }
-  return( sBuf );
-
-}
-
-
-
-
-
-/* ---------------------------------------------------------- SameTag ---- *\
-
-        Description:    Case independent tag name compare
-
-        Input:          s1 - string one
-                                s2 - string two
-
-        Return:         1 - same tag, 0 - not same
-        
-\* ----------------------------------------------------------------------- */
-
-int SameTag(char *s1, char *s2)
-{
-        char     c1, c2;
-        
-        for (;;) {
-                c1 = *s1++ & 255; 
-                c2 = *s2++ & 255;
-                
-                if (c1 == 0 || c2 == 0) return (c1 == c2);
-                if (c1 >= 'a') c1 -= ('a' -'A');
-                if (c2 >= 'a') c2 -= ('a' -'A');
-                if (c1 !=  c2) return 0;
-        }
-}
-
-
-/* ----------------------------------------------------- CopyTagField ---- *\
-
-        Description:    Extract value field in 'x1=yy;x2=yy;'-type string
-
-        Input:          destp           Ptr to dest area
-                                destSize        Size of dest area (including NUL byte)
-                                srcp            Ptr to data (terminated by char < ' ')
-                                pname           Tag to look for
-
-        Return:         1 if tag found
-                                0 if tag not found
-
-\* ----------------------------------------------------------------------- */
-
-int CopyTagField(
-        char    *destp,
-        int             destSize,
-        char    *srcp,
-        char    *pname)
-{
-        char            *cp, *dp;
-        char            *savep, *delp;
-        char            *valp;
-        int                     len, cnt;
-        char            idBuf[20];
-
-        cp = srcp;
-		while (*cp) {
-                savep = cp;
-                valp = strchr(savep, '=');
-                if (valp == 0) goto done;                       /* No more assigns */
-
-                delp = strchr(savep, ';');
-                if (delp && delp < valp) {                      /* Skip some leading junk */
-                        cp = delp + 1;
-                        continue;
-                }
-                len = valp - savep;
-                if (len < sizeof(idBuf)) {
-                        memcpy(idBuf, savep, len);
-                        idBuf[len] = 0;
-
-                        if (SameTag(idBuf, pname)) {            /* Found the tag */                         
-                                valp += 1;
-                                for (cnt = 0, dp = destp ; *valp ; valp++) {
-                                        if (*valp == ';' || (*valp & 255) < ' ') {
-                                                break;
-                                        }
-                                        if (cnt < destSize - 1) {
-                                                *dp++ = *valp;
-                                                cnt += 1;
-                                        }
-                                }
-                                *dp = 0;
-                                return 1;
-                        }
-                }
-                
-                /* Skip until next field */
-                /* ===================== */
-                
-                for (cp = valp ; *cp != ';' ; cp++) if (*cp == 0) goto done;
-
-                cp += 1;                                                        /* Bypass delimiter 
-*/
-        }
-done:
-        return 0;                                                               /* Not found */
-}
-
-
-// Fill a tpStats structure with the contents from a STATS line
-int GetStatsFromLine(char *line, TPStats *s)
-{
-	char valBuf[30];
-
-	if (strncmp(line, "STATS ", 6) != 0)
-		return -1;
-	memset(valBuf, 0, 30);
-
-	if (CopyTagField(valBuf, 29, line+6, "majorv"))
-		s->MajorVersion = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "minorv"))
-		s->MinorVersion = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "pktssent"))
-		s->PktsSent = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "pktsunsent"))
-		s->PktsUnSent = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "pktsrcvd"))
-		s->PktsRecvd = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "bytessent"))
-		sscanf(valBuf, "%" LONG_LONG_PREFIX "d", &(s->BytesSent));
-	if (CopyTagField(valBuf, 29, line+6, "bytesrcvd"))
-		sscanf(valBuf, "%" LONG_LONG_PREFIX "d", &(s->BytesRecvd));
-	if (CopyTagField(valBuf, 29, line+6, "maxrtt"))
-		s->MaxRoundtrip = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "minrtt"))
-		s->MinRoundtrip = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "oocount"))
-		s->ooCount = atoi(valBuf);
-
-	if (CopyTagField(valBuf, 29, line+6, "txstart_s"))
-		s->StartSend.tv_sec = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "txstart_us"))
-		s->StartSend.tv_usec = atoi(valBuf);
-
-	if (CopyTagField(valBuf, 29, line+6, "txstop_s"))
-		s->StopSend.tv_sec = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "txstop_us"))
-		s->StopSend.tv_usec = atoi(valBuf);
-
-	if (CopyTagField(valBuf, 29, line+6, "rxstart_s"))
-		s->StartRecv.tv_sec = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "rxstart_us"))
-		s->StartRecv.tv_usec = atoi(valBuf);
-
-	if (CopyTagField(valBuf, 29, line+6, "rxstop_s"))
-		s->StopRecv.tv_sec = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "rxstop_us"))
-		s->StopRecv.tv_usec = atoi(valBuf);
-
-	if (CopyTagField(valBuf, 29, line+6, "totrtt"))
-		s->TotalRoundtrip = atoi(valBuf);
-	if (CopyTagField(valBuf, 29, line+6, "nortt"))
-		s->nRoundtrips = atoi(valBuf);
-
-	if (CopyTagField(valBuf, 101, line + 6, "email"))
-		strcpy(s->email, valBuf);
-
-	if (CopyTagField(valBuf, 101, line + 6, "pwd"))
-		strcpy(s->pwd, valBuf);
-
-	return 0;
-
-}
-
-
-
-// Create a STATS line from a tpStats structure
-char * CreateLineFromStats(TPStats *s, char *destp)
-{
-	sprintf(destp, "STATS majorv=%u;minorv=%u;pktssent=%lu;pktsunsent=%lu;pktsrcvd=%lu;"
-		"bytessent=%" LONG_LONG_PREFIX "d;bytesrcvd=%" LONG_LONG_PREFIX "d;"
-		"maxrtt=%lu;minrtt=%lu;totrtt=%lu;nortt=%lu;oocount=%lu;txstart_s=%ld;txstart_us=%ld;"
-		"txstop_s=%ld;txstop_us=%ld;rxstart_s=%ld;rxstart_us=%ld;"
-		"rxstop_s=%ld;rxstop_us=%ld;email=%s;pwd=%s",
-		s->MajorVersion, s->MinorVersion, s->PktsSent, s->PktsUnSent,
-		s->PktsRecvd, s->BytesSent, s->BytesRecvd, s->MaxRoundtrip,
-		s->MinRoundtrip, s->TotalRoundtrip, s->nRoundtrips, s->ooCount,
-		(s->StartSend.tv_sec), (s->StartSend.tv_usec),
-		(s->StopSend.tv_sec), (s->StopSend.tv_usec),
-		(s->StartRecv.tv_sec), (s->StartRecv.tv_usec),
-		(s->StopRecv.tv_sec), (s->StopRecv.tv_usec), s->email, s->pwd );
-	return destp;
-}
-
-
-
-// Get 3-digit reply code from a reply string
-int ReplyCode(char * str)
-{
-	int ret;
-	
-	ret = atoi(str);
-	if (ret < 1000 && ret > 99) return ret;
-	return 0;
-}
-
-
-
-#ifdef NO_HTONL
-/* ------------------------------------------------------------ htonl ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-long htonl(long l)
-{
-	long			ti, to;
-	unsigned char	*ucp;
-	
-	ucp = (unsigned char *) &ti;
-	ti = 1;
-	if (ucp[3] == 1) return l; 			// Running on hi-endian
-		
-	ti = l;
-	to = ucp[3];
-	to = (to << 8) + ucp[2];
-	to = (to << 8) + ucp[1];
-	to = (to << 8) + ucp[0];
-	return to;
-}
-#endif // NO_HTONL
-
-
-
-#ifdef NO_NTOHL
-/* ------------------------------------------------------------ ntohl ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-long ntohl(long l)
-{
-	long			ti, to;
-	unsigned char	*ucp;
-	
-	ucp = (unsigned char *) &ti;
-	ti = 1;
-	if (ucp[3] == 1) return l; 			// Running on hi-endian
-		
-	ti = l;
-	to = ucp[0];
-	to = (to << 8) + ucp[1];
-	to = (to << 8) + ucp[2];
-	to = (to << 8) + ucp[3];
-	return to;
-}
-#endif // NO_NTOHL
-
-
-/* -------------------------------------------------------- TVAddUSec ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-void	TVAddUSec(struct timeval *tp, int usecs)
-{
-	tp->tv_usec += usecs;
-	if (tp->tv_usec > 1000000) {
-		tp->tv_sec += tp->tv_usec / 1000000;
-		tp->tv_usec = tp->tv_usec % 1000000;
-	}
-}
-
-/* -------------------------------------------------------- TVCompare ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int		TVCompare(struct timeval *tp1, struct timeval *tp2)
-{
-	if (tp1->tv_sec > tp2->tv_sec) return 1;
-	if (tp1->tv_sec < tp2->tv_sec) return -1;
-	if (tp1->tv_usec > tp2->tv_usec) return 1;
-	if (tp1->tv_usec < tp2->tv_usec) return -1;
-	return 0;
-}
-
-
-#ifdef TRCLOG
-
-/* ----------------------------------------------------------- TrcLog ---- *\
-
-	Typical usage in program
-	
-	if (debugWanted) {
-		TrcSetFile("MYDEBUG.LOG");		// Please log to file "MYDEBUG.LOG"
-		TrcSetOptions(TRCOPT_STDERR);	// Please log to stderr
-		TrcEnable(1);					// Enable bit 1
-	}
-	
-	And the to get conditional runtime log:
-	
-	TrcLog(1, "Running version %d", version);	// Message without newline
-	
-\* ----------------------------------------------------------------------- */
-
-static char	logFileName[200];
-static FILE *logFp;
-static unsigned long logDebugBits;
-static unsigned long trcOptions;
-
-void TrcClose(void)
-{
-	if (logFp == 0) return;
-	fclose(logFp);
-	logFp = 0;
-}
-void TrcSetFile(char *fileName)
-{
-	TrcClose();
-	strncpy(logFileName, fileName, sizeof(logFileName));
-	logFileName[sizeof(logFileName) -1] = 0;
-	return;
-}
-unsigned long TrcSetOptions(unsigned long options)
-{
-	trcOptions |= options;
-	return trcOptions;
-}
-int TrcLog(unsigned long theBits, char *format, ...)
-{
-	char		timeBuf[40];
-	time_t		tid;
-	struct tm	*tp;
-	va_list		argp;
-
-	va_start(argp, format);
-	
-	if ((theBits & logDebugBits) == 0) return 0;
-	
-	time(&tid);
-	tp = localtime(&tid);
-	sprintf(timeBuf, "%02d-%02d:%02d.%02d.%02d", tp->tm_mon, tp->tm_mday,
-		tp->tm_hour, tp->tm_min, tp->tm_sec);
-
-	if (logFp == 0 && logFileName[0] != 0) {
-		logFp = fopen(logFileName, "a");
-	}
-	if (logFp) {
-		fprintf(logFp, "%s: ", timeBuf);
-	 	vfprintf(logFp, format, argp);
-		fprintf(logFp, "\n");
-	}
-	if (trcOptions & TRCOPT_STDERR) {
-		fprintf(stderr, "%s: ", timeBuf);
-	 	vfprintf(stderr, format, argp) ;
-		fprintf(stderr, "\n");
-	}
-	return 1;
-}
-unsigned long TrcEnable(unsigned long bits)
-{
-	logDebugBits |= bits;
-	return logDebugBits;
-}
-
-
-
-#endif    /* TRCLOG */
diff --git a/tptest/src/tpcommon.h b/tptest/src/tpcommon.h
deleted file mode 100644
index be813bc63155774ce57c5177cd79195d69c33b52..0000000000000000000000000000000000000000
--- a/tptest/src/tpcommon.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * $Id: tpcommon.h,v 1.4 2002/09/16 14:10:42 rlonn Exp $
- * $Source: /cvsroot/tptest/engine/tpcommon.h,v $
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpcommon.h - header file
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *  Hans Green <hg@3tag.com>
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-#ifndef _TPCOMMON_H_
-#define _TPCOMMON_H_
-
-#include "tpengine.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-int SameTag(char *s1, char *s2);
-int CopyTagField(char *destp, int destSize, char *srcp, char *pname);
-int GetSessionFromLine(char *, TPEngine *);
-char * CreateSessionLine(TPEngine *, char *);
-int GetStatsFromLine(char *, TPStats *);
-char * CreateLineFromStats(TPStats *, char *);
-int ReplyCode(char *);
-void TVAddUSec(struct timeval *, int);
-int	TVCompare(struct timeval *, struct timeval *);
-char *Int32ToString( int );
-char *UInt32ToString( UINT32 );
-
-#ifdef NO_HTONL
-long htonl(long);
-#endif
-
-#ifdef NO_NTOHL
-long ntohl(long);
-#endif
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif	// _TPCOMMON_H_
-
diff --git a/tptest/src/tpengine.c b/tptest/src/tpengine.c
deleted file mode 100644
index 9912d960000ac5586008e9eac3f89d17ac0b70f2..0000000000000000000000000000000000000000
--- a/tptest/src/tpengine.c
+++ /dev/null
@@ -1,1990 +0,0 @@
-/*
- * $Id: tpengine.c,v 1.14 2004/03/22 20:49:12 rlonn Exp $
- * $Source: /cvsroot/tptest/engine/tpengine.c,v $
- *	
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpengine.c - main test engine code
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *  Hans Green <hg@3tag.com>
- *
- * Based on earlier work by
- *  Hans N�st�n
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-#include <stdio.h>
-#include <time.h>
-#include "tpengine.h"
-#include "tpcommon.h"
-#include "tpio.h"
-
-#ifndef MAXINT
-#define MAXINT INT_MAX
-#endif
-
-// *** init tcpDataSock in DoTCPSend/DoTCPRecv?
-
-
-// Implemented in this file (tpengine.c)
-int 	AddServerToList(TPEngine *engp, char * str);
-int	CheckHelloReply(TPEngine *);
-int	CheckServerBanner(TPEngine *);
-int	CheckStatsMsg(TPEngine *);
-int	CheckTestReply(TPEngine *);
-int 	CheckTestMessage(TPEngine *);
-void 	ClearBestRates(TPEngine *);
-void 	ClearServerList(TPEngine *engp);
-TPEngine *CreateContext(void);
-void 	DeleteContext(TPEngine *);
-int 	DoClientTCPRecv(TPEngine *);
-int 	DoClientTCPSend(TPEngine *);
-int 	DoClientUDPDuplex(TPEngine *);
-int 	DoClientUDPRecv(TPEngine *);
-int 	DoClientUDPSend(TPEngine *);
-int 	DoNameLookup(TPEngine *engp);
-int 	DoQueryMaster(TPEngine	*);
-int 	DoServerTCPSend(TPEngine *);
-int 	DoServerTCPRecv(TPEngine *);
-int 	DoServerUDPDuplex(TPEngine *);
-int 	DoServerUDPRecv(TPEngine *);
-int 	DoServerUDPSend(TPEngine *);
-void 	FailSession(TPEngine *, int);
-char 	*GetSMStateName(TPEngine *, int);
-void 	GenerateUDPDataPacket(TPEngine *);
-int 	RunClientContext(TPEngine *);
-int 	RunServerContext(TPEngine *);
-int 	SendHeloLine(TPEngine *);
-int 	SendStatLine(TPEngine *);
-int 	SendTCPTestData(TPEngine *);
-int 	SendTestLine(TPEngine *);
-int 	SendTestOKMessage(TPEngine *);
-int 	SendUDPDataPacket(TPEngine *);
-void	SetSMState(TPEngine *, int);
-void	SetTimeLimit(TPEngine *, int);
-void	SetTimeLimit2(TPEngine *, int);
-int 	StartClientContext(TPEngine *);
-int 	StartServerContext(TPEngine *);
-void 	StopContext(TPEngine *);
-int 	TimeLimitExceeded(TPEngine *);
-void 	InitRandBuf(void *, int);
-
-
-char *clientModes[] = {
-	"NONE",
-	"IDLE", "CONNECTING", "CONNECTED", "WAITPORTS", "NATOPEN",
-	"TESTLOOP", "SENDSTAT", "WAITSTAT", "DELAYQUIT", "TERM_WAIT", "FAILED",
-	"SENDMHELO", "SERVERLIST", "COMPLETE", "DATACONNECTING"
-};
-#define MAX_CLIENT_STRING	(sizeof(clientModes) / sizeof(clientModes[0]))
-
-
-char *GetSMStateName(TPEngine *engp, int state)
-{
-	char	*cp		= "??";
-	
-	if (state < 0) return cp;
-	
-	switch (engp->tpMode) {
-	
-	case M_TCP_SEND:
-	case M_TCP_RECV:
-	case M_UDP_SEND:
-	case M_UDP_RECV:
-	case M_UDP_FDX:
-		if (state < MAX_CLIENT_STRING) cp = clientModes[state];
-		break;
-	}
-	return cp;
-}
-
-
-
-int StartClientContext(
-	TPEngine	*engp)
-{
-
-	int res;
-
-	// Check supplied values, init packetInterval, set executor function
-	switch (engp->tpMode) {
-
-	case M_UDP_SEND:
-	case M_UDP_RECV:
-	case M_UDP_FDX:
-
-		if (engp->sessionTime <= 0) goto failexit;
-		if (engp->sessionMaxTime <= 0) {
-			if ((engp->sessionTime + 10) > (engp->sessionTime * 2))
-				engp->sessionMaxTime = engp->sessionTime + 10;
-			else				
-				engp->sessionMaxTime = engp->sessionTime * 2;
-		}
-		if (engp->nPackets <= 0) {
-			if (engp->packetsPerSecond <= 0) goto failexit;
-			engp->nPackets = engp->packetsPerSecond * engp->sessionTime;
-		}
-		if (engp->packetSize <= 0) goto failexit;
-
-		engp->packetInterval = (engp->sessionTime * 1000000) / engp->nPackets;
-		engp->packetsPerSecond = 1000000 / engp->packetInterval;
-		engp->bitsPerSecond = engp->packetsPerSecond * engp->packetSize * 8;
-
-		switch (engp->tpMode) {
-
-		case M_UDP_FDX:
-			engp->executor = DoClientUDPDuplex;
-			break;
-
-		case M_UDP_RECV:
-			engp->executor = DoClientUDPRecv;
-			break;
-
-		case M_UDP_SEND:
-			engp->executor = DoClientUDPSend;
-			break;
-		}
-			
-		break;
-
-	case M_TCP_SEND:
-	case M_TCP_RECV:
-
-		if (engp->sessionMaxTime <= 0) 
-			goto failexit;
-		if (engp->tcpBytes <= 0) 
-			goto failexit;
-		if (engp->tpMode == M_TCP_SEND) 
-			engp->executor = DoClientTCPSend;
-		else
-			engp->executor = DoClientTCPRecv;
-		break;
-
-	case M_QUERY_MASTER:
-		engp->executor = DoQueryMaster;
-		break;
-
-	case M_NAME_LOOKUP:
-		engp->executor = DoNameLookup;
-		break;
-
-	default:
-		// Illegal mode
-		goto failexit;
-	}
-
-    SetSMState(engp, CLSM_IDLE);
-	engp->failCode = 0;
-	engp->timeLimit = 0;
-	engp->curSend = 0;
-	engp->iAmServer = 0;
-	engp->callMeAgain = 50000;
-	engp->ioError = 0;
-	engp->active = 1;
-	time(&engp->startTime);
-
-	if (engp->tpMode == M_NAME_LOOKUP) {
-		int timeLimit = 
-			engp->sessionMaxTime < 30 ? 30 : engp->sessionMaxTime;
-		SetTimeLimit(engp, timeLimit);
-		if (engp->wipeFlag) {
-			int i;
-			for (i = 0; i < engp->numHostIP; i++) {
-				engp->hostIPTab[i].s_addr = 0;
-			}
-			engp->numHostIP = 0;
-			engp->wipeFlag = 0;
-		}
-		res = InitNameLookup(engp);
-		if (res == 0) {
-			SetSMState(engp, CLSM_NAMELOOKUP);
-		}
-		else {
-			FailSession(engp, TPER_NLINITFAIL);
-		}
-	} 
-
-	engp->stats.PktsSent = engp->stats.PktsUnSent = engp->stats.PktsRecvd = 0;
-	engp->stats.BytesSent = engp->stats.BytesRecvd = 0;
-	engp->stats.MaxRoundtrip = 0;
-	engp->stats.MinRoundtrip = 999999999;
-	engp->stats.ooCount = 0;
-	engp->prevPacket = 0;
-	return 0;
-
-	failexit:
-		SetSMState(engp, CLSM_FAILED);
-		engp->executor = 0;
-		return -1;
-}
-
-int DoNameLookup(
-	TPEngine	*engp)
-{
-	int				res;
-	res = ContinueNameLookup(engp);
-	if (res != 0) {
-		FailSession(engp, TPER_NLFAIL);
-	}
-	return engp->state;
-}
-
-
-int RunClientContext(
-	TPEngine	*engp)
-{
-	int				res;
-	
-	// Check if control socket has data or has gone
-	
-	if (CheckCtrlOpen(engp)) {
-		res = SendCtrlData(engp);
-		if (res != 0) {
-			FailSession(engp, TPER_CTRLCLOSED);
-			return 0;
-		}
-		res = ConsumeCtrlData(engp);
-		if (res != 0) {
-			FailSession(engp, TPER_CTRLCLOSED);
-			return 0;
-		}
-	}
-	
-	if (engp->active == 0) return 0;
-	if (engp->executor == 0) return 0;
-
-	// Check if long timer has run out
-	
-	if (TimeLimitExceeded(engp)) {
-		FailSession(engp, TPER_TIMEOUT);
-		return 0;
-	}
-
-	switch (engp->state) {
-			
-	case CLSM_FAILED:		// Already failed
-	case CLSM_COMPLETE:		// Already done
-		break;
-				
-	case CLSM_IDLE:			// Starting a new test session
-		
-		ClearCtrlReply(engp);
-		res = InitConnectTCP(engp, TP_SOCKINX_CTRL);		
-		if (res == 0) {
-			SetSMState(engp, CLSM_CONNECTING);
-		} else {
-			FailSession(engp, TPER_NOCTRL);
-			return 0;
-		}
-		// Set time limit to either what's left of our session time or
-		// 20 seconds, if remaining session time is larger
-		SetTimeLimit2(engp, 20);
-		break;
-
-	case CLSM_CONNECTING:
-		if (engp->tcpCtrlConnectComplete) {
-			if (engp->tpMode == M_QUERY_MASTER) {
-				SetSMState(engp, CLSM_SENDMHELO);
-				break;
-			}
-			SetSMState(engp, CLSM_CONNECTED);
-			// Set time limit to either what's left of our session time
-			// or 10 seconds, if remaining session time is larger
-			SetTimeLimit2(engp, 10);
-		}
-		else {
-			res = ContinueConnectTCP(engp);
-			if (res == 0) {
-				// success
-			} else {
-				FailSession(engp, TPER_CONNECTFAIL);
-			}
-		}
-		break;
-		
-	case CLSM_CONNECTED:		// Connected - start test phase
-	
-		if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-		
-		res = CheckServerBanner(engp);				// Handle server welcome
-		if (res != 200) {						// Not the 200 we hoped
-			if (res >= 400 && res <= 499) {
-				FailSession(engp, TPER_SERVERBUSY);
-			}
-			else if (res >= 500 && res <= 599) {
-				FailSession(engp, TPER_SERVERDENY);
-			}
-			else {
-				FailSession(engp, TPER_BADWELCOME);
-			}
-			break;
-		}
-		if (engp->tpMode == M_UDP_SEND
-			|| engp->tpMode == M_UDP_RECV
-			|| engp->tpMode == M_UDP_FDX) {
-			res = InitUDP(engp);                            // Open our UDP sockets
-			if (res != 0) {
-				FailSession(engp, TPER_UDPOPENFAIL);
-				break;
-			}
-		}
-		ClearCtrlReply(engp);
-		SendTestLine(engp);						// Send our TEST message
-		SetSMState(engp, CLSM_WAITPORTS);
-
-		// Set time limit to either what's left of our session time
-		// or 10 seconds, if remaining session time is larger
-		SetTimeLimit2(engp, 10);
-
-		break;
-		
-	case CLSM_DELAYQUIT:
-		{
-			struct timeval nowTV;
-			gettimeofday(&nowTV, NULL);
-			if (TVCompare(&nowTV, &(engp->nextSendTV)) >= 0) {
-				CloseAllSockets(engp);
-				SetSMState(engp, CLSM_COMPLETE);
-			}
-		}
-		break;
-		
-	default:
-	
-		engp->executor(engp);
-	}
-	return 0;
-}
-
-
-
-int StartServerContext(
-	TPEngine	*engp)
-{
-	
-	int res;
-
-	engp->failCode = 0;
-	engp->timeLimit = 0;
-	engp->active = 1;
-	engp->curSend = 0;
-	engp->callMeAgain = 50000;
-	engp->stats.ooCount = 0;
-	engp->prevPacket = 0;
-		
-	time(&engp->startTime);
-	engp->stats.PktsSent = engp->stats.PktsUnSent = engp->stats.PktsRecvd = 0;
-	engp->stats.BytesSent = engp->stats.BytesRecvd = 0;
-	engp->stats.MaxRoundtrip = 0;
-	engp->stats.MinRoundtrip = 999999999;
-
-	res = InitTCPSock(engp, TP_SOCKINX_SCTRL);
-	if (res != 0) {
-		SetSMState(engp, SSM_FAILED);
-		return -1;
-	}
-
-	SetSMState(engp, SSM_LISTEN);
-	engp->iAmServer = 1;
-
-	return 0;
-}
-
-
-int RunServerContext(
-	TPEngine	*engp)
-{
-	int				res;
-	static char tBuf[200];
-	
-	// Check if control socket has data or has gone
-	
-	if (CheckCtrlOpen(engp)) {
-		res = SendCtrlData(engp);
-		if (res < 0) {
-			FailSession(engp, TPER_CTRLCLOSED);
-			return res;
-		}
-		res = ConsumeCtrlData(engp);
-		if (res < 0) {
-			FailSession(engp, TPER_CTRLCLOSED);
-			return res;
-		}
-	}
-	
-	if (engp->active == 0) return 0;
-
-	// Check if long timer has run out
-	
-	if (TimeLimitExceeded(engp)) {
-		FailSession(engp, TPER_TIMEOUT);
-		return 0;
-	}
-
-	switch (engp->state) {
-			
-	case SSM_FAILED:		// Already failed
-	case SSM_COMPLETE:		// Already done
-		break;
-	case SSM_LISTEN:
-		res = AcceptClient(engp, TP_SOCKINX_CTRL);
-		if (res != 0) {
-			FailSession(engp, TPER_ACCEPTFAIL);
-			return res;
-		}
-		if (engp->tcpCtrlConnectComplete) {
-			SetSMState(engp, SSM_SENDWELCOME);
-		}
-		break;
-	case SSM_SENDWELCOME:
-		engp->sessCookie = Rand32();
-		ClearCtrlReply(engp);
-		sprintf(tBuf, "200 vmajor=%d;vminor=%d;cookie=%ld\r\n",
-			MAJORVERSION, MINORVERSION, engp->sessCookie);
-		QueueCtrlData(engp, tBuf);
-		SetSMState(engp, SSM_WAITTEST);
-		SetTimeLimit(engp, 10);
-		break;
-	case SSM_WAITTEST:
-		if (engp->ctrlMessageComplete == 0) break;	// No TEST line yet
-
-		res = CheckTestMessage(engp);				// Handle TEST line. Set executor
-		if (res != 0) {						// Not a valid or accepted TEST line
-			FailSession(engp, TPER_BADTEST);
-			break;
-		}
-		SetSMState(engp, SSM_POSTTEST);
-		break;
-	case SSM_POSTTEST:
-		switch (engp->tpMode) {
-		case M_UDP_RECV:
-		case M_UDP_FDX:
-			SetSMState(engp, SSM_WAITNAT);
-			res = InitUDP(engp);
-			if (res != 0)
-				FailSession(engp, TPER_UDPOPENFAIL);
-			break;
-		case M_UDP_SEND:
-			SetSMState(engp, SSM_TESTLOOP);
-			res = InitUDP(engp);
-			if (res != 0)
-				FailSession(engp, TPER_UDPOPENFAIL);
-			break;
-		case M_TCP_SEND:
-		case M_TCP_RECV:
-			res = InitTCPSock(engp, TP_SOCKINX_SDATA);
-			if (res != 0) {
-				FailSession(engp, TPER_NOTCPDATASOCK);
-				break;
-			}
-			SetSMState(engp, SSM_DATALISTEN);
-			break;
-		}
-		ClearCtrlReply(engp);
-		SendTestOKMessage(engp);
-		SetTimeLimit(engp, engp->sessionMaxTime);
-		break;
-
-	case SSM_DELAYQUIT:
-		{
-			struct timeval nowTV;
-			gettimeofday(&nowTV, NULL);
-			if (TVCompare(&nowTV, &(engp->nextSendTV)) >= 0) {
-				CloseAllSockets(engp);
-				SetSMState(engp, SSM_COMPLETE);
-			}
-		}
-		break;
-
-	default:
-		engp->executor(engp);
-	}
-
-	return 1;
-}
-
-
-int SendTestOKMessage(TPEngine *engp) {
-	char sBuf[200];
-
-	switch (engp->tpMode) {
-	case M_TCP_SEND:
-	case M_TCP_RECV:
-		sprintf(sBuf, "210 tcpdataport=%u\r\n", engp->myTCPDataPort);
-		break;
-	case M_UDP_SEND:
-	case M_UDP_RECV:
-	case M_UDP_FDX:
-		sprintf(sBuf, "210 udpsendport=%d;udprcvport=%d\r\n",
-			engp->myUDPSendPort, engp->myUDPRecvPort);
-		break;
-	}
-
-	QueueCtrlData(engp, sBuf);
-
-	return 0;
-}
-
-
-
-int CheckTestMessage(TPEngine *engp) {
-	
-	char *p;
-	char tBuf[30];
-
-	if (strncmp(engp->ctrlMessage, "TEST ", 5) != 0)
-		return -1;
-
-	p = engp->ctrlMessage + 5;
-	memset(tBuf, 0, 30);
-
-	// Version numbers are optional
-	if (CopyTagField(tBuf, 29, p, "vmajor"))
-		engp->peerMajorVersion = atoi(tBuf);
-	if (CopyTagField(tBuf, 29, p, "vminor"))
-		engp->peerMinorVersion = atoi(tBuf);
-
-	// Possibly mandatory cookie
-	if (engp->sessCookie != 0) {	// Do we want a cookie?
-		if (CopyTagField(tBuf, 29, p, "cookie")) {
-			if (strtoul(tBuf, NULL, 0) != engp->sessCookie) 
-				return TPER_WRONGCOOKIE;  // Cookie mismatch. Error code? ***
-		}
-		else // No cookie present
-			return TPER_NOCOOKIE;
-	}
-
-	// Mandatory test mode
-	if (CopyTagField(tBuf, 29, p, "mode")) {
-		engp->tpMode = atoi(tBuf);
-		switch (engp->tpMode) {
-		case M_UDP_RECV:
-			engp->executor = DoServerUDPSend;
-			break;
-		case M_UDP_SEND:
-			engp->executor = DoServerUDPRecv;
-			break;
-		case M_UDP_FDX:
-			engp->executor = DoServerUDPDuplex;
-			break;
-		case M_TCP_RECV:
-			engp->executor = DoServerTCPSend;
-			break;
-		case M_TCP_SEND:
-			engp->executor = DoServerTCPRecv;
-			break;
-		default:
-			return TPER_WRONGMODE;
-		}
-	}
-	else
-		return TPER_NOMODE;
-
-	// Mode-dependent stuff
-	switch (engp->tpMode) {
-	case M_UDP_SEND:
-	case M_UDP_RECV:
-	case M_UDP_FDX:
-		if (CopyTagField(tBuf, 29, p, "time"))
-			engp->sessionTime = atoi(tBuf);
-		else
-			return TPER_NOTIME;
-		if (CopyTagField(tBuf, 29, p, "npackets"))
-			engp->nPackets = atoi(tBuf);
-		else
-			return TPER_NONPACKETS;
-		if (CopyTagField(tBuf, 29, p, "psize"))
-			engp->packetSize = atoi(tBuf);
-		else
-			return TPER_NOPSIZE;
-		if (CopyTagField(tBuf, 29, p, "udpsendport"))
-			engp->hostUDPSendPort = (unsigned short)atoi(tBuf);
-		else
-			return TPER_NOUDPSENDPORT;
-		if (CopyTagField(tBuf, 29, p, "udprcvport"))
-			engp->hostUDPRecvPort = (unsigned short)atoi(tBuf);
-		else
-			return TPER_NOUDPRECVPORT;
-		// timeout not mandatory
-		if (CopyTagField(tBuf, 29, p, "timeout"))
-			engp->sessionMaxTime = atoi(tBuf);
-		else
-			engp->sessionMaxTime = engp->sessionTime * 2;
-
-		engp->packetInterval = (engp->sessionTime * 1000000) / engp->nPackets;
-		engp->packetsPerSecond = 1000000 / engp->packetInterval;
-		engp->bitsPerSecond = engp->packetsPerSecond * engp->packetSize * 8;
-
-		break;
-	case M_TCP_SEND:
-	case M_TCP_RECV:
-		if (CopyTagField(tBuf, 29, p, "timeout"))
-			engp->sessionMaxTime = atoi(tBuf);
-		else
-			return TPER_NOTIMEOUT;
-		if (CopyTagField(tBuf, 29, p, "tcpbytes"))
-			engp->tcpBytes = strtoul(tBuf, NULL, 0);
-		else
-			return TPER_NOTCPBYTES;
-		if (CopyTagField(tBuf, 29, p, "tcpdataport"))
-			engp->hostTCPDataPort = atoi(tBuf);
-		break;
-	}
-
-	return 0;
-}
-	
-
-
-
-/* ----------------------------------------------------- SendTestLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int	SendTestLine(TPEngine *engp)
-{
-	char			tbuf[400];
-
-	switch (engp->tpMode) {
-
-	case M_UDP_SEND:
-	case M_UDP_RECV:
-	case M_UDP_FDX:
-		sprintf(tbuf, "TEST vmajor=%d;vminor=%d;mode=%ld;time=%lu;npackets=%lu;psize=%lu;cookie=%lu;"
-			"udpsendport=%u;udprcvport=%u;client=%s",
-			MAJORVERSION, MINORVERSION, engp->tpMode, engp->sessionTime, engp->nPackets,
-			engp->packetSize, engp->sessCookie, 
-			engp->myUDPSendPort, engp->myUDPRecvPort, engp->clientInfo);
-		break;
-
-	case M_TCP_SEND:
-	case M_TCP_RECV:
-		sprintf(tbuf, "TEST vmajor=%d;vminor=%d;mode=%ld;timeout=%lu;tcpbytes=%lu;cookie=%lu;"
-			"client=%s",
-			MAJORVERSION, MINORVERSION, engp->tpMode, engp->sessionMaxTime, engp->tcpBytes,
-			engp->sessCookie, engp->clientInfo);
-		break;
-
-	default:
-		return -1;
-	}
-
-	strcat(tbuf, "\r\n");
-	return QueueCtrlData(engp, tbuf);
-}
-
-
-// Send TCP test data
-int SendTCPTestData(TPEngine *engp)
-{
-	int		bytes_to_send;
-	int		off;
-	int		i;	
-	
-	off = Rand32() % RANDBUFSIZE;
-	bytes_to_send = (int)(engp->tcpBytes - engp->stats.BytesSent);
-	
-    bytes_to_send = (int)(engp->tcpBytes - engp->stats.BytesSent);
-	if (bytes_to_send > (RANDBUFSIZE - off))
-        bytes_to_send = RANDBUFSIZE - off;
-	if (bytes_to_send > (int)((engp->tcpBytes / 10) + 1))
-		bytes_to_send = (int)((engp->tcpBytes / 10) + 1);
-
-	i = SendTCPData(engp, engp->randBuf+off, bytes_to_send, TP_SOCKINX_DATA);
-
-	if (i > 0) {
-		if (engp->stats.BytesSent == 0) 
-			gettimeofday(&(engp->stats.StartSend), NULL);
-		engp->stats.BytesSent += i;
-		gettimeofday(&(engp->stats.StopSend), NULL);
-	}
-
-	return i;
-}
-
-
-
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int	SendStatLine(TPEngine *engp)
-{
-	char			tbuf[600];
-
-	CreateLineFromStats(&(engp->stats), tbuf);
-	strcat(tbuf, "\r\n");
-	return QueueCtrlData(engp, tbuf);
-}
-
-
-
-TPEngine *CreateContext(void)
-{
-	int ret = -1;
-	TPEngine	*engp = (TPEngine *) calloc(1, sizeof(TPEngine));
-	if (engp == NULL) {
-		goto fail;
-	}
-	engp->packBufSize = PACKBUFSIZE;
-	engp->packetBuf = malloc(engp->packBufSize);		// Allocate the packet buffer
-	if (engp->packetBuf == NULL) {
-		goto fail;
-	}
-
-	engp->randBufSize = RANDBUFSIZE;
-	engp->randBuf = malloc(engp->randBufSize);
-	if (engp->randBuf == NULL)
-		goto fail;
-
-	ret = InitSessComm(engp);
-
-	InitRandBuf(engp->randBuf, engp->randBufSize);
-
-	engp->start_tcprecv_bytes = engp->start_tcpsend_bytes = START_TCP_BYTES;
-
-	if (ret != 0)
-		goto fail;
-
-	return engp;
-
-fail:
-	if (engp != NULL) {
-		if (engp->packetBuf != NULL) 
-			free(engp->packetBuf);
-		if (engp->randBuf != NULL)
-			free(engp->randBuf);
-		free(engp);
-	}
-	return NULL;
-}
-
-
-
-void DeleteContext(TPEngine * engp) {
-
-	DeleteSessComm(engp);
-	free(engp->randBuf);
-	free(engp->packetBuf);
-	free(engp);
-
-}
-
-
-void ClearBestRates(TPEngine * engp) {
-	engp->bestTCPSendRate = 0;
-	engp->bestTCPRecvRate = 0;
-	engp->bestUDPSendRate = 0;
-	engp->bestUDPRecvRate = 0;
-}
-
-/* ------------------------------------------------ CheckServerBanner ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int		CheckServerBanner(TPEngine *engp)
-{
-	int				rplCode;
-	char tBuf[30];
-	
-	memset(tBuf, 0, 30);
-	rplCode = ReplyCode(engp->ctrlMessage);
-	if (rplCode == 200) {
-		if (CopyTagField(tBuf, 29, engp->ctrlMessage, "vmajor"))
-			engp->peerMajorVersion = atoi(tBuf);
-		if (CopyTagField(tBuf, 29, engp->ctrlMessage, "vminor"))
-			engp->peerMinorVersion = atoi(tBuf);
-		if (CopyTagField(tBuf, 29, engp->ctrlMessage, "cookie"))
-			engp->sessCookie = strtoul(tBuf, NULL, 0);
-	}
-	return rplCode;
-}
-
-
-/* ---------------------------------------------------- CheckTestReply ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int		CheckTestReply(TPEngine *engp)
-{
-	int				rplCode;
-	int				port;
-	char			tBuf[30];
-
-	rplCode = ReplyCode(engp->ctrlMessage);
-
-	if (rplCode == 210) {
-		if (CopyTagField(tBuf, 29, engp->ctrlMessage+4, "tcpdataport")) {
-			port = atoi(tBuf);
-			if (port < 1024 || port > 65535) 
-				return -1;
-			engp->hostTCPDataPort = (unsigned short)port;
-		}
-		if (CopyTagField(tBuf, 29, engp->ctrlMessage+4, "udprcvport")) {
-			port = atoi(tBuf);
-			if (port < 1024 || port > 65535)
-				return -1;
-			engp->hostUDPRecvPort = (unsigned short)port;
-		}
-		if (CopyTagField(tBuf, 29, engp->ctrlMessage+4, "udpsendport")) {
-			port = atoi(tBuf);
-			if (port < 1024 || port > 65535)
-				return -1;
-			engp->hostUDPSendPort = (unsigned short)port;
-		} 
-	}
-
-	return rplCode;
-}
-
-
-
-/* ---------------------------------------------------- CheckStatsMsg ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int		CheckStatsMsg(TPEngine *engp)
-{
-	int				retCode		= 0;
-	TPStats			tmpStat;
-	TPStats			*sp;
-
-	retCode = GetStatsFromLine(engp->ctrlMessage, &tmpStat);
-	if (retCode == 0) {
-		sp = &(engp->stats);
-		if ( (engp->iAmServer && (engp->tpMode == M_TCP_RECV || engp->tpMode == M_UDP_RECV)) ||
-			( !(engp->iAmServer) && (engp->tpMode == M_TCP_SEND || engp->tpMode == M_UDP_SEND))) {
-			sp->BytesRecvd = tmpStat.BytesRecvd;
-			sp->PktsRecvd = tmpStat.PktsRecvd;
-			sp->ooCount = tmpStat.ooCount;
-			sp->StartRecv.tv_sec = tmpStat.StartRecv.tv_sec;
-			sp->StartRecv.tv_usec = tmpStat.StartRecv.tv_usec;
-			sp->StopRecv.tv_sec = tmpStat.StopRecv.tv_sec;
-			sp->StopRecv.tv_usec = tmpStat.StopRecv.tv_usec;
-		}
-		if ((engp->iAmServer && (engp->tpMode == M_TCP_SEND || engp->tpMode == M_UDP_SEND)) ||
-			(!(engp->iAmServer) && (engp->tpMode == M_TCP_RECV || engp->tpMode == M_UDP_RECV))) {
-			sp->BytesSent = tmpStat.BytesSent;
-			sp->PktsSent = tmpStat.PktsSent;
-			sp->PktsUnSent = tmpStat.PktsUnSent;
-			sp->StartSend.tv_sec = tmpStat.StartSend.tv_sec;
-			sp->StartSend.tv_usec = tmpStat.StartSend.tv_usec;
-			sp->StopSend.tv_sec = tmpStat.StopSend.tv_sec;
-			sp->StopSend.tv_usec = tmpStat.StopSend.tv_usec;
-		}
-	}
-	return retCode;
-}
-
-
-void StopContext(TPEngine *engp)
-{
-	CloseAllSockets(engp);
-	if (engp->active == 0) return;
-	FailSession(engp, TPER_USERABORT);
-}
-
-void FailSession(TPEngine *engp, int failCode)
-{
-	engp->failCode = failCode;
-	if (engp->iAmServer)
-		SetSMState(engp, SSM_FAILED);
-	else
-		SetSMState(engp, CLSM_FAILED);
-	CloseAllSockets(engp);
-	engp->active = 0;
-}
-
-void	SetTimeLimit(TPEngine *engp, int limSec)
-{
-	time_t	now;
-	
-	if (limSec == 0) {
-		engp->timeLimit = 0;
-	} else {
-		time(&now);
-		engp->timeLimit = now + limSec;
-	}
-}
-
-
-void	SetTimeLimit2(TPEngine *engp, int limSec)
-{
-	time_t	now;
-	int	newlimit;
-
-	time(&now);
-	
-	if ((engp->sessionMaxTime - (now - engp->startTime)) < (unsigned int)limSec)
-		newlimit = engp->sessionMaxTime - (now - engp->startTime);
-	else
-		newlimit = limSec;
-	if (newlimit == 0)
-		newlimit = -1;
-
-	SetTimeLimit(engp, newlimit);
-}
-
-
-
-int TimeLimitExceeded(TPEngine *engp)
-{
-	time_t	now;
-	
-	if (engp->timeLimit == 0) return 0;		// No timer active
-	
-	time(&now);
-	if (now >= engp->timeLimit) {			// Timer has run out
-		return 1;
-	}
-	return 0;								// No tiemout yet
-}
-
-
-/* ------------------------------------------------------- SetSMState ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-void SetSMState(TPEngine *engp, int state)
-{
-	engp->state = state;
-	if (engp->state == CLSM_COMPLETE) engp->active = 0;
-	if (engp->state == CLSM_FAILED) engp->active = 0;
-	return;
-}
-
-
-/* -------------------------------------------------------- DoSendFSM ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int DoClientUDPSend(
-	TPEngine	*engp)
-{
-	int				redo;
-	int				res;
-	struct timeval	nowTV;
-
-	for (redo = 1 ; redo != 0 ;) {
-	
-		redo = 0;
-		gettimeofday(&nowTV, 0);
-		
-		switch (engp->state) {
-
-		case CLSM_WAITPORTS:		// Waiting for PORTS info
-			engp->callMeAgain = CMA_CLIWAITPORTS;
-			if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-			
-			res = CheckTestReply(engp);				// Look at PORTS reply
-			if (res != 210) {						// Invalid PORTS reply
-				FailSession(engp, TPER_BADPORTS);
-				break;
-			}
-			ClearCtrlReply(engp);
-			SetSMState(engp, CLSM_TESTLOOP);
-			SetTimeLimit2(engp, MAXINT);
-			engp->nextSendTV = nowTV;
-			redo = 1;
-			break;
-			
-		case CLSM_TESTLOOP:		// Running the test
-			engp->callMeAgain = CMA_CLIUDPSEND;
-			if (engp->ctrlMessageComplete != 0) {			// Data seen on ctrl line
-				// Handle Server Data
-				FailSession(engp, TPER_SRVABORT);
-				break;
-			}
-			if (TVCompare(&nowTV, &engp->nextSendTV) >= 0 && 
-				engp->curSend < engp->nPackets) {	// Time for another packet
-				GenerateUDPDataPacket(engp);					// Generate new packet
-				SendUDPDataPacket(engp);						// Send next packet
-				TVAddUSec(&engp->nextSendTV, engp->packetInterval);
-			}
-			if (engp->curSend >= engp->nPackets) {			
-				SetSMState(engp, CLSM_SENDSTAT);			// Data out, send STATS	
-				engp->nextSendTV = nowTV;
-				TVAddUSec(&engp->nextSendTV, USEC_STATDELAY);
-			}
-			break;
-
-		case CLSM_SENDSTAT:
-			engp->callMeAgain = CMA_CLISENDSTAT;
-			if (TVCompare(&nowTV, &engp->nextSendTV) < 0) {	// Not yet time for STATS
-				break;
-			}
-			ClearCtrlReply(engp);
-			SendStatLine(engp);
-			SetSMState(engp, CLSM_WAITSTAT);
-			break;
-		
-		case CLSM_WAITSTAT:
-			engp->callMeAgain = CMA_CLIWAITSTAT;
-			if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-			
-			res = CheckStatsMsg(engp);
-			SetSMState(engp, CLSM_COMPLETE);			// Done	
-			CloseAllSockets(engp);
-			ClearCtrlReply(engp);
-			break;
-		}
-	}
-	return engp->state;
-}
-
-
-
-/* -------------------------------------------------------- DoSendFSM ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int DoServerUDPSend(
-	TPEngine	*engp)
-{
-	int				res;
-	time_t			now;
-	struct timeval	nowTV;
-
-	gettimeofday(&nowTV, 0);
-		
-	switch (engp->state) {
-
-	case SSM_WAITNAT:			// Waiting for NAT-open packet
-		engp->callMeAgain = CMA_SRVWAITNAT;
-		if (engp->ctrlMessageComplete != 0) {			// Data seen on ctrl line
-			// Handle Server Data
-			FailSession(engp, TPER_CLIABORT);
-			break;
-		}
-		ConsumeUDPData(engp);
-		if (engp->natOpen) {
-			/*
-			// We got a NAT-open packet. Return it.
-			tPnt = (TPPacket *)engp->packetBuf;
-			gettimeofday( &(engp->stats.StopRecv), NULL );
-			tPnt->Header.ServerRecvTime.tv_sec = htonl( engp->stats.StopRecv.tv_sec );
-			tPnt->Header.ServerRecvTime.tv_usec = htonl( engp->stats.StopRecv.tv_usec );
-			SendUDPDataPacket(engp);
-*/
-			SetSMState(engp, SSM_TESTLOOP);
-			engp->nextSendTV = nowTV;
-			SetTimeLimit(engp, engp->sessionMaxTime);
-			ClearCtrlReply(engp);
-		}
-		break;
-			
-	case SSM_TESTLOOP:		// Running the test
-		engp->callMeAgain = CMA_SRVUDPSEND;		
-		if (engp->ctrlMessageComplete != 0) {			// Data seen on ctrl line
-			// Handle Client Data
-			FailSession(engp, TPER_CLIABORT);
-			break;
-		}
-
-		if (TVCompare(&nowTV, &engp->nextSendTV) >= 0 &&
-			engp->curSend < engp->nPackets) {	// Time for another packet
-			GenerateUDPDataPacket(engp);
-			SendUDPDataPacket(engp);	// Send next packet
-			TVAddUSec(&engp->nextSendTV, engp->packetInterval);
-		}
-		if (engp->curSend >= engp->nPackets) {			
-			SetSMState(engp, SSM_SENDSTAT);			// Data out, send STATS		
-			engp->nextSendTV = nowTV;
-			TVAddUSec(&engp->nextSendTV, USEC_STATDELAY);
-		}
-		break;
-
-	case SSM_SENDSTAT:
-		engp->callMeAgain = CMA_SRVSENDSTAT;		
-		if (TVCompare(&nowTV, &engp->nextSendTV) < 0) {	// Not yet time for STATS
-			break;
-		}
-		ClearCtrlReply(engp);
-		SendStatLine(engp);
-		SetSMState(engp, SSM_WAITSTAT);
-		SetTimeLimit(engp, 10);
-		break;
-		
-	case SSM_WAITSTAT:
-		engp->callMeAgain = CMA_SRVWAITSTAT;
-		if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-			
-		res = CheckStatsMsg(engp);
-		SetSMState(engp, SSM_COMPLETE);			// Done	
-		CloseAllSockets(engp);
-		time(&now);
-//		sprintf(engp->infoMsg, "Test time was %d seconds for %lld bytes", now - engp->startTime, Stats.BytesSent);
-		break;
-	}
-	return engp->state;
-}
-
-
-
-
-
-/* -------------------------------------------------------- DoRecvFSM ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int DoClientUDPRecv(
-	TPEngine	*engp)
-{
-	int				redo;
-	int				res;
-	struct timeval	nowTV;
-
-	for (redo = 1 ; redo != 0 ;) {
-	
-		redo = 0;
-		gettimeofday(&nowTV, 0);
-		
-		switch (engp->state) {
-
-		case CLSM_WAITPORTS:	// Waiting for PORTS info
-			engp->callMeAgain = CMA_CLIWAITPORTS;
-			if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-			
-			res = CheckTestReply(engp);				// Look at PORTS reply
-			if (res != 210) {						// Invalid PORTS reply
-				FailSession(engp, TPER_BADPORTS);
-				break;
-			}
-			ClearCtrlReply(engp);
-			SetSMState(engp, CLSM_NATOPEN);
-			SetTimeLimit2(engp, 5);
-			engp->natCount = 0;
-			engp->natOpen = 0;
-			engp->packetfromPort = 0;
-			engp->nextSendTV = nowTV;
-			redo = 1;
-			break;
-			
-		case CLSM_NATOPEN:		// Opening NAT ports
-			engp->callMeAgain = CMA_CLINATOPEN;
-			ConsumeUDPData(engp);
-			if (engp->natOpen) {						// We have seen data on UDP port, go on
-				ClearCtrlReply(engp);
-				SetSMState(engp, CLSM_TESTLOOP);
-				SetTimeLimit2(engp, MAXINT);
-				break;
-			}
-			if (TVCompare(&nowTV, &engp->nextSendTV) >= 0) {	// Not yet time to send another
-				engp->natCount += 1;
-				if (engp->natCount > 5) {
-					FailSession(engp, TPER_NATFAIL);
-					break;
-				}
-				SendNATPacket(engp);						// Send next packet
-				engp->nextSendTV = nowTV;
-				TVAddUSec(&engp->nextSendTV, USEC_NATOPEN);
-			}
-			break;
-			
-		case CLSM_TESTLOOP:		// Running the test
-			engp->callMeAgain = CMA_CLIUDPRECV;
-			ConsumeUDPData(engp);
-			if (engp->ctrlMessageComplete == 0) {				// No Stat seen yet
-				break;
-			}
-			res = CheckStatsMsg(engp);
-			if (res != 0) {
-				FailSession(engp, TPER_STATFAIL);
-				break;
-			}
-			SetSMState(engp, CLSM_SENDSTAT);			// Send our STATS		
-			engp->nextSendTV = nowTV;
-			break;
-
-		case CLSM_SENDSTAT:
-			engp->callMeAgain = CMA_CLISENDSTAT;
-			if (TVCompare(&nowTV, &engp->nextSendTV) < 0) {	// Not yet time for STATS
-				break;
-			}
-			ClearCtrlReply(engp);
-			SendStatLine(engp);
-			engp->nextSendTV = nowTV;
-			TVAddUSec(&engp->nextSendTV, USEC_DELAYQUIT);
-			SetSMState(engp, CLSM_DELAYQUIT);
-			break;
-		}
-	}
-	return engp->state;
-}
-
-
-/* -------------------------------------------------------- DoRecvFSM ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int DoServerUDPRecv(
-	TPEngine	*engp)
-{
-	int				res;
-	struct timeval	nowTV;
-
-		gettimeofday(&nowTV, 0);
-		
-	switch (engp->state) {
-			
-	case SSM_TESTLOOP:		// Running the test
-		engp->callMeAgain = CMA_SRVUDPRECV;
-		ConsumeUDPData(engp);
-		if (engp->ctrlMessageComplete == 0) {				// No Stat seen yet
-			break;
-		}
-		res = CheckStatsMsg(engp);
-		SetSMState(engp, SSM_SENDSTAT);			// Send our STATS		
-		engp->nextSendTV = nowTV;
-		break;
-
-	case SSM_SENDSTAT:
-		engp->callMeAgain = CMA_SRVSENDSTAT;
-		if (TVCompare(&nowTV, &engp->nextSendTV) < 0) {	// Not yet time for STATS
-			break;
-		}
-		ClearCtrlReply(engp);
-		SendStatLine(engp);
-		engp->nextSendTV = nowTV;
-		TVAddUSec(&engp->nextSendTV, USEC_DELAYQUIT);
-		SetSMState(engp, SSM_DELAYQUIT);
-		break;
-	}
-	return engp->state;
-}
-
-
-
-/* ------------------------------------------------------ DoDuplexFSM ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int DoClientUDPDuplex(
-	TPEngine	*engp)
-{
-	int				redo;
-	int				res;
-	time_t			now;
-	struct timeval	nowTV;
-
-	for (redo = 1 ; redo != 0 ;) {
-	
-		redo = 0;
-		gettimeofday(&nowTV, 0);
-		
-		switch (engp->state) {
-
-		case CLSM_WAITPORTS:	// Waiting for PORTS info
-			engp->callMeAgain = CMA_CLIUDPFDX;
-			if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-			
-			res = CheckTestReply(engp);				// Look at PORTS reply
-			if (res != 210) {						// Invalid PORTS reply
-				FailSession(engp, TPER_BADPORTS);
-				break;
-			}
-			ClearCtrlReply(engp);
-			SetSMState(engp, CLSM_NATOPEN);
-			SetTimeLimit2(engp, 5);
-			engp->natCount = 0;
-			engp->natOpen = 0;
-			engp->nextSendTV = nowTV;
-			redo = 1;
-			break;
-			
-		case CLSM_NATOPEN:		// Opening NAT ports
-			engp->callMeAgain = CMA_CLINATOPEN;		
-			if (engp->ctrlMessageComplete) {
-				if (strncmp(engp->ctrlMessage, "NATACK ", 7) == 0) {
-					engp->natOpen = 1;
-					SetSMState(engp, CLSM_TESTLOOP);
-					SetTimeLimit2(engp, MAXINT);
-					ClearCtrlReply(engp);
-				}
-				else 
-					FailSession(engp, TPER_BADNATACK);
-				break;
-			}
-			if (TVCompare(&nowTV, &engp->nextSendTV) >= 0) {	// Not yet time to send another
-				engp->natCount += 1;
-				if (engp->natCount > 5) {
-					FailSession(engp, TPER_NATFAIL);
-					break;
-				}
-				SendNATPacket(engp);						// Send next packet
-				engp->nextSendTV = nowTV;
-				TVAddUSec(&engp->nextSendTV, USEC_NATOPEN);
-			}
-			break;
-			
-		case CLSM_TESTLOOP:		// Running the test
-			engp->callMeAgain = CMA_CLIUDPFDX;
-			ConsumeUDPData(engp);
-			if (engp->ctrlMessageComplete != 0) {				// Data seen on ctrl line
-				// Handle Server Data
-				FailSession(engp, TPER_SRVABORT);
-				break;
-			}
-			if (TVCompare(&nowTV, &engp->nextSendTV) >= 0 &&
-				engp->curSend < engp->nPackets) {// Time for another packet
-				GenerateUDPDataPacket(engp);
-				SendUDPDataPacket(engp);					// Send next packet
-				TVAddUSec(&engp->nextSendTV, engp->packetInterval);
-			}
-			if (engp->curSend >= engp->nPackets) {	
-				SetSMState(engp, CLSM_WAITFDX);
-				engp->nextSendTV = nowTV;
-				TVAddUSec(&engp->nextSendTV, USEC_STATDELAY);
-			}
-			break;
-
-		case CLSM_WAITFDX:
-			engp->callMeAgain = CMA_CLIUDPFDX;
-			ConsumeUDPData(engp);
-			if (engp->ctrlMessageComplete != 0) {
-				FailSession(engp, TPER_SRVABORT);
-				break;
-			}
-			if (TVCompare(&nowTV, &engp->nextSendTV) >= 0 || 
-				engp->stats.PktsRecvd >= engp->stats.PktsSent) {
-				SetSMState(engp, CLSM_SENDSTAT);			// Send stats
-			}
-			break;
-
-		case CLSM_SENDSTAT:
-			engp->callMeAgain = CMA_CLISENDSTAT;
-			ClearCtrlReply(engp);
-			SendStatLine(engp);
-			SetSMState(engp, CLSM_WAITSTAT);
-			break;
-		
-		case CLSM_WAITSTAT:
-			engp->callMeAgain = CMA_CLIWAITSTAT;
-			if (engp->ctrlMessageComplete == 0) break;		// No reply yet
-			
-			res = CheckStatsMsg(engp);
-			SetSMState(engp, CLSM_COMPLETE);			// Done	
-			CloseAllSockets(engp);
-			time(&now);
-			break;
-		}
-	}
-	return engp->state;
-}
-
-int SendUDPDataPacket(TPEngine *engp) {
-	int res;
-	int sendLength;
-	struct timeval now;
-	TPPacket * tPnt;
-
-	gettimeofday(&now, NULL);
-	tPnt = (TPPacket *)(engp->packetBuf);
-
-	if (engp->iAmServer) {
-		tPnt->Header.ServerSendTime.tv_sec = htonl(now.tv_sec);
-		tPnt->Header.ServerSendTime.tv_usec = htonl(now.tv_usec);
-	}
-	else {
-		tPnt->Header.ClientSendTime.tv_sec = htonl(now.tv_sec);
-		tPnt->Header.ClientSendTime.tv_usec = htonl(now.tv_usec);
-	}
-
-	if (engp->curSend == 0) {
-		engp->stats.StartSend.tv_sec = now.tv_sec;
-		engp->stats.StartSend.tv_usec = now.tv_usec;
-	}
-
-	sendLength = engp->packetSize - IP_UDP_SIZE;
-
-	res = SendUDPPacket(engp, sendLength);
-
-	if (res != sendLength) {
-		engp->stats.PktsUnSent++;
-	} else {
-		engp->stats.PktsSent++;
-		engp->stats.BytesSent += engp->packetSize;
-	}
-	gettimeofday(&(engp->stats.StopSend), NULL);
-	engp->curSend += 1;
-
-	return 0;
-}
-
-void GenerateUDPDataPacket(TPEngine *engp) {
-	TPPacket * tPnt;
-	int sendLength;
-
-	tPnt = (struct tpPacket *) engp->packetBuf;
-	if (tPnt == 0) return;				// No packet buffer set
-	
-	// Set up packet header and random payload
-	
-	sendLength = engp->packetSize - IP_UDP_SIZE;
-		
-	tPnt->Header.Sequence = htonl(engp->curSend);
-
-    tPnt->Header.ServerRecvTime.tv_sec = 0;
-    tPnt->Header.ServerRecvTime.tv_usec = 0;
-    tPnt->Header.ServerSendTime.tv_sec = 0;
-    tPnt->Header.ServerSendTime.tv_usec = 0;
-    tPnt->Header.DataSize = htonl(engp->packetSize);
-	tPnt->Header.Cookie = htonl(engp->sessCookie);
-    
-	memcpy(tPnt->Data, &(engp->randBuf[ ( Rand32() % ( engp->randBufSize / 2 ) ) ]),
-				sendLength - sizeof(struct tpHeader));
-
-}
-
-
-/* ------------------------------------------------------ DoDuplexFSM ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int DoServerUDPDuplex(
-	TPEngine	*engp)
-{
-
-
-	int				res;
-	struct timeval	nowTV;
-
-	gettimeofday(&nowTV, 0);
-		
-	switch (engp->state) {
-	
-		
-	case SSM_WAITNAT:			// Waiting for NAT-open packet
-		engp->callMeAgain = CMA_SRVWAITNAT;
-		if (engp->ctrlMessageComplete != 0) {			// Data seen on ctrl line
-			// Handle Server Data
-			FailSession(engp, TPER_CLIABORT);
-			break;
-		}
-		ConsumeUDPData(engp);
-		if (engp->natOpen) {
-			char buf[50];
-			sprintf(buf, "NATACK cookie=%lu\r\n", engp->sessCookie);
-			QueueCtrlData(engp, buf);
-			SetSMState(engp, SSM_TESTLOOP);
-			SetTimeLimit(engp, engp->sessionMaxTime);
-		}
-		break;
-
-	case SSM_TESTLOOP:		// Running the test
-		engp->callMeAgain = CMA_SRVUDPFDX;
-		ConsumeUDPData(engp);
-		if (engp->ctrlMessageComplete == 0) break;
-
-		// Is it a stats message?
-		res = CheckStatsMsg(engp);
-		if (res != 0) {
-			FailSession(engp, TPER_STATFAIL);
-			break;
-		}
-		ClearCtrlReply(engp);
-		SetSMState(engp, SSM_SENDSTAT);
-		engp->nextSendTV = nowTV;
-		TVAddUSec(&engp->nextSendTV, USEC_STATDELAY);
-		break;
-
-	case SSM_SENDSTAT:
-		engp->callMeAgain = CMA_SRVSENDSTAT;
-		if (TVCompare(&nowTV, &engp->nextSendTV) < 0) {	// Not yet time for STATS
-			break;
-		}
-		SendStatLine(engp);
-		engp->nextSendTV = nowTV;
-		TVAddUSec(&engp->nextSendTV, USEC_DELAYQUIT);
-		SetSMState(engp, SSM_DELAYQUIT);
-		break;
-
-	}
-	return engp->state;
-}
-
-
-
-
-/* -------------------------------------------------------- DoTCPRecv ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int DoClientTCPRecv(
-	TPEngine	*engp)
-{
-	int				res;
-	struct timeval	nowTV;
-
-	gettimeofday(&nowTV, 0);
-		
-	switch (engp->state) {
-
-	case CLSM_WAITPORTS:	// Waiting for PORTS info
-		engp->callMeAgain = CMA_CLIWAITPORTS;
-		if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-			
-		res = CheckTestReply(engp);				// Look at PORTS reply
-		if (res != 210) {						// Invalid PORTS reply
-			FailSession(engp, TPER_BADPORTS);
-			break;
-		}
-		ClearCtrlReply(engp);
-		SetTimeLimit2(engp, 20);
-		res = InitConnectTCP(engp, TP_SOCKINX_DATA);		
-		if (res == 0) {
-			SetSMState(engp, CLSM_DATACONNECTING);
-		} else {
-			FailSession(engp, TPER_NODATA);
-		}
-		break;
-
-	case CLSM_DATACONNECTING:
-		engp->callMeAgain = CMA_CLIDATACONNECT;
-		if (engp->tcpDataConnectComplete) {
-			SetSMState(engp, CLSM_TESTLOOP);
-			SetTimeLimit2(engp, MAXINT);
-		}
-		else {
-			res = ContinueConnectTCP(engp);
-			if (res == 0) {
-				// success
-			} else {
-				FailSession(engp, TPER_NODATA);
-			}
-		}
-		break;
-	
-	case CLSM_TESTLOOP:
-		engp->callMeAgain = CMA_CLITCPRECV;
-		res = ConsumeTCPTestData(engp);
-        if (res != 0) {
-			FailSession(engp, TPER_DATACLOSED);
-			return 0;
-		}
-		if (engp->ctrlMessageComplete == 1) {
-			res = CheckStatsMsg(engp);
-			SendStatLine(engp);
-			engp->nextSendTV = nowTV;
-			TVAddUSec(&engp->nextSendTV, USEC_DELAYQUIT);
-			SetSMState(engp, CLSM_DELAYQUIT);
-		}
-		break;
-	}
-	return engp->state;
-}
-
-/* -------------------------------------------------------- DoTCPSend ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-int DoClientTCPSend(
-	TPEngine	*engp)
-{
-
-	int				res;
-	int				off;
-	int				bytesToSend;
-	struct timeval	nowTV;
-
-	gettimeofday(&nowTV, 0);
-		
-	switch (engp->state) {
-
-	case CLSM_WAITPORTS:	// Waiting for PORTS info
-		engp->callMeAgain = CMA_CLIWAITPORTS;
-		if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-			
-		res = CheckTestReply(engp);				// Look at PORTS reply
-		if (res != 210) {						// Invalid PORTS reply
-			FailSession(engp, TPER_BADPORTS);
-			break;
-		}
-		ClearCtrlReply(engp);
-		SetTimeLimit2(engp, 20);
-		res = InitConnectTCP(engp, TP_SOCKINX_DATA);		
-		if (res == 0) {
-			SetSMState(engp, CLSM_DATACONNECTING);
-		} else {
-			FailSession(engp, TPER_NODATA);
-		}
-		break;
-
-	case CLSM_DATACONNECTING:
-		engp->callMeAgain = CMA_CLIDATACONNECT;
-		if (engp->tcpDataConnectComplete) {
-			SetSMState(engp, CLSM_TESTLOOP);
-			SetTimeLimit2(engp, MAXINT);
-		}
-		else {
-			res = ContinueConnectTCP(engp);
-			if (res == 0) {
-				// success
-			} else {
-				FailSession(engp, TPER_NODATA);
-			}
-		}
-		break;
-	
-	case CLSM_TESTLOOP:		// Running the test
-		engp->callMeAgain = CMA_CLITCPSEND;
-		if (engp->ctrlMessageComplete != 0) {			// Data seen on ctrl line
-			// Handle Client Data
-			FailSession(engp, TPER_SRVABORT);
-			break;
-		}
-		if (engp->stats.BytesSent < engp->tcpBytes) {
-			off = ((unsigned int)Rand32()) % ((RANDBUFSIZE * 2)/3);
-			bytesToSend = (int)(engp->tcpBytes - engp->stats.BytesSent);
-			if (bytesToSend > (RANDBUFSIZE - off))
-				bytesToSend = RANDBUFSIZE - off;
-			if (bytesToSend > (int)((engp->tcpBytes / 10) + 1))
-				bytesToSend = (int)((engp->tcpBytes / 10) + 1);
-
-			res = SendTCPData(engp, engp->randBuf + off, bytesToSend, TP_SOCKINX_DATA);
-
-			if (res > 0) {
-				if (engp->stats.BytesSent == 0)
-					engp->stats.StartSend = nowTV;
-				engp->stats.BytesSent += res;
-				engp->stats.StopSend = nowTV;
-			}
-            else if (res < 0) {
-                FailSession(engp, TPER_DATACLOSED);
-            }
-		}
-		else {
-			SetSMState(engp, CLSM_SENDSTAT);			// Data out, send STATS		
-			engp->nextSendTV = nowTV;
-			TVAddUSec(&engp->nextSendTV, USEC_STATDELAY);
-		}
-		break;
-
-	case CLSM_SENDSTAT:
-		if (TVCompare(&nowTV, &engp->nextSendTV) < 0) {	// Not yet time for STATS
-			engp->callMeAgain = (engp->nextSendTV.tv_sec - nowTV.tv_sec) * 1000000 +
-				(engp->nextSendTV.tv_usec - nowTV.tv_usec);
-		}
-		else
-			engp->callMeAgain = CMA_CLISENDSTAT;
-		ClearCtrlReply(engp);
-		SendStatLine(engp);
-		SetSMState(engp, CLSM_WAITSTAT);
-		break;
-		
-	case CLSM_WAITSTAT:
-		
-		if (engp->ctrlMessageComplete == 0) break;	// No reply yet
-			
-		res = CheckStatsMsg(engp);
-		SetSMState(engp, CLSM_COMPLETE);			// Done	
-		CloseAllSockets(engp);
-		break;
-	}
-	return engp->state;
-}
-
-
-
-
-
-int	SendHeloLine(TPEngine *engp)
-{
-	char			tBuf[200];
-
-	sprintf(tBuf, "HELO vmajor=%d;vminor=%d\r\n", MAJORVERSION, MINORVERSION);
-	return QueueCtrlData(engp, tBuf);
-}
-
-
-void ClearServerList(TPEngine *engp) {
-	int i;
-	for (i = 0; i < MAX_SERVERS; i++) {
-		memset(engp->serverNameList[i], 0, MAX_SERVER_NAME);
-		memset(engp->serverInfoList[i], 0, MAX_SERVER_INFO);
-		engp->serverPortList[i] = (USHORT)0;
-	}
-	engp->numServers = 0;
-}
-
-int AddServerToList(TPEngine *engp, char * str) {
-	char tBuf[MAX_SERVER_NAME + MAX_SERVER_INFO];
-
-	if (engp->numServers >= MAX_SERVERS)
-		return TPER_MAXSERVERS;
-	// Expecting string in format: hostname=name/ip;port=no;proto=x;info=y
-
-
-	memset(tBuf, 0, MAX_SERVER_NAME + MAX_SERVER_INFO);
-
-	// Server address is mandatory
-	if (CopyTagField(tBuf, MAX_SERVER_NAME - 1, str, "hostname")) 
-		strcpy(engp->serverNameList[engp->numServers], tBuf);
-	else
-		return TPER_NOSERVNAME;
-
-
-	memset(tBuf, 0, MAX_SERVER_NAME + MAX_SERVER_INFO);
-
-	// Check if we support server protocol
-	if (CopyTagField(tBuf, MAX_SERVER_NAME, str, "proto")) {
-		if (strcmp(tBuf, "TCP"))
-			return TPER_UNSUPPROTO;
-	}
-
-
-	memset(tBuf, 0, MAX_SERVER_NAME + MAX_SERVER_INFO);
-
-	// Server port is optional
-	if (CopyTagField(tBuf, MAX_SERVER_NAME, str, "port"))
-		engp->serverPortList[engp->numServers] = (USHORT)(atoi(tBuf));
-	else
-		engp->serverPortList[engp->numServers] = (USHORT)DEFAULT_CONTROL_PORT;
-
-
-	memset(tBuf, 0, MAX_SERVER_NAME + MAX_SERVER_INFO);
-
-	// Server info is optional
-	if (CopyTagField(tBuf, MAX_SERVER_INFO, str, "info"))
-		strncpy(engp->serverInfoList[engp->numServers], tBuf, MAX_SERVER_INFO);
-
-	engp->numServers += 1;
-
-	return 0;		
-}
-
-int DoQueryMaster(
-	TPEngine	*engp)
-{
-	int				code;
-	struct timeval	nowTV;
-
-	gettimeofday(&nowTV, 0);
-		
-	switch (engp->state) {
-
-	case CLSM_SENDMHELO:		// Connected - Send HELO 201
-
-		ClearCtrlReply(engp);
-		SendHeloLine(engp);							// Send our HELO message
-		SetSMState(engp, CLSM_SERVERLIST);
-		SetTimeLimit2(engp, MAXINT);
-		break;
-		
-	case CLSM_SERVERLIST:	// Waiting for Server list
-
-		if (engp->ctrlMessageComplete == 0) break;		// No reply yet
-			
-		code = ReplyCode(engp->ctrlMessage);
-		if (code == 210) {
-			if (strlen(engp->ctrlMessage) >= 4) {
-				if (engp->wipeFlag) {
-					ClearServerList(engp);
-					engp->wipeFlag = 0;
-				}
-				AddServerToList(engp, engp->ctrlMessage+4);
-				if (engp->ctrlMessage[3] != '-') {
-					SetSMState(engp, CLSM_COMPLETE);
-					CloseAllSockets(engp);
-					engp->active = 0;
-				}
-			} 
-			else {
-				FailSession(engp, TPER_BADMASTERREPLY);
-			}
-		} else {
-			if (code >= 400 && code < 500) {				
-				FailSession(engp, TPER_MASTERBUSY);				
-
-			} else if (code >= 500 && code < 600) {				
-			FailSession(engp, TPER_MASTERDENIED);					
-
-			} else {
-				FailSession(engp, TPER_BADMASTERREPLY);
-			}
-		}
-		ClearCtrlReply(engp);
-			
-		break;
-			
-	}
-	return engp->state;
-}
-
-int DoServerTCPSend(TPEngine *engp) {
-
-	struct timeval nowTV;
-	int res = 0;
-	int off;
-	int bytesToSend;
-
-	gettimeofday(&nowTV, 0);
-		
-	switch (engp->state) {
-
-	case SSM_DATALISTEN:
-		engp->callMeAgain = CMA_SRVDATALISTEN;
-		res = AcceptClient(engp, TP_SOCKINX_DATA);
-		if (res != 0) {
-			FailSession(engp, TPER_ACCEPTFAIL);
-			return 0;
-		}
-		if (engp->tcpDataConnectComplete) 
-			SetSMState(engp, SSM_TESTLOOP);
-		break;
-
-	case SSM_TESTLOOP:		// Running the test
-		engp->callMeAgain = CMA_SRVTCPTEST;
-		if (engp->ctrlMessageComplete != 0) {			// Data seen on ctrl line
-			// Handle Client Data
-			FailSession(engp, TPER_CLIABORT);
-			break;
-		}
-
-		if (engp->stats.BytesSent < engp->tcpBytes) {
-			off = ((unsigned int)Rand32()) % ((RANDBUFSIZE * 2)/3);
-			bytesToSend = (int)(engp->tcpBytes - engp->stats.BytesSent);
-			if (bytesToSend > (RANDBUFSIZE - off))
-				bytesToSend = RANDBUFSIZE - off;
-			if (bytesToSend > (int)((engp->tcpBytes / 10) + 1))
-				bytesToSend = (int)((engp->tcpBytes / 10) + 1);
-
-			res = SendTCPData(engp, engp->randBuf + off, bytesToSend, TP_SOCKINX_DATA);
-
-			if (res > 0) {
-				if (engp->stats.BytesSent == 0)
-					engp->stats.StartSend = nowTV;
-				engp->stats.BytesSent += res;
-				engp->stats.StopSend = nowTV;
-			}
-            else if (res < 0) {
-                FailSession(engp, TPER_DATACLOSED);
-            }
-		}
-		else {
-			SetSMState(engp, SSM_SENDSTAT);			// Data out, send STATS		
-			engp->nextSendTV = nowTV;
-			TVAddUSec(&engp->nextSendTV, USEC_STATDELAY);
-		}
-		break;
-
-	case SSM_SENDSTAT:
-		if (TVCompare(&nowTV, &engp->nextSendTV) < 0) {	// Not yet time for STATS
-			engp->callMeAgain = (engp->nextSendTV.tv_sec - nowTV.tv_sec) * 1000000 +
-				(engp->nextSendTV.tv_usec - nowTV.tv_usec);
-			break;
-		}
-		else
-			engp->callMeAgain = CMA_SRVSENDSTAT;
-		ClearCtrlReply(engp);
-		SendStatLine(engp);
-		SetSMState(engp, SSM_WAITSTAT);
-		SetTimeLimit(engp, 10);
-		break;
-		
-	case SSM_WAITSTAT:
-		engp->callMeAgain = CMA_SRVWAITSTAT;
-		if (engp->ctrlMessageComplete == 0) break;	// No reply yet			
-		res = CheckStatsMsg(engp);
-		SetSMState(engp, SSM_COMPLETE);			// Done	
-		CloseAllSockets(engp);
-//		sprintf(engp->infoMsg, "Test time was %d seconds for %lld bytes", now - engp->startTime, Stats.BytesSent);
-		break;
-	}
-	
-	
-	return 0;
-}
-
-int DoServerTCPRecv(TPEngine *engp) {
-	struct timeval nowTV;
-	int res = 0;
-
-	gettimeofday(&nowTV, 0);
-
-	switch (engp->state) {
-
-	case SSM_DATALISTEN:
-		engp->callMeAgain = CMA_SRVDATALISTEN;
-		res = AcceptClient(engp, TP_SOCKINX_DATA);
-		if (res != 0) {
-			FailSession(engp, TPER_ACCEPTFAIL);
-			return 0;
-		}
-		if (engp->tcpDataConnectComplete) {
-			SetSMState(engp, SSM_TESTLOOP);
-			ClearCtrlReply(engp);
-		}
-		break;
-
-	case SSM_TESTLOOP:
-		engp->callMeAgain = CMA_SRVTCPTEST;
-		res = ConsumeTCPTestData(engp);
-        if (res != 0) {
-            FailSession(engp, TPER_DATACLOSED);
-            return 0;
-        }
-		if (engp->ctrlMessageComplete == 1) {
-			res = CheckStatsMsg(engp);
-			SendStatLine(engp);
-			engp->nextSendTV = nowTV;
-			TVAddUSec(&engp->nextSendTV, USEC_DELAYQUIT);
-			SetSMState(engp, SSM_DELAYQUIT);
-		}
-	}
-
-	return 0;
-}
-
-
-
-
-
-/*
- * Fill buffer with random numbers.
- */
-void InitRandBuf(void *buf, int len)              
-{
-        struct timeval tm;
-        int             i;
-
-        gettimeofday( &tm, NULL );                 
-        srand( tm.tv_sec | tm.tv_usec );
-        for ( i = 0; i < (int)(len / sizeof( int )); i++ )
-                *((int *)(&(((char *)buf)[i * sizeof( int )]))) = Rand32();
-}
diff --git a/tptest/src/tpengine.h b/tptest/src/tpengine.h
deleted file mode 100644
index c903861a394bec66a62ff75a80376a5f2ac40bc6..0000000000000000000000000000000000000000
--- a/tptest/src/tpengine.h
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- * $Id: tpengine.h,v 1.17 2004/03/23 17:07:37 rlonn Exp $
- * $Source: /cvsroot/tptest/engine/tpengine.h,v $
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpengine.h - main test engine header file
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *  Hans Green <hg@3tag.com>
- *
- * Based on earlier work by
- *  Hans N�st�n
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-#ifndef _TPENGINE_H_
-#define _TPENGINE_H_
-
-#define MAJORVERSION	3
-#define MINORVERSION	17
-
-
-// Select platform
-// #define __WIN32
-// #define MACOS
-
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-// Win32 specifics
-
-#ifdef __WIN32
-#define LONG_LONG_PREFIX	"I64"
-#define NO_GETTIMEOFDAY
-typedef _int64			LONG_LONG;
-typedef unsigned short	USHORT;
-#define dprintf			printf
-#include <winsock2.h>
-#endif
-
-
-// Unix specifics
-
-#ifdef UNIX
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-typedef long long               LONG_LONG;
-typedef unsigned short          USHORT;
-typedef long                    INT32;
-typedef unsigned long           UINT32;
-
-typedef struct sockaddr         SOCKADDR;
-typedef struct sockaddr_in      SOCKADDR_IN;
-typedef int                     SOCKET;
-
-#define SOCKET_ERROR            (-1)
-#define INVALID_SOCKET          (-1)
-
-// Solaris specifics
-
-#ifdef SOLARIS
-#define LONG_LONG_PREFIX        "ll"
-#define INADDR_NONE		(-1)
-#endif	// SOLARIS
-
-// Linux specifics
-
-#ifdef LINUX
-#define LONG_LONG_PREFIX        "ll"
-#endif	// LINUX
-
-// OpenBSD specifics
-
-#ifdef OPENBSD
-#define LONG_LONG_PREFIX	"q"
-#endif
-
-
-#endif	// UNIX
-
-
-// MAC specifics
-
-#ifdef MACOS
-
-struct timeval {
-	int		tv_sec;
-	int		tv_usec;
-};
-struct in_addr {
-	u_int32_t s_addr;
-};
-#define LONG_LONG_PREFIX	"ll"
-#define NO_GETTIMEOFDAY
-#define NO_HTONL
-#define NO_NTOHL
-typedef long long		LONG_LONG;
-typedef unsigned short	USHORT;
-typedef long			INT32;
-typedef unsigned long	UINT32;
-
-long	htonl(long l);
-long	ntohl(long l);
-void	Report(char *str);
-void	ClearTextWindow(void);
-#endif  // MACOS
-
-typedef struct in_addr IN_ADDR;
-
-#define TP_DEBUGLEVEL		0
-//#define TP_DEBUGLEVEL		3
-
-
-#define DEFAULT_CONTROL_PORT	1634
-
-#define MAXINT		(2147483647)
-
-
-/*
-* Test modes.
-*/
-
-#define M_NONE			0
-#define M_UDP_FDX		1
-#define M_UDP_SEND		2
-#define M_UDP_RECV		3
-#define M_TCP_SEND		4
-#define M_TCP_RECV		5
-#define M_QUERY_MASTER	6
-#define M_NAME_LOOKUP	7
-
-
-/*
-* Client engine states. 
-*
-*/
-enum TPCLIENTSM_STATE {
-	CLSM_IDLE		= 1,
-	CLSM_CONNECTING,
-	CLSM_CONNECTED,
-	CLSM_WAITPORTS,
-	CLSM_NATOPEN,
-	CLSM_TESTLOOP,
-	CLSM_SENDSTAT,
-	CLSM_WAITSTAT,
-	CLSM_DELAYQUIT,
-	CLSM_TERM_WAIT,
-	CLSM_FAILED,
-	CLSM_SENDMHELO,
-	CLSM_SERVERLIST,
-	CLSM_COMPLETE,
-	CLSM_DATACONNECTING,
-	CLSM_NAMELOOKUP,
-	CLSM_WAITFDX
-};
-
-
-/*
-* Server engine states 
-*
-*/
-enum TPSERVERSM_STATE {
-	SSM_IDLE	= 101,
-	SSM_LISTEN,
-	SSM_SENDWELCOME,
-	SSM_WAITTEST,
-	SSM_POSTTEST,
-	SSM_WAITNAT,
-	SSM_WAITTCPDATA,
-	SSM_TESTLOOP,
-	SSM_SENDSTAT,
-	SSM_WAITSTAT,
-	SSM_DELAYQUIT,
-	SSM_FDXWAIT,
-	SSM_COMPLETE,
-	SSM_FAILED,
-	SSM_DATALISTEN,
-	SSM_INITTCPDATA
-};
-
-
-/*
-* Socket identifiers
-*
-*/
-enum TP_SOCKINX {
-	TP_SOCKINX_CTRL = 1,
-	TP_SOCKINX_DATA,
-	TP_SOCKINX_SCTRL,
-	TP_SOCKINX_SDATA
-};
-
-
-/*
-* CallMeAgain-constants. Not so useful yet
-*
-*/
-#define CMA_CLIWAITPORTS	100000
-#define CMA_CLIUDPSEND		20000
-#define CMA_CLISENDSTAT		100000
-#define CMA_CLIWAITSTAT		100000
-#define CMA_CLIWAITPORTS	100000
-#define CMA_CLINATOPEN		50000
-#define CMA_CLIUDPRECV		20000
-#define CMA_CLIUDPFDX		20000
-#define CMA_CLIDATACONNECT	100000
-#define CMA_CLITCPSEND		50000
-#define CMA_CLITCPRECV		50000
-
-#define CMA_SRVWAITNAT		50000
-#define CMA_SRVUDPSEND		20000
-#define CMA_SRVSENDSTAT		100000
-#define CMA_SRVWAITSTAT		100000
-#define CMA_SRVUDPRECV		20000
-#define CMA_SRVUDPFDX		20000
-#define CMA_SRVDATALISTEN	100000
-#define CMA_SRVTCPTEST		50000
-
-
-/*
-* Engine delays between states
-*
-*/
-#define USEC_STATDELAY		500000
-#define USEC_NATOPEN		1000000
-#define USEC_DELAYQUIT		500000
-
-
-/*
-* Size of IP+UDP header
-*
-*/
-#define IP_UDP_SIZE 28
-
-/*
-* Size of various data structures/buffers/arrays
-*
-*/
-#define MAX_LOOKUP_IP		10
-#define MAX_SERVERS		30
-#define MAX_SERVER_NAME		40
-#define MAX_SERVER_INFO		40
-#define TP_CTRL_MSG_SIZE	200
-#define TP_HOST_NAME_SIZE	200
-#define PACKBUFSIZE		66000
-#define RANDBUFSIZE		(524288)
-#define REPLYBUFSIZE		512
-
-
-/* 
-* Other constants
-*/
-#define LISTEN_BACKLOG		5
-#define TP_1KBPS		1000
-#define TP_1MBPS		1000000
-#define START_TCP_BYTES		51200
-
-/*
-* Error codes
-*
-*/
-#define TPER_CTRLCLOSED		2001
-#define TPER_TIMEOUT		2002
-#define TPER_NOCTRL			2003
-#define TPER_BADHELLO		2004
-#define TPER_BADPORTS		2005
-#define TPER_SRVABORT		2006
-#define TPER_BADMODE		2007
-#define TPER_NATFAIL		2008
-#define TPER_UDPOPENFAIL	2009
-#define TPER_USERABORT		2010
-#define TPER_MASTERBUSY		2011
-#define TPER_BADMASTERREPLY 2012
-#define TPER_MASTERDENIED	2013
-#define TPER_BADCOOKIE		2014
-#define TPER_BADNATACK		2015
-#define TPER_NOTCPDATASOCK	2016
-#define TPER_NODATA			2017
-#define TPER_MAXSERVERS		2018
-#define TPER_NOSERVNAME		2019
-#define TPER_UNSUPPROTO		2020
-#define TPER_NOHOSTNAME		2021
-#define TPER_CONNECTFAIL	2022
-#define TPER_BADWELCOME		2023
-#define TPER_WRONGCOOKIE	2024
-#define TPER_NOCOOKIE		2025
-#define TPER_WRONGMODE		2026
-#define TPER_NOMODE			2027
-#define TPER_NOTIME			2028
-#define TPER_NONPACKETS		2029
-#define TPER_NOPSIZE		2030
-#define TPER_NOUDPSENDPORT	2031
-#define TPER_NOUDPRECVPORT	2032
-#define TPER_NOTIMEOUT		2033
-#define TPER_NOTCPBYTES		2034
-#define TPER_SERVERBUSY		2035
-#define TPER_SERVERDENY		2036
-#define TPER_NLINITFAIL		2037
-#define TPER_NLFAIL			2038
-#define TPER_DATACLOSED		2039
-
-#define TPER_ACCEPTFAIL		3001
-#define TPER_BADTEST		3002
-#define TPER_CLIABORT		3003
-#define TPER_STATFAIL		3004
-
-
-/*
-* Data packet used in tests.
-*/
-struct tpHeader { 
-	unsigned int	Sequence;
-	struct timeval	ClientSendTime;
-	struct timeval	ServerRecvTime;
-	struct timeval	ServerSendTime;
-	UINT32		DataSize;
-        UINT32		Cookie;
-};
-
-typedef struct tpPacket { 
-	struct tpHeader	Header;
-	unsigned char	Data[ 1 ];
-} TPPacket;
-
-
-/*
- * Test results.
- */
-typedef struct TPStats { 
-	USHORT		MajorVersion;
-	USHORT		MinorVersion;
-	UINT32		PktsSent;
-	UINT32		PktsUnSent;
-	UINT32		PktsRecvd;
-	LONG_LONG	BytesSent;
-	LONG_LONG	BytesRecvd;
-	UINT32		nRoundtrips;
-	UINT32		TotalRoundtrip;
-	UINT32		MaxRoundtrip;
-	UINT32		MinRoundtrip;
-	UINT32		ooCount;
-	struct timeval	StartSend;
-	struct timeval	StopSend;
-	struct timeval	StartRecv;
-	struct timeval	StopRecv;
-	char email[101];
-	char pwd[101];
-} TPStats;
-
-
-
-/*
-* TPEngine is the general info-command-struct used to communicate
-* with the test engine.
-*/
-typedef struct TPEngine {
-
-	/*
-	 * Variables supplied by user in order to start a test
-	 */
-
-	/* Needed for all modes */
-	INT32			tpMode;							// Test mode
-	IN_ADDR			hostIP;							// Host address
-	USHORT			hostCtrlPort;					// Server TCP control port number
-	UINT32			sessionMaxTime;					// max test time (before timeout)
-
-
-	/* Needed when tpMode is M_TCP_SEND or M_TCP_RECV */
-	UINT32			tcpBytes;						// Number of bytes to transfer in TCP test
-
-	/* Needed when tpMode is M_UDP_SEND, M_UDP_RECV or M_UDP_FDX */
-	UINT32			packetSize;						// Packet size
-	UINT32			nPackets;						// Number of packets to send / receive
-	UINT32			sessionTime;					// Total send time
-
-
-	/*
-	 * Variables supplied by user to perform other actions
-	 */
-
-	/* bitsPerSecond and packetsPerSecond can be used to calculate packetSize, nPackets and 
-	   packetInterval. Just set the variables you know and zero the others, then call 
-	   RecalculatePPSSZ() */
-	UINT32			bitsPerSecond;					// RecalculatePPSSZ
-	UINT32			packetsPerSecond;				// RecalculatePPSSZ
-
-	/* HostName allows the engine to do an asynchronous host name lookup for the user */
-	char		hostName[TP_HOST_NAME_SIZE+2];	// Servername (string) for hostname lookup
-	int			numHostIP;						// Number of IP addresses for the host
-	IN_ADDR		hostIPTab[MAX_LOOKUP_IP];		// Array with IP addresses for hostname
-
-	/* Server list */
-	/* Set hostIP to the IP of the master server you want to use */
-	char		serverNameList[MAX_SERVERS][MAX_SERVER_NAME];
-	char		serverInfoList[MAX_SERVERS][MAX_SERVER_INFO];
-	USHORT		serverPortList[MAX_SERVERS];
-	int			numServers;
-
-        /* Requested socket options */
-        /* The application sets these values and the IO module tries */
-        /* to make sure data sockets use them. If the IO module is not */
-        /* able to use these values, it should either fill in the values */
-        /* actually used, or zero (0) in the "cur_socket_sndbuf" and */
-	/* "cur_socket_rcvbuf" variables */
-        int		socket_sndbuf;
-	int		socket_rcvbuf;
-
-	int		cur_socket_sndbuf;
-	int		cur_socket_rcvbuf;
-
-	/* an application should check cur_socket_sndbuf/cur_socket_rcvbuf */
-	/* when a test is running (and data sockets have been set up) to */
-	/* make sure its requested socket options have been set */
-
-	/*
-	 * Internal variables
-	 * These can be read but should NOT be modified from outside the engine
-	 */
-	int			active;				// Bool. Is the engine running
-	int			state;				// Engine state
-	time_t		startTime;			// time_t for start by StartClientContext
-	UINT32		packetInterval;		// send interval per packet (microseconds)
-	INT32		failCode;
-	INT32		timeLimit;			// Internal state timer set by SetTimeLimit
-	INT32		callMeAgain;		// How many microseconds before RunServerContext() or
-									// RunClientContext() wants another call
-	
-	UINT32		sessCookie;			// set by server
-
-	UINT32		natCount;			// How many NAT-open packets have we sent
-	UINT32		curSend;			// Send packet counter
-	int			wipeFlag;			// Used internally when querying
-	int			natOpen;			// Bool. Is NAT-open finished?
-
-
-	UINT32		packetsRecvd;		// # of packets received
-	UINT32		packetsSent;		// # of packets sent
-	UINT32		prevPacket;			// Maximum sequence number seen
-	UINT32		badPackets;			// received packets with incorrect cookie
-	UINT32		badBytes;			// received bytes in bad packets
-	
-	char			*packetBuf;			// Packet buffer pointer
-	UINT32			packBufSize;		// Size of packet buffer
-	IN_ADDR			packetfromAdr;			// Where did incoming packet come from
-	USHORT			packetfromPort;		// What port did incoming packet come from
-	UINT32			packetLen;				// Length of incoming packet
-
-	char		*randBuf;			// Random buffer for data generation
-	UINT32		randBufSize;		// Size of random buffer
-
-	TPStats		stats;			// Struct for storing test results/statistics
-	
-	struct timeval nextSendTV;		// timeval for next sen
-	
-	int			(*executor)(struct TPEngine *ctxp);	// Select executor for RunContext
-	
-	void		*ctrlRefp;			// Local data for I/O handler
-	
-	int			ctrlMessageComplete;		// Bool. Set when complete command seen
-	char		ctrlMessage[REPLYBUFSIZE];	// Latest command read from control port
-	
-	int			tcpCtrlConnectComplete;			// Bool.
-	int			tcpDataConnectComplete;			// Bool.
-	int			iAmServer;					// Bool.
-	
-	INT32		ioError;			// Platform dependent io error code - set by engine
-		
-	USHORT		hostTCPDataPort;	// Port used by remote host to transmit/receive TCP data
-	USHORT		hostUDPRecvPort;		// Set by CheckPortsMessage el vad det nu blir
-	USHORT		hostUDPSendPort;
-
-	IN_ADDR		myLocalAddress;		// bind to this local address (optional)
-	USHORT		myTCPDataPort;		// bind to this local TCP data port (optional)
-	USHORT		myUDPRecvPort;		// bind to this local UDP receive data port (optional)
-	USHORT		myUDPSendPort;		// bind to this local UDP send data port (optional)
-	USHORT		myTCPControlPort;	// bin to this local TCP control port (optional)
-
-	USHORT		peerMajorVersion;		// Major/minor version no of peer
-	USHORT		peerMinorVersion;
-
-	double		bestTCPSendRate;		// Best rates seen. Bytes/sec. For the client support functions
-	double		bestTCPRecvRate;
-	double		bestUDPSendRate;
-	double		bestUDPRecvRate;
-
-	UINT32		start_tcpsend_bytes;	// starting value for tcpBytes when doing TCP_AUTO_SEND
-	UINT32		start_tcprecv_bytes;	// starting value for tcpBytes when doing TCP_AUTO_RECV
-
-	char		clientInfo[80];		// Client info. E.g. "TPtest 3.0.1 MacOS9"
-	
-} TPEngine;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/*
-* Engine function prototypes
-*
-*/
-int AddServerToList(TPEngine *, char *);
-int	CheckHelloReply(TPEngine *);
-int	CheckServerBanner(TPEngine *);
-int	CheckStatsMsg(TPEngine *);
-int	CheckTestReply(TPEngine *);
-int CheckTestMessage(TPEngine *);
-void ClearBestRates(TPEngine *);
-void ClearServerList(TPEngine *);
-TPEngine *CreateContext(void);			// Called by user
-void DeleteContext(TPEngine *);			// Called by user
-int DoClientTCPRecv(TPEngine *);
-int DoClientTCPSend(TPEngine *);
-int DoClientUDPDuplex(TPEngine *);
-int DoClientUDPRecv(TPEngine *);
-int DoClientUDPSend(TPEngine *);
-int DoNameLookup(TPEngine *);
-int DoServerTCPSend(TPEngine *);
-int DoServerTCPRecv(TPEngine *);
-int DoServerUDPDuplex(TPEngine *);
-int DoServerUDPRecv(TPEngine *);
-int DoServerUDPSend(TPEngine *);
-void FailSession(TPEngine *, int);
-void GenerateUDPDataPacket(TPEngine *);
-int RunClientContext(TPEngine *);		// Called by user
-int RunServerContext(TPEngine *);		// Called by user
-int SendHeloLine(TPEngine *);
-int SendStatLine(TPEngine *);
-int SendTCPTestData(TPEngine *);
-int SendTestLine(TPEngine *);
-int SendTestOKMessage(TPEngine *);
-int SendUDPDataPacket(TPEngine *);
-void SetSMState(TPEngine *, int);
-void SetTimeLimit(TPEngine *, int);		// Called by user
-int StartClientContext(TPEngine *);		// Called by user
-int StartServerContext(TPEngine *);		// Called by user
-void StopContext(TPEngine *);			// Called by user
-int TimeLimitExceeded(TPEngine *);
-int DoQueryMaster(TPEngine	*);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-
-#endif
-
diff --git a/tptest/src/tpio.h b/tptest/src/tpio.h
deleted file mode 100644
index f43e308f1db73f1b629ef31c1ca7fed7b5a706d1..0000000000000000000000000000000000000000
--- a/tptest/src/tpio.h
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * $Id: tpio.h,v 1.3 2002/09/16 14:10:42 rlonn Exp $
- * $Source: /cvsroot/tptest/engine/tpio.h,v $
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpio.h - I/O function prototypes
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-#ifndef _TPIO_H_
-#define _TPIO_H_
-
-/* ----------------------------------------------------------- tpio.h ---- *\
-
-  This file (tpio.h) contains prototypes for the functions the engine 
-  (tpengine.c) needs in order to perform TPTEST bandwidth measurements.
-
-  If you intend to port TPTEST to a new platform, the functions described
-  here are the ones you need to provide to make things tick. The file 
-  containing the functions should be named tpio_platform.c where 'platform'
-  is a string representing your platform. Like e.g. "linux" or "win32".
-  
-  Below you'll find an explanation of what every function does.
-  The functions are listed in alphabetical order (most of them).
-
-\* ----------------------------------------------------------------------- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-int		AcceptClient(TPEngine * engp, int sockInx);
-int		CheckCtrlOpen(TPEngine *);
-int		ConsumeCtrlData(TPEngine *);
-int		ConsumeTCPTestData(TPEngine *);
-int		ConsumeUDPData(TPEngine *);
-int		ContinueConnectTCP(TPEngine *);
-void		ClearCtrlReply(TPEngine *);
-void		CloseAllSockets(TPEngine *);
-void		DeleteSessComm(TPEngine *);
-int		InitConnectTCP(TPEngine *, int);
-int		InitSessComm(TPEngine *);
-int		InitTCPSock(TPEngine *, int);
-int		InitUDP(TPEngine *);
-int		QueueCtrlData(TPEngine *, char *);
-int		Rand32();
-int		SendCtrlData(TPEngine *);
-int		SendNATPacket(TPEngine *);
-int		SendTCPData(TPEngine *, char *, int, int);
-int		SendUDPPacket(TPEngine *, int);
-int		InitNameLookup(TPEngine *);
-int		ContinueNameLookup(TPEngine *);
-
-#ifdef NO_GETTIMEOFDAY
-extern void		gettimeofday(struct timeval *, void *);
-#endif
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-
-/* ----------------------------------------------------- AcceptClient ---- *\
-	int AcceptClient(TPEngine * engp, int sockInx)
-
-	Executed by RunServerContext() to accept an incoming client TCP 
-	connection.
-
-	If sockInx == TP_SOCKINX_CTRL AcceptClient() should:
-
-		1.	Check for a pending connection on the TCP control socket
-
-		2.	When a connection is detected and accepted, AcceptClient() must
-			set engp->tcpCtrlConnectComplete = 1 to signal to the engine 
-			that a connection has been established. AcceptClient() must also 
-			store the remote host's IP address in engp->hostIP and the remote
-			host's TCP port number in engp->hostCtrlPort
-
-	If sockInx == TP_SOCKINX_DATA AcceptClient() should:
-
-		1.	Check for a pending connection on the TCP data socket
-
-		2.	When a connection is detected and accepted, AcceptClient() must
-			set engp->tcpDataConnectComplete = 1 to signal to the engine that
-			a connection has been established. AcceptClient() must also store
-			the remote host's TCP port number in engp->hostTCPDataPort
-
-	Return values:
-
-		AcceptClient() should return 0 unless an error occurs, in which case
-		it should return a non-zero error code and also set engp->ioError to 
-		value that reflects the kind of error that occurred.
-\* ----------------------------------------------------------------------- */
-
-
-
-
-
-/* ---------------------------------------------------- CheckCtrlOpen ---- *\
-	int CheckCtrlOpen(TPEngine * engp)
-
-	Executed by the engine to determine whether the control TCP connection
-	is still open or not.
-
-	Return values:
-	
-		CheckCtrlOpen should return 1 if a TCP control connection is open
-		and 0 (zero) if one isn't.
-\* ----------------------------------------------------------------------- */
-
-
-
-
-
-/* -------------------------------------------------- ConsumeCtrlData ---- *\
-	int	ConsumeCtrlData(TPEngine * engp)
-
-	Executed repeatedly by the engine to read more data from the TCP control
-	socket until a full line ending with CR+LF has been read.
-
-	ConsumeCtrlData() should read data from the TCP control socket, if 
-	there is data to read, and store it in a temporary buffer until a 
-	complete line ending with the characters CR (carriage return, ASCII 13)
-	and LF (linefeed, ASCII 10) has been read. When such a line is 
-	encountered, ConsumeCtrlData() should store the whole line, except for 
-	the CR and LF characters and with a terminating NULL character, in 
-	engp->ctrlMessage and set the variable engp->ctrlMessageComplete = 1 to 
-	signal to the engine that a control command line has been received from 
-	the remote peer.
-
-	Caution:
-
-		-	Be sure not to copy more than REPLYBUFSIZE characters into 
-			engp->ctrlMessage
-
-		-	Don't forget to NULL-terminate engp->ctrlMessage
-
-		-	Don't forget that a read operation on the TCP control socket
-			may give you a whole line, ending with CR+LF, *and* another
-			line or part of another line. The code must handle this. Look
-			at the implementation of ConsumeCtrlData() in tpio_win32.c
-
-	Return values:
-
-		ConsumeCtrlData() should return 0 unless an error occurs, in which
-		case it should return your non-zero error code of choice and set
-		engp->ioError to some appropriate value. 
-\* ----------------------------------------------------------------------- */
-
-
-
-
-
-/* ----------------------------------------------- ConsumeTCPTestData ---- *\
-	int	ConsumeTCPTestData(TPEngine * engp)
-
-	Executed repeatedly during a TCP test on the receiving side to read TCP
-	test data on the TCP data socket.
-
-	ConsumeTCPData() should:
-	
-		1.	Check if any data is available on the TCP data socket.
-
-		2.	If so, ConsumeTCPTestData() should try to read engp->packBufSize
-			bytes and store them in engp->packetBuf
-
-		If more than 0 (zero) bytes were read from the socket, 
-		ConsumeTCPTestData() should also do 3-5 below:
-
-		3.	Check if engp->stats.BytesRecvd == 0 (zero) in which case this is
-			the first time we see test data on the socket and that means
-			means ConsumeTCPData() should store the current time in 
-			engp->stats.StartRecv
-
-		4.	Add the number of bytes received to engp->stats.BytesRecvd
-
-		5.	Store the current time in engp->stats.StopRecv
-
-
-	Return values:
-
-		ConsumeTCPTestData() should return 0 unless an error occurs, in which
-		case it should return your non-zero error code of choice and set
-		engp->ioError to some appropriate value. 
-\* ----------------------------------------------------------------------- */
-
-
-
-
-
-
-/* --------------------------------------------------- ConsumeUDPData ---- *\
-	int	ConsumeUDPData(TPEngine * engp)
-
-\* ----------------------------------------------------------------------- */
-
-
-
-
-
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-/* ----------------------------------------------------- SendStatLine ---- *\
-
-
-\* ----------------------------------------------------------------------- */
-
-
-#endif
-
diff --git a/tptest/src/tpio_unix.c b/tptest/src/tpio_unix.c
deleted file mode 100644
index 53ae85dce0fa5ed042e2ecedcf312c5dfba41f12..0000000000000000000000000000000000000000
--- a/tptest/src/tpio_unix.c
+++ /dev/null
@@ -1,1303 +0,0 @@
-/*
- * $Id: tpio_unix.c,v 1.10 2004/03/23 17:04:28 rlonn Exp $
- * $Source: /cvsroot/tptest/os-dep/unix/tpio_unix.c,v $
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpio_unix.c - Platform-dependent I/O routines
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *
- * Based on earlier work by
- *  Hans N�st�n
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307  USA.
- *
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/time.h>
-#include "tpengine.h"
-#include "tpio.h"
-#include "tpio_unix.h"
-
-/*
-// functions defined in this file:
-int AcceptClient(TPEngine *);
-int CheckCtrlOpen(TPEngine *);
-int	ConsumeCtrlData(TPEngine *);
-int ConsumeTCPTestData(TPEngine *);
-int ConsumeUDPData(TPEngine *);
-int ContinueConnectTCP(TPEngine *);
-void ClearCtrlReply(TPEngine *);
-void CloseAllSockets(TPEngine *);
-int CloseCtrlSock(TPEngine *);
-void DeleteSessComm(TPEngine *);
-#ifdef NO_GETTIMEOFDAY
-void gettimeofday(struct timeval *, void *);
-#endif
-int InitConnectTCP(TPEngine *, int);
-int Init_gettimeofday();
-int InitSessComm(TPEngine *);
-int InitTCPSock(TPEngine *, int);
-int InitUDP(TPEngine *);
-int QueueCtrlData(TPEngine *, char *);
-int Rand32();
-int SendCtrlData(TPEngine *);
-int SendNATPacket(TPEngine *);
-int SendTCPData(TPEngine *, char *, int, int);
-int SendUDPPacket(TPEngine *, int);
-*/
-
-
-int InitNameLookup(TPEngine *engp) { return 0; }
-int ContinueNameLookup(TPEngine *engp) { return 0; }
-
-
-
-
-/* ---------------------------------------------------- SendNATPacket ---- *\
-
-	Create and send a NAT open packet
-
-	We send a packet from our recv socket to the server's send socket
-	in order to open up NAT gateways.
-
-\* ----------------------------------------------------------------------- */
-
-int SendNATPacket(TPEngine *engp)
-{
-	WSInfo			*w;
-	struct tpPacket		*tPnt;
-	struct timeval		now;
-	int					res;
-  	char				buf[100];
-	SOCKADDR_IN			toAddr;
-
-	w = (WSInfo *) (engp->ctrlRefp);
-	if (w == 0) return -1;	
-
-	// Set up NATOPEN packet contents
-
-//	printf("Sending NAT open packet to %s:%u\n", inet_ntoa(engp->hostIP), 
-//		engp->hostUDPSendPort);
-	
-	memset(buf, 0, 100);
-	tPnt = (struct tpPacket *) buf;
-	tPnt->Header.Sequence = 0;
-    tPnt->Header.ServerRecvTime.tv_sec = 0;
-    tPnt->Header.ServerRecvTime.tv_usec = 0;
-    tPnt->Header.ServerSendTime.tv_sec = 0;
-    tPnt->Header.ServerSendTime.tv_usec = 0;
-    tPnt->Header.DataSize = 0;
-	tPnt->Header.Cookie = htonl(engp->sessCookie);
-    gettimeofday(&now, NULL);
-	tPnt->Header.ClientSendTime.tv_sec = htonl(now.tv_sec);
-	tPnt->Header.ClientSendTime.tv_usec = htonl(now.tv_usec);
-    
-	// send the data from our receive port to server's send port
-
-	toAddr.sin_addr.s_addr = engp->hostIP.s_addr;
-	toAddr.sin_port = htons(engp->hostUDPSendPort);
-	toAddr.sin_family = AF_INET;
-
-	res = sendto(w->udpRecvSock, buf, 100, 0, (SOCKADDR *)&toAddr, sizeof (toAddr));
-
-	if (res != 100) {
-		if (res == SOCKET_ERROR)
-			return errno;
-		else
-			return -1;
-	}
-
-	return 0;
-}
-
-
-int ConsumeTCPTestData(TPEngine *engp) {
-	struct timeval tv, nowTV;
-	fd_set fds;
-	WSInfo * w;
-	int res = 0;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0) return 0;
-
-	tv.tv_sec = 0;
-	tv.tv_usec = 100000;
-
-	FD_ZERO(&fds);
-	FD_SET(w->tcpDataSock, &fds);
-
-	res = select(FD_SETSIZE, &fds, NULL, NULL, &tv);
-
-	if (FD_ISSET(w->tcpDataSock, &fds)) {
-		res = recv(w->tcpDataSock, engp->packetBuf, engp->packBufSize, 0);
-		if (res > 0) {
-			gettimeofday(&nowTV, NULL);
-			engp->packetLen = res;
-			if (engp->stats.BytesRecvd == 0)
-				engp->stats.StartRecv = nowTV;
-			engp->stats.BytesRecvd += res;
-			engp->stats.StopRecv = nowTV;
-		}
-	}
-
-	return 0;	
-}
-
-/* --------------------------------------------------- ConsumeUDPData ---- *\
-
-  Read UDP packets from send and receive sockets and update counters,
-  receive start/stop times, byte- and packet-counters, natOpen flag, etc. 
-  in the TPEngine struct. Note that a lot of this functionality may be 
-  moved to the engine later.
-
-\* ----------------------------------------------------------------------- */
-
-int ConsumeUDPData(TPEngine *engp)
-{
-	int				ret;
-	int				len;
-	int				fromLen;
-	UINT32			rTrip;
-	struct tpPacket		*tPnt;
-	SOCKADDR_IN		fromAdr;
-	WSInfo * w;
-	struct timeval tv;
-	fd_set fds;
-	
-	w = (WSInfo *) (engp->ctrlRefp);
-	if (w == 0) return 0;				// Never allocated
-
-	tv.tv_sec = tv.tv_usec = 0;
-
-	
-	if (engp->iAmServer) {
-		if (engp->tpMode == M_UDP_FDX || engp->tpMode == M_UDP_SEND)
-			tv.tv_usec = 100000;
-	}
-	else {
-		if (engp->tpMode == M_UDP_RECV)
-			tv.tv_usec = 100000;
-		else if (engp->tpMode == M_UDP_FDX) {
-			struct timeval nowTV;
-			gettimeofday(&nowTV, NULL);
-			tv.tv_sec = engp->nextSendTV.tv_sec - nowTV.tv_sec;
-			tv.tv_usec = engp->nextSendTV.tv_usec - nowTV.tv_usec;
-			if (tv.tv_usec < 0) {
-				if (tv.tv_sec > 0) {
-					tv.tv_sec -= 1;
-					tv.tv_usec += 1000000;
-				}
-				else
-					tv.tv_usec = 0;
-			}
-		}
-	}
-
-	FD_ZERO(&fds);
-	FD_SET(w->udpRecvSock, &fds);
-	FD_SET(w->udpSendSock, &fds);
-	ret = select(FD_SETSIZE, &fds, NULL, NULL, &tv);
-
-	fromLen = sizeof(fromAdr);
-
-	while (FD_ISSET(w->udpRecvSock, &fds)) {
-		len = recvfrom(w->udpRecvSock, engp->packetBuf, engp->packBufSize, 
-				0, (SOCKADDR *)&fromAdr, &fromLen);
-
-		// We got something on our receive socket
-		if (len > 0) {
-			// Provide the engine with info about this packet
-			engp->packetfromAdr.s_addr = fromAdr.sin_addr.s_addr;
-			engp->packetfromPort = ntohs(fromAdr.sin_port);
-			engp->packetLen = len;
-
-			tPnt = (struct tpPacket *) engp->packetBuf;
-
-//			printf("%d-byte packet from %s:%d\n",
-//				len, inet_ntoa(fromAdr.sin_addr), ntohs(fromAdr.sin_port));
-
-			// Check if this seems to be a valid data packet
-			if (engp->packetfromAdr.s_addr == engp->hostIP.s_addr &&
-				ntohl(tPnt->Header.Cookie) == engp->sessCookie) {
-
-				// Check if packet out of order and if so, increase ooCount
-				// *** Think about moving this code to the engine instead
-				if (ntohl(tPnt->Header.Sequence) < engp->prevPacket)
-					engp->stats.ooCount += 1;
-				else
-					engp->prevPacket = ntohl(tPnt->Header.Sequence);
-
-				// If we haven't received anything before, set StartRecv time
-				if (engp->stats.BytesRecvd == 0) 
-					gettimeofday(&(engp->stats.StartRecv), NULL);
-
-				// Always set StopRecv time
-				gettimeofday(&(engp->stats.StopRecv), NULL);
-
-				// Update receive stats
-				engp->stats.PktsRecvd += 1;
-				engp->stats.BytesRecvd += ( len + IP_UDP_SIZE );		 		
-
-				// Update roundtrip time stats unless we're in server mode in which case we
-				// just return the packets instead
-				if (engp->tpMode == M_UDP_FDX) {
-					if (engp->iAmServer != 1) {
-			   			rTrip = ( engp->stats.StopRecv.tv_sec - ntohl( tPnt->Header.ClientSendTime.tv_sec ) ) * 1000000;
-			   			rTrip += ( engp->stats.StopRecv.tv_usec - ntohl( tPnt->Header.ClientSendTime.tv_usec ) );
-						if ( rTrip > engp->stats.MaxRoundtrip ) 
-							engp->stats.MaxRoundtrip = rTrip;
-				    		else if ( rTrip < engp->stats.MinRoundtrip )	// *** else if?
-							engp->stats.MinRoundtrip = rTrip;
-				    		engp->stats.TotalRoundtrip += rTrip;
-				    		engp->stats.nRoundtrips++;
-			 		}
-					else {
-						if (engp->packetLen > 0) {  // We got a packet
-							if (engp->packetfromAdr.s_addr == engp->hostIP.s_addr) {  // And from the right host
-								if (((unsigned long)(engp->sessCookie)) == ntohl(((TPPacket *)(engp->packetBuf))->Header.Cookie) &&
-									engp->sessCookie != 0) {  // Packet contained the right cookie
-									TPPacket *tPnt = (TPPacket *)engp->packetBuf;
-									tPnt->Header.ServerRecvTime.tv_sec = htonl( engp->stats.StopRecv.tv_sec );
-									tPnt->Header.ServerRecvTime.tv_usec = htonl( engp->stats.StopRecv.tv_usec );
-									SendUDPDataPacket(engp);
-								}
-								else {
-//									printf("Wrong cookie\n");
-									// From the right host but with invalid cookie.
-								}
-							}
-							else {
-//								printf("Wrong host\n");
-								// packet from some other host than our peer
-							}
-						}
-					}
-				}
-				// Consider NAT open procedure to have succeeded
-				engp->natOpen = 1;
-			}
-//			else
-//				printf("Invalid packet\n");
-		}
-		FD_ZERO(&fds);
-		FD_SET(w->udpRecvSock, &fds);
-		tv.tv_sec = tv.tv_usec = 0;
-		ret = select(FD_SETSIZE, &fds, NULL, NULL, &tv);
-	}
-	FD_ZERO(&fds);
-	FD_SET(w->udpSendSock, &fds);
-	tv.tv_sec = tv.tv_usec = 0;
-	ret = select(FD_SETSIZE, &fds, NULL, NULL, &tv);
-
-	// Check for incoming data on our *SEND* socket
-	// we do this to detect NAT open packets
-	while (FD_ISSET(w->udpSendSock, &fds)) {
-
-		len = recvfrom(w->udpSendSock, engp->packetBuf, engp->packBufSize,
-			0, (SOCKADDR *)&fromAdr, &fromLen);
-
-		if (len > 0) {
-			// Provide the engine with info about this packet
-			engp->packetfromAdr.s_addr = fromAdr.sin_addr.s_addr;
-			engp->packetfromPort = ntohs(fromAdr.sin_port);
-			engp->packetLen = len;
-			tPnt = (TPPacket *)engp->packetBuf;
-
-			// Check if it's a valid NAT open packet
-			if (engp->packetfromAdr.s_addr == engp->hostIP.s_addr && 
-				ntohl(tPnt->Header.Cookie) == engp->sessCookie) {
-//				printf("It's a NATOPEN! Yiehaa. From %u to %u\n",
-//					engp->packetfromPort, engp->myUDPSendPort);
-				// We have a real NAT-open packet. Hopefully.
-				engp->natOpen = 1;
-				engp->hostUDPRecvPort = engp->packetfromPort;
-			}
-		}
-		FD_ZERO(&fds);
-		FD_SET(w->udpSendSock, &fds);
-		tv.tv_sec = tv.tv_usec = 0;
-		ret = select(FD_SETSIZE, &fds, NULL, NULL, &tv);
-	}
-
-	return 0;
-}
-
-
-
-
-
-/* --------------------------------------------------- ClearCtrlReply ---- *\
-
-  Clear old control message. Might be renamed to ClearCtrlMessage() ***
-
-\* ----------------------------------------------------------------------- */
-
-void	ClearCtrlReply(TPEngine *engp)
-{
-	WSInfo		*w;
-
-	w = (WSInfo *) (engp->ctrlRefp);
-	if (w == 0) return;				// Never allocated
-
-	engp->ctrlMessageComplete = 0;			// No reply seen
-	w->replyCnt = w->replyPos = w->crSeen = 0;		// Nothing in line buffer
-}
-
-void DeleteSessComm(TPEngine *engp) {
-	CloseAllSockets(engp);
-}
-
-void CloseAllSockets(TPEngine *engp) {
-
-	WSInfo * w;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0) return;
-
-	close(w->tcpCtrlSock);
-	w->tcpCtrlSock = INVALID_SOCKET;
-	close(w->tcpDataSock);
-	w->tcpDataSock = INVALID_SOCKET;
-	close(w->tcpServerCtrlSock);
-	w->tcpServerCtrlSock = INVALID_SOCKET;
-	close(w->tcpServerDataSock);
-	w->tcpServerDataSock = INVALID_SOCKET;
-	close(w->udpRecvSock);
-	w->udpRecvSock = INVALID_SOCKET;
-	close(w->udpSendSock);
-	w->udpSendSock = INVALID_SOCKET;
-
-	w->ctrlConnInProg = 0;
-	w->ctrlConnOK = 0;
-	w->dataConnInProg = 0;
-	w->dataConnOK = 0;
-	engp->tcpCtrlConnectComplete = 0;
-	engp->tcpDataConnectComplete = 0;
-
-}
-
-
-
-// ContinueConnectTCP() continues with the current TCP connect()
-// procedure in progress. It sets either tcpCtrlConnectComplete = 1
-// or tcpDataConnectComplete = 1 when connected, depending on what
-// socket is being connected.
-//
-
-int ContinueConnectTCP(TPEngine *engp)
-{
-	WSInfo *w	= 0;
-	fd_set wfds, efds;
-	struct timeval tv;
-	SOCKET sock;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-
-	if (w->ctrlConnInProg)
-		sock = w->tcpCtrlSock;
-	else if (w->dataConnInProg)
-		sock = w->tcpDataSock;
-	else
-		return -1;
-
-	FD_ZERO(&wfds);
-	FD_ZERO(&efds);
-	FD_SET(sock, &wfds);
-	FD_SET(sock, &efds);
-	tv.tv_sec = tv.tv_usec = 0;
-
-	if (select(FD_SETSIZE, NULL, &wfds, &efds, &tv) == SOCKET_ERROR) {
-		return errno;
-	}
-
-	if (w->ctrlConnInProg) {
-		if (FD_ISSET(sock, &wfds)) {
-			w->xferCnt = w->xferPos = 0;
-			w->replyCnt = w->replyPos = 0;
-			w->sendBufCnt = w->sendBufPos = 0;
-			w->ctrlConnOK = 1;
-			w->ctrlConnInProg = 0;
-			engp->tcpCtrlConnectComplete = 1;
-		}
-		else if (FD_ISSET(sock, &efds)) {
-			w->ctrlConnInProg = 0;
-			return -1;
-		}
-	}
-	else {
-		if (FD_ISSET(sock, &wfds)) {
-			w->dataConnOK = 1;
-			w->dataConnInProg = 0;
-			engp->tcpDataConnectComplete = 1;
-		}
-		else if (FD_ISSET(sock, &efds)) {
-			w->dataConnInProg = 0;
-			return -1;
-		}
-	}
-	return 0;
-}
-
-
-
-// AcceptClient()
-// Executed by RunServerContext() to accept an incoming client connect
-// on either the TCP control port or the TCP data port. Sets
-// tcpCtrlConnectComplete = 1 or tcpDataConnectComplete = 1 on success
-// Also stores the remote host IP:portno in engp->hostIP and engp->hostCtrlPort
-// or engp->hostDataPort
-
-int AcceptClient(TPEngine *engp, int sockInx) {
-       WSInfo * w;
-        SOCKADDR_IN clientSa;
-        SOCKET s;
-        int saLen;
-        fd_set fds;
-        struct timeval tv;
-
-        w = (WSInfo *)(engp->ctrlRefp);
-        if (w == 0) return -1;
-
-        saLen = sizeof(clientSa);
-
-        if (sockInx == TP_SOCKINX_CTRL)
-                s = w->tcpServerCtrlSock;
-        else if (sockInx == TP_SOCKINX_DATA)
-                s = w->tcpServerDataSock;
-
-        tv.tv_sec = 1;
-        tv.tv_usec = 0;
-        FD_SET(s, &fds);        
-        select(FD_SETSIZE, &fds, NULL, NULL, &tv);
-
-        if (FD_ISSET(s, &fds)) {
-                s = accept(s, (SOCKADDR *)&clientSa, &saLen);
-        }
-        else
-                return 0;
-
-        if (s == INVALID_SOCKET) {
-#ifdef WHATOSDOESTHIS
-		if (errno != EWOULDBLOCK) 
-#else
-		if (errno != EINPROGRESS) 
-#endif
-                        return 0;
-                return errno;
-        }
-
-        if (sockInx == TP_SOCKINX_CTRL) {
-                w->tcpCtrlSock = s;
-                engp->hostIP.s_addr = clientSa.sin_addr.s_addr;
-                engp->hostCtrlPort = ntohs(clientSa.sin_port);
-                engp->tcpCtrlConnectComplete = 1;
-                w->xferCnt = w->xferPos = 0;
-                w->replyCnt = w->replyPos = 0;
-                w->sendBufCnt = w->sendBufPos = 0;
-                w->ctrlConnOK = 1;
-        }
-	else if (sockInx == TP_SOCKINX_DATA) {
-		int optlen = sizeof(int);
-		w->tcpDataSock = s;
-		engp->tcpDataConnectComplete = 1;
-		w->dataConnOK = 1;
-		if (engp->socket_sndbuf != 0) {
-			setsockopt(s, SOL_SOCKET, SO_SNDBUF, 
-				&engp->socket_sndbuf, optlen);
-		}
-		getsockopt(s, SOL_SOCKET, SO_SNDBUF,
-			&engp->cur_socket_sndbuf, &optlen);
-		if (engp->socket_rcvbuf != 0) {
-			setsockopt(s, SOL_SOCKET, SO_RCVBUF, 
-				&engp->socket_rcvbuf, optlen);
-		}
-		getsockopt(s, SOL_SOCKET, SO_RCVBUF,
-			&engp->cur_socket_rcvbuf, &optlen);
-	}
-
-	return 0;
-
-}
-
-
-// 32-bit random number generator.
-int Rand32() {
-	struct timeval tm;
-	gettimeofday(&tm, NULL);
-	srand(tm.tv_usec);
-	return (rand() * rand());
-}
-
-// Sends data directly from a buffer with a specified length to the
-// connected remote host, via either the TCP control socket or the
-// TCP data socket. Returns the number of bytes sent.
-//
-int SendTCPData(TPEngine *engp, char * buf, int len, int sockInx) {
-	WSInfo * w;
-	int res = 0;
-	struct timeval tv;
-	fd_set fds;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0) return -1;
-
-	tv.tv_sec = 0;
-	tv.tv_usec = engp->callMeAgain;
-
-	FD_ZERO(&fds);
-
-	if (sockInx == TP_SOCKINX_CTRL) {
-		FD_SET(w->tcpCtrlSock, &fds);
-		if (select(FD_SETSIZE, NULL, &fds, NULL, &tv) == 1)
-			res = send(w->tcpCtrlSock, buf, len, 0);
-	}
-	else if (sockInx == TP_SOCKINX_DATA) {
-		FD_SET(w->tcpDataSock, &fds);
-		if (select(FD_SETSIZE, NULL, &fds, NULL, &tv) == 1)
-			res = send(w->tcpDataSock, buf, len, 0);
-	}
-
-	return res;
-}
-
-
-// Initiate a TCP control or data connection to a server
-int InitConnectTCP(TPEngine *engp, int sockInx)
-{
-	int				res		= -1;
-	WSInfo		*w		= 0;
-	SOCKADDR_IN		serverAdr;
-	
-	w = (WSInfo *) engp->ctrlRefp;
-	if (w == 0) return -1;
-	
-	serverAdr.sin_family = AF_INET;
-	serverAdr.sin_addr.s_addr = engp->hostIP.s_addr;
-
-	res = InitTCPSock(engp, sockInx);
-	if (res != 0)
-		return res;
-
-	switch (sockInx) {
-	case TP_SOCKINX_CTRL:	
-		serverAdr.sin_port = htons(engp->hostCtrlPort);
-		res = connect(w->tcpCtrlSock, (SOCKADDR *)&serverAdr, 
-			sizeof(SOCKADDR_IN));
-		w->ctrlConnInProg = 1;
-		break;
-	case TP_SOCKINX_DATA:
-		serverAdr.sin_port = htons(engp->hostTCPDataPort);
-		res = connect(w->tcpDataSock, (SOCKADDR *)&serverAdr, 
-			sizeof(SOCKADDR_IN));
-		w->dataConnInProg = 1;
-		break;
-	default:
-		return -1;	// Invalid TCP socket to connect
-	}
-	
-	if (res == SOCKET_ERROR) {
-#ifdef WHATOSDOESTHIS
-		if (errno != EWOULDBLOCK) {
-#else
-		if (errno != EINPROGRESS) {
-#endif
-			switch (sockInx) {
-				case TP_SOCKINX_CTRL:
-					w->ctrlConnInProg = 0;
-					break;
-				case TP_SOCKINX_DATA:
-					w->dataConnInProg = 0;
-					break;
-			}
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-int CloseCtrlSock(TPEngine *engp) {
-	WSInfo * w;
-	int ret;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0) return -1;
-
-	w->ctrlConnInProg = 0;
-	w->ctrlConnOK = 0;
-	engp->tcpCtrlConnectComplete = 0;
-
-	ret = close(w->tcpCtrlSock);
-	w->tcpCtrlSock = INVALID_SOCKET;
-	if (ret == SOCKET_ERROR)
-		return errno;
-	
-	return 0;
-}
-
-
-/* ---------------------------------------------------- SendUDPPacket ---- *\
-
-	Send next UDP packet to the remote host's UDP receive port from our
-	UDP send socket. Packet content is taken from engp->packetBuf.
-
-\* ----------------------------------------------------------------------- */
-
-int SendUDPPacket(TPEngine *engp, int length)
-{
-	WSInfo		*w		= 0;
-	struct tpPacket	*tPnt;
-	SOCKADDR_IN udpPeerRecvAdr;
-	
-	w = (WSInfo *) engp->ctrlRefp;
-	if (w == 0) return 0;	
-
-	tPnt = (struct tpPacket *) engp->packetBuf;
-	if (tPnt == 0) return 0;				// No packet buffer set
-
-    udpPeerRecvAdr.sin_family = AF_INET;
-	udpPeerRecvAdr.sin_addr.s_addr = engp->hostIP.s_addr;
-	udpPeerRecvAdr.sin_port = htons(engp->hostUDPRecvPort);
-
-	// Send the data to the socket
-//	printf("Sending %d byte UDP packet from %u to %u\n",
-//		length, engp->myUDPSendPort, engp->hostUDPRecvPort);
-		
-	return sendto(w->udpSendSock, (char *)tPnt, length, 0, (SOCKADDR *)&(udpPeerRecvAdr), sizeof(SOCKADDR_IN));
-
-}
-
-/*
-int InitHostNameLookup(TPEngine *engp) {
-	WSInfo * w;
-	int i;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0) return -1;
-
-	if (strlen(engp->hostName) == 0)
-		return TPER_NOHOSTNAME;
-
-	if (w->lookupBuf == 0)
-		w->lookupBuf = (char *)calloc(MAXGETHOSTSTRUCT+1, 1);
-
-	for (i = 0; i < MAX_LOOKUP_IP; i++)
-		engp->hostIPTab[i].s_addr = (UINT32)0;
-
-	if (inet_addr(engp->hostName) == INADDR_NONE) {
-		memset(w->lookupBuf, 0, MAXGETHOSTSTRUCT);
-		w->lookupHandle = WSAAsyncGetHostByName(NULL, 0, engp->hostName, w->lookupBuf, MAXGETHOSTSTRUCT);
-	}
-	else 
-		engp->hostIPTab[0].s_addr = inet_addr(engp->hostName);
-
-	return 0;
-}
-*/
-/*
-int ContinueHostNameLookup(TPEngine *engp) {
-	WSInfo * w;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0) return -1;
-
-
-
-}
-*/
-
-
-// Queue data for transmission on the TCP control socket
-int QueueCtrlData(TPEngine *engp, char *data)
-{
-	int				len;
-	int				err;
-	WSInfo		*w;
-	
-	w = (WSInfo *) engp->ctrlRefp;
-	if (w == 0) return -1;	// Never allocated
-	if (!w->ctrlConnOK) return -1;
-
-	len = strlen(data);
-	if ((w->sendBufCnt + len) < (REPLYBUF_SIZE * 2))
-		strcpy(w->sendBuf + w->sendBufCnt, data);	// Just add o buffer
-
-	w->sendBufCnt += len;
-	
-	err = SendCtrlData(engp);				// Try to get rid of it
-	return err;
-}
-
-
-// Actually try to send the data on the control socket
-int SendCtrlData(TPEngine *engp) {
-	WSInfo *w;
-	char * p;
-	int len, bytesSent;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0) return -1;
-
-	if (w->tcpCtrlSock == INVALID_SOCKET) {
-		return -1;
-	}
-
-	if (w->sendBufCnt <= 0) return 0;
-
-	p = w->sendBuf + w->sendBufPos;
-	len = w->sendBufCnt - w->sendBufPos;
-	
-	bytesSent = send(w->tcpCtrlSock, w->sendBuf, len, 0);
-
-	if (bytesSent > 0) {
-		if (bytesSent == len) 
-			w->sendBufCnt = w->sendBufPos = 0;
-		else
-			w->sendBufPos += bytesSent;
-	}
-	else {
-		if (bytesSent == SOCKET_ERROR) {
-			w->lastErr = errno;
-		}
-	}
-	return 0;
-}
-
-
-int CheckCtrlOpen(TPEngine *engp) 
-{
-	WSInfo *w;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0)
-		return 0;			// Never allocated
-
-	if (w->ctrlConnOK) return 1;
-	return 0;
-}
-
-
-int ConsumeCtrlData(TPEngine *engp)
-{
-	WSInfo		*w;
-	int c, ret, cnt;
-	fd_set fds;
-	struct timeval tv;
-
-	w = (WSInfo *) engp->ctrlRefp;
-	if (w == 0) return 0;				// Never allocated
-	
-	if (engp->ctrlMessageComplete != 0) goto done;		// Old data still unprocessed
-
-	while (w->xferCnt > 0) {					// We have some data in xfer buffer
-		c = w->xferBuf[w->xferPos] & 255;
-		w->xferPos += 1;
-		w->xferCnt -= 1;
-		
-		if (c == CR) {
-			w->crSeen = 1;
-			continue;
-		}
-		if (c == LF && w->crSeen) {
-			w->replyBuf[w->replyCnt] = 0;
-			strncpy(engp->ctrlMessage, w->replyBuf, REPLYBUFSIZE-1);
-			engp->ctrlMessageComplete = 1;
-			w->crSeen = 0;
-//			if (1) dprintf("Ctrl data: <%s>\n", top->replyBuf);
-//			printf("Ctrl data: %s\n", w->replyBuf);
-			break;
-			
-		} else {
-			// Do not overwrite our line buffer. If the line is too long,
-			// do not copy any characters beyond our limit (REPLYBUF_SIZE-1)
-			if (w->replyCnt < (REPLYBUF_SIZE - 1))
-				w->replyBuf[w->replyCnt] = c;
-			w->replyCnt++;
-		}
-	}
-	
-	if (engp->ctrlMessageComplete != 0) goto done;		// Old data still unprocessed
-
-	// Read new data from socket
-	tv.tv_sec = 0;
-	tv.tv_usec = 0;
-
-	FD_ZERO(&fds);
-	FD_SET(w->tcpCtrlSock, &fds);
-	ret = select(FD_SETSIZE, &fds, NULL, NULL, &tv);	
-        if (ret == SOCKET_ERROR) {
-		return errno;
-	}
-	if (FD_ISSET(w->tcpCtrlSock, &fds)) {
-		cnt = recv(w->tcpCtrlSock, w->xferBuf, XFERBUF_SIZE - 1, 0);
-		if (cnt == SOCKET_ERROR) {
-			w->ctrlConnOK = 0;
-			w->lastErr = errno;
-		}
-		else {
-			w->xferCnt = cnt;
-			w->xferPos = 0;
-		}
-	}
-
-	
-done:
-	return 0;							// Dummmy
-}
-
-
-#ifdef NO_GETTIMEOFDAY
-/*
- * Init gettimeofday() variables
- * Returns 1 if system supports high-resolution timer
- */
-int Init_gettimeofday()
-{
-	if (!QueryPerformanceFrequency((LARGE_INTEGER*)&performance_frequency))
-		return 0;
-	QueryPerformanceCounter((LARGE_INTEGER *)&counter_start_value);
-	start_sec = time(NULL);
-	return 1;
-}
-
-// Faked gettimeofday() function for Windows, using the 
-// Win32 performance counter
-void gettimeofday(struct timeval *tv, void *tz)
-{
-	_int64 time_now, dtime;
-	int dsecs, dnsecs;
-	QueryPerformanceCounter((LARGE_INTEGER *)&time_now);
-
-	dtime = time_now - counter_start_value;
-	dsecs = (int)(dtime / performance_frequency);
-	dnsecs = (int)( ((double)(dtime % performance_frequency)) / ((double)performance_frequency) * 1000000.0);
-
-	tv->tv_sec = start_sec + dsecs;
-	tv->tv_usec = dnsecs;
-}
-#endif
-
-
-// Create UDP send and receive sockets. Bind them to allocate local port numbers
-// and find out what local port numbers were allocated so we can tell this to 
-// our peers when setting up new test sessions. Store the local port numbers in
-// engp->myUDPSendPort and engp->myUDPRecvPort.
-//
-// Suggested is also to check the value of engp->myUDPSendPort and myUDPRecvPort
-// before doing the bind. If they have a value other than zero it means you should
-// try to bind to that port instead of binding to any available port like is done
-// below.
-//
-
-int InitUDP(TPEngine *engp) {
-	int saLen, noBlock, optlen;
-	SOCKADDR_IN rcvSa;
-
-	WSInfo * w;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0) return -1;
-
-	w->udpRecvSock = socket(AF_INET, SOCK_DGRAM, 0);
-	if( w->udpRecvSock == INVALID_SOCKET ) {
-//		MessageBox(CurDlg, "Can't create rcv data socket", TPERROR, MB_OK);
-		goto fail;
-	}
-
-	w->udpSendSock = socket(AF_INET, SOCK_DGRAM, 0);
-	if( w->udpSendSock == INVALID_SOCKET ) {
-//		MessageBox(CurDlg, "Can't create send data socket", TPERROR, MB_OK);
-		goto fail;
-	}
-
-	noBlock = fcntl(w->udpSendSock, F_GETFL);
-	noBlock |= O_NONBLOCK;
-	fcntl(w->udpSendSock, F_SETFL, noBlock);
-	if (!(fcntl(w->udpSendSock, F_GETFL) & O_NONBLOCK)) {
-//		MessageBox(CurDlg, "Can't set non-blocking mode for send socket", TPERROR, MB_OK);
-		goto fail;
-	}
-
-	noBlock = fcntl(w->udpRecvSock, F_GETFL);
-	noBlock |= O_NONBLOCK;
-	fcntl(w->udpRecvSock, F_SETFL, noBlock);
-	if (!(fcntl(w->udpRecvSock, F_GETFL) & O_NONBLOCK)) {
-//		MessageBox(CurDlg, "Can't set non-blocking mode for rcv socket", TPERROR, MB_OK);
-		goto fail;
-	}
-
-	/*
-	 * Bind the data sockets to allocate port numbers.
-	 */
-	memset( &rcvSa, 0, sizeof rcvSa );
-#ifdef HAS_SINLEN
-		rcvSa.sin_len = sizeof( struct sockaddr_in );
-#endif
-	rcvSa.sin_family = AF_INET;
-	rcvSa.sin_addr.s_addr = INADDR_ANY;
-	rcvSa.sin_port =  0;
-	if( bind( w->udpRecvSock, (struct sockaddr *)(&rcvSa), sizeof rcvSa ) < 0 ) {
- //   	MessageBox(CurDlg, "Can't bind rcv data socket", TPERROR, MB_OK);
-		goto fail;
-	}
-	/*
-	 * Get the local port number assigned to the data socket.
-	 */
-	saLen = sizeof rcvSa;
-	if( getsockname( w->udpRecvSock, (struct sockaddr *)(&rcvSa), &saLen ) != 0 ) {
-// 		MessageBox(CurDlg, "Can't get local port number on rcv data socket", TPERROR, MB_OK);
-		goto fail;
-	}
-	engp->myUDPRecvPort = ntohs(((SOCKADDR_IN *)&rcvSa)->sin_port);
-
-
-	memset( &rcvSa, 0, sizeof rcvSa );
-#ifdef HAS_SINLEN
-		rcvSa.sin_len = sizeof( struct sockaddr_in );
-#endif
-	rcvSa.sin_family = AF_INET;
-	rcvSa.sin_addr.s_addr = INADDR_ANY;
-	rcvSa.sin_port =  0;
-	if( bind( w->udpSendSock, (struct sockaddr *)(&rcvSa), sizeof rcvSa ) < 0 ) {
- //   	MessageBox(CurDlg, "Can't bind rcv data socket", TPERROR, MB_OK);
-		goto fail;
-	}
-	/*
-	 * Get the local port number assigned to the data socket.
-	 */
-	saLen = sizeof rcvSa;
-	if( getsockname( w->udpSendSock, (struct sockaddr *)(&rcvSa), &saLen ) != 0 ) {
-// 		MessageBox(CurDlg, "Can't get local port number on rcv data socket", TPERROR, MB_OK);
-		goto fail;
-	}
-	engp->myUDPSendPort = ntohs(((SOCKADDR_IN *)&rcvSa)->sin_port);
-
-//	printf("myUDPSendPort = %d      myUDPRecvPort=%d\n", 
-//		engp->myUDPSendPort, engp->myUDPRecvPort);
-
-
-	optlen = sizeof(int);
-	if (engp->socket_sndbuf != 0) {
-		setsockopt(w->udpSendSock, SOL_SOCKET, SO_SNDBUF, 
-			&engp->socket_sndbuf, optlen);
-		setsockopt(w->udpRecvSock, SOL_SOCKET, SO_SNDBUF, 
-			&engp->socket_sndbuf, optlen);
-	}
-	getsockopt(w->udpSendSock, SOL_SOCKET, SO_SNDBUF,
-		&engp->cur_socket_sndbuf, &optlen);
-	if (engp->socket_rcvbuf != 0) {
-		setsockopt(w->udpSendSock, SOL_SOCKET, SO_RCVBUF, 
-			&engp->socket_rcvbuf, optlen);
-		setsockopt(w->udpRecvSock, SOL_SOCKET, SO_RCVBUF, 
-			&engp->socket_rcvbuf, optlen);
-	}
-	getsockopt(w->udpSendSock, SOL_SOCKET, SO_RCVBUF,
-		&engp->cur_socket_rcvbuf, &optlen);
-
-
-	return 0;
-
-fail:
-	CloseAllSockets(engp);
-	if (errno != 0)
-		return errno;
-	return -1;
-}
-
-
-
-// InitTCPSock() - Create TCP sockets.
-//
-// TP_SOCKINX_CTRL = a client control socket
-// TP_SOCKINX_SCTRL = a server control socket that is set to listen for
-// incoming connections. 
-//
-// Try to bind to the IP address stored in engp->myLocalAddress or
-// any address if the value is 0 (zero)
-//
-// TP_SOCKINX_CTRL: try to bind to the port number stored in engp->myTCPControlPort
-//					or any port if value is zero
-// TP_SOCKINX_DATA: try to bind to the port number stored in engp->myTCPDataPort
-//					or any port if value is zero
-// TP_SOCKINX_SCTRL: Bind to myTCPControlPort if non-zero or DEFAULT_CONTROL_PORT
-//					otherwise. Set the socket to listen for incoming connections
-// TP_SOCKINX_SDATA: Bind to myTCPDataPort if non-zero or any port otherwise.
-//					 Set the socket to listen for incoming connections and store
-//					 the local port number in engp->myTCPDataPort.
-//
-
-int InitTCPSock(TPEngine *engp, int sockInx) {
-	WSInfo * w;
-	SOCKADDR_IN locSa;
-	int saLen, optlen;
-	int ret, noBlock;
-	struct linger ling;
-	int one = 1;
-
-	ling.l_onoff = 0;
-
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == 0)
-		return -1;
-
-	saLen = sizeof(locSa);
-	memset(&locSa, 0, sizeof(locSa));
-	locSa.sin_family = AF_INET;
-	if (engp->myLocalAddress.s_addr != (UINT32)0)
-		locSa.sin_addr.s_addr = engp->myLocalAddress.s_addr;
-	else
-		locSa.sin_addr.s_addr = INADDR_ANY;
-	
-	switch (sockInx) {
-
-	case TP_SOCKINX_CTRL:		// Client opening a control socket
-
-		// Create socket
-		w->tcpCtrlSock = socket(AF_INET, SOCK_STREAM, 0);
-		if ( w->tcpCtrlSock == INVALID_SOCKET ) 
-			goto fail;
-		// Set non-blocking mode
-
-		noBlock = fcntl(w->tcpCtrlSock, F_GETFL);
-		noBlock |= O_NONBLOCK;
-		fcntl(w->tcpCtrlSock, F_SETFL, noBlock);
-		if (!(fcntl(w->tcpCtrlSock, F_GETFL) & O_NONBLOCK))
-			goto fail;
-
-		// Check if we want to bind to a specific local port
-		if ( engp->myTCPControlPort != 0 ) 
-			locSa.sin_port = htons(engp->myTCPControlPort);
-		else
-			locSa.sin_port = 0;
-		// If we want a specific port or address, bind to them
-		if (engp->myTCPControlPort != 0 || engp->myLocalAddress.s_addr != 0) {
-			ret = bind(w->tcpCtrlSock, (SOCKADDR *)&locSa, saLen);
-			if (ret != 0)
-				goto fail;
-		}
-		
-		// Get bound address/port combination
-		if (getsockname(w->tcpCtrlSock, (SOCKADDR *)(&locSa), &saLen) == SOCKET_ERROR)
-			goto fail;
-		engp->myLocalAddress.s_addr = locSa.sin_addr.s_addr;
-		engp->myTCPControlPort = ntohs(locSa.sin_port);
-
-		break;
-
-	case TP_SOCKINX_DATA:		// Client opening a data socket
-		w->tcpDataSock = socket(AF_INET, SOCK_STREAM, 0);
-		if ( w->tcpDataSock == INVALID_SOCKET ) 
-			goto fail;
-
-		noBlock = fcntl(w->tcpDataSock, F_GETFL);
-		noBlock |= O_NONBLOCK;
-		fcntl(w->tcpDataSock, F_SETFL, noBlock);
-		if (!(fcntl(w->tcpDataSock, F_GETFL) & O_NONBLOCK))
-			goto fail;
-
-		optlen = sizeof(int);
-		if (engp->socket_sndbuf != 0) {
-			setsockopt(w->tcpDataSock, SOL_SOCKET, SO_SNDBUF, 
-				&engp->socket_sndbuf, optlen);
-		}
-		getsockopt(w->tcpDataSock, SOL_SOCKET, SO_SNDBUF,
-			&engp->cur_socket_sndbuf, &optlen);
-		if (engp->socket_rcvbuf != 0) {
-			setsockopt(w->tcpDataSock, SOL_SOCKET, SO_RCVBUF, 
-				&engp->socket_rcvbuf, optlen);
-		}
-		getsockopt(w->tcpDataSock, SOL_SOCKET, SO_RCVBUF, 
-			&engp->cur_socket_rcvbuf, &optlen);
-
-
-		if (engp->myTCPDataPort != 0)
-			locSa.sin_port = htons(engp->myTCPDataPort);
-		if (engp->myLocalAddress.s_addr != 0 || engp->myTCPDataPort != 0) {
-			ret = bind(w->tcpDataSock, (SOCKADDR *)&locSa, saLen);
-			if (ret != 0)
-				goto fail;
-		}
-		break;
-
-	case TP_SOCKINX_SCTRL:		// Server opening a listen control socket
-
-		w->tcpServerCtrlSock = socket(AF_INET, SOCK_STREAM, 0);
-		if ( w->tcpServerCtrlSock == INVALID_SOCKET ) 
-			goto fail;
-
-		noBlock = fcntl(w->tcpServerCtrlSock, F_GETFL);
-		noBlock |= O_NONBLOCK;
-		fcntl(w->tcpServerCtrlSock, F_SETFL, noBlock);
-		if (!(fcntl(w->tcpServerCtrlSock, F_GETFL) & O_NONBLOCK))
-			goto fail;
-
-		// REUSEADDR so the OS will let use reuse that particular port next time
-		if ( setsockopt( w->tcpServerCtrlSock, SOL_SOCKET, SO_REUSEADDR, (char *)(&one),
-			sizeof( one ) ) != 0 )
-			goto fail;
-		// DONTLINGER to avoid keeping sockets with unsent data alive
-/*
-		if ( setsockopt( w->tcpServerCtrlSock, SOL_SOCKET, SO_LINGER, (char *)(&ling),
-			sizeof( struct linger ) ) != 0 )
-			goto fail;
-*/
-		locSa.sin_family = AF_INET;
-		if (engp->myLocalAddress.s_addr != 0)
-			locSa.sin_addr.s_addr = engp->myLocalAddress.s_addr;
-		else
-			locSa.sin_addr.s_addr = INADDR_ANY;
-		if (engp->myTCPControlPort != 0)
-			locSa.sin_port = htons(engp->myTCPControlPort);
-		else
-			locSa.sin_port = htons(DEFAULT_CONTROL_PORT);
-
-		ret = bind( w->tcpServerCtrlSock, (SOCKADDR *)&locSa, saLen );
-		if (ret != 0)
-			goto fail;
-
-		// Get bound address/port combination
-		if (getsockname(w->tcpServerCtrlSock, (SOCKADDR *)(&locSa), &saLen) == SOCKET_ERROR)
-			goto fail;
-		engp->myLocalAddress.s_addr = locSa.sin_addr.s_addr;
-		engp->myTCPControlPort = ntohs(locSa.sin_port);
-
-		ret = listen( w->tcpServerCtrlSock, LISTEN_BACKLOG );
-		if (ret != 0) 
-			goto fail;
-
-		break;
-
-	case TP_SOCKINX_SDATA:		// Server opening a listen data socket
-
-		w->tcpServerDataSock = socket(AF_INET, SOCK_STREAM, 0);
-		if ( w->tcpServerDataSock == INVALID_SOCKET ) 
-			goto fail;
-
-		noBlock = fcntl(w->tcpServerDataSock, F_GETFL);
-		noBlock |= O_NONBLOCK;
-		fcntl(w->tcpServerDataSock, F_SETFL, noBlock);
-		if (!(fcntl(w->tcpServerDataSock, F_GETFL) & O_NONBLOCK))
-			goto fail;
-
-		if ( setsockopt( w->tcpServerDataSock, SOL_SOCKET, SO_REUSEADDR, (char *)(&one),
-			sizeof( one ) ) != 0 )
-			goto fail;
-
-/*
-		if ( setsockopt( w->tcpServerDataSock, SOL_SOCKET, SO_LINGER, (char *)(&ling),
-			sizeof( struct linger ) ) != 0 ) 
-			goto fail;
-*/		
-
-		optlen = sizeof(int);
-		if (engp->socket_sndbuf != 0) {
-			setsockopt(w->tcpServerDataSock, SOL_SOCKET, SO_SNDBUF, 
-				&engp->socket_sndbuf, optlen);
-		}
-		getsockopt(w->tcpServerDataSock, SOL_SOCKET, SO_SNDBUF,
-			&engp->cur_socket_sndbuf, &optlen);
-		if (engp->socket_rcvbuf != 0) {
-			setsockopt(w->tcpServerDataSock, SOL_SOCKET, SO_RCVBUF, 
-				&engp->socket_rcvbuf, optlen);
-		}
-		getsockopt(w->tcpServerDataSock, SOL_SOCKET, SO_RCVBUF, 
-			&engp->cur_socket_rcvbuf, &optlen);
-
-		locSa.sin_family = AF_INET;
-		if (engp->myLocalAddress.s_addr != 0)
-			locSa.sin_addr.s_addr = engp->myLocalAddress.s_addr;
-		else
-			locSa.sin_addr.s_addr = INADDR_ANY;
-		if (engp->myTCPDataPort != 0)
-			locSa.sin_port = htons(engp->myTCPDataPort);
-		else 
-			locSa.sin_port = 0;
-		
-		ret = bind( w->tcpServerDataSock, (SOCKADDR *)&locSa, saLen );
-		if (ret != 0)
-			goto fail;
-
-		ret = getsockname(w->tcpServerDataSock, (SOCKADDR *)&locSa, &saLen);
-		if (ret != 0) 
-			goto fail;
-		engp->myTCPDataPort = ntohs(locSa.sin_port);
-
-		ret = listen( w->tcpServerDataSock, LISTEN_BACKLOG );
-		if (ret != 0) 
-			goto fail;
-
-		break;
-
-	default:
-		return -1;
-	}
-
-	return 0;
-
-
-fail:
-
-	switch (sockInx) {
-
-	case TP_SOCKINX_CTRL:
-		close(w->tcpCtrlSock);
-		break;
-	case TP_SOCKINX_SCTRL:
-		close(w->tcpServerCtrlSock);
-		break;
-	case TP_SOCKINX_DATA:
-		close(w->tcpDataSock);
-		break;
-	case TP_SOCKINX_SDATA:
-		close(w->tcpServerDataSock);
-	}
-	if (ret != 0)
-		return errno;
-	else
-		return -1;
-}
-
-
-int InitSessComm(TPEngine *engp)
-{	
-	WSInfo *w;
-	// Watch out
-	engp->ctrlRefp = (void *)calloc(1, sizeof(WSInfo));
-	w = (WSInfo *)(engp->ctrlRefp);
-	if (w == NULL)
-		return -1;
-
-	w->tcpCtrlSock = INVALID_SOCKET;
-	w->tcpDataSock = INVALID_SOCKET;
-	w->tcpServerCtrlSock = INVALID_SOCKET;
-	w->tcpServerDataSock = INVALID_SOCKET;
-	w->udpSendSock = INVALID_SOCKET;
-	w->udpRecvSock = INVALID_SOCKET;
-
-	// success
-	return 0;
-
-}
diff --git a/tptest/src/tpio_unix.h b/tptest/src/tpio_unix.h
deleted file mode 100644
index e2ff882c5ec2c4d160567909b24cfdfa93e39ca0..0000000000000000000000000000000000000000
--- a/tptest/src/tpio_unix.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * $Id: tpio_unix.h,v 1.3 2002/09/16 14:10:42 rlonn Exp $                                               
- * $Source: /cvsroot/tptest/os-dep/unix/tpio_unix.h,v $                                       
- *
- * TPTEST 3.0 (C) Copyright II-Stiftelsen 2002
- *
- * tpio_unix.h - header file
- *
- * Written by
- *  Ragnar L�nn <prl@gatorhole.com>
- *
- * This file is part of the TPTEST system.
- * See the file LICENSE for copyright notice.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA         
- * 02111-1307  USA.
- *
- */
-
-#ifndef _TPIO_SOLARIS_H_
-#define TPIO_SOLARIS_H_
-
-#define XFERBUF_SIZE	(66000)
-#define REPLYBUF_SIZE	(4096)
-#define CR				('\015')
-#define LF				('\012')
-
-typedef struct WSInfo {
-	SOCKET udpRecvSock, udpSendSock, tcpCtrlSock, tcpDataSock;
-	SOCKET tcpServerCtrlSock, tcpServerDataSock;
-	char replyBuf[REPLYBUF_SIZE];
-	char xferBuf[XFERBUF_SIZE];
-	int xferPos, replyPos, xferCnt, replyCnt;
-	int lastErr;
-	int ctrlConnOK, dataConnOK;
-	int crSeen;
-	int ctrlConnInProg, dataConnInProg;
-	char sendBuf[REPLYBUF_SIZE * 2];
-	int sendBufPos, sendBufCnt;
-	char * lookupBuf;
-} WSInfo;
-
-
-#endif
diff --git a/tptest/src/tptest3.txt b/tptest/src/tptest3.txt
deleted file mode 100644
index b580b00cce5eae1fbd2c736aaf1878b7a8aa22ef..0000000000000000000000000000000000000000
--- a/tptest/src/tptest3.txt
+++ /dev/null
@@ -1,687 +0,0 @@
-	TPTEST - Network throughput measurement program
-	-----------------------------------------------
-
-TPTEST 3.0 differs from 2.x in several ways, as explained below.
-
-1. The test logic has been separated from the rest of the code and
-   placed into a test engine. The core of the test engine is platform-
-   independent, while the I/O and UI functions need to be provided by
-   the programmer for his/her particular platform.
-
-2. The client-server protocol has been changed. Again. Now we do
-   "COMMAND var1=x;var2=y;var3=z". Reply codes are the same and a
-   reply can either be e.g. "200 Welcome" or "200 var1=x;var2=y"
-
-3. The master server protocol has also been changed to be spoken
-   in the above "var1=x;var2=y" format.
-
-4. The TCP tests are no longer done on the TCP control ports but
-   rather on a separate TCP data port that both client and server
-   opens when performing a TCP test.
-
-The changes will be discussed more thouroughly further below.
-
-
-The source package:
--------------------
-
-The source package consists of three main directories. They are:
-
-apps/		This is contributed applications (clients & servers)
-engine/		This is the platform-independent test engine logic
-os-dep/		This is the platform-dependent I/O routines
-
-The original distribution contains several simple applications:
-
-apps/macos/client/		GUI MacOS 8.x/9.x/10 client
-apps/unix/client/		Text-based Unix client (*)
-apps/unix/server/		Server daemon
-apps/unix/masterserver/		Master server daemon
-apps/windows/clients/gui/	GUI Win32 client
-apps/windows/clients/cmdline/	Text-based Win32 client (*)
-
-(*) = same program
-
-The test engine logic in the engine/ directory consists of the
-following source files:
-
-engine/tpclient.c	Client support routines
-engine/tpcommon.c	Miscellaneous routines
-engine/tpengine.c	The core engine routines
-
-and some header files:
-
-engine/tpio.h		Prototypes for the platform-dependent I/O functions
-engine/tpclient.h	Prototypes & defines for tpclient.c
-engine/tpcommon.h	Prototypes & defines for tpcommon.h
-engine/tpengine.h	Prototypes & defines for tpengine.c
-
-Of the above, tpengine.h is the most important for application programmers. 
-This is the file where the TPEngine struct is declared. TPEngine is used by 
-applications to communicate with the test engine.
-
-tpio.h is a list of prototypes of all the I/O functions the engine uses
-and which should be implemented in the platform-dependent I/O module
-os-dep/xxx/tpio_xxx.c   (e.g. os-dep/win32/tpio_win32.c)
-
-If you intend to port TPTEST to a new platform, or maybe just write a 
-better I/O module for one of the existing platforms, be sure to read all
-the comments in tpio.h. They describe the attributes of each I/O function -
-what their names are, what arguments they take, what they do and what
-return values they give - allowing you to write your own I/O package for
-your particular platform.
-
-The platform-dependent I/O packages are located in the os-dep/ directory:
-
-os-dep/unix/		Solaris/BSD/Linux I/O routines
-os-dep/win32/		Windows 95/98/NT/2000/XP I/O routines
-os-dep/macos/		MacOS/Carbon I/O routines
-
-
-Building an application:
-------------------------
-
-To build a 3.0 application you'll need the test engine files, the
-platform-dependent ones, and the main code for your application. Say
-you want to build the Unix client found in apps/unix/client/
-You would then have to do something like:
-
-mkdir tmp
-cp engine/* tmp
-cp os-dep/unix/* tmp
-cp apps/unix/client/* tmp
-cd tmp
-vi Makefile
-make
-
-Edit the Makefile and make sure you #define the correct values for your
-operating system (e.g. -DUNIX -DLINUX for a Linux machine).
-
-If the above seems overly difficult, let us know and we'll provide you with
-binaries.
-
-
-The included applications:
---------------------------
-
-The Win32 and MacOS GUI clients are fairly simple to use, and also have
-integrated help so we won't go into them here.
-
-The Win32/Unix text-based client is a simple application to demonstrate
-how to write clients and servers using the test engine. It cannot do host
-name lookups (the current tpio_unix.c does not support name lookup), it
-parses command-line arguments in a very simple way, and will dump core if
-you give it unexpected or syntactically faulty commands. It will, however,
-do TCP and UDP tests vs a test server, auto-testing vs a test server,
-and it can retrieve a server list from a master server (provided you know
-the IP-address of the master). Start the program without any arguments to
-get a list of available commands.
-
-The Unix test server is a dedicated, forking server daemon application with
-currently no configuration options. Another server, which supports all the
-old TPTEST 2.x server options (rate limiting testers, banning IP-ranges, etc)
-is on its way. The server takes only one argument and that is the TCP control
-port number it should start listening to for incoming connections.
-
-The master server is similar to the test server but it doesn't use the test
-engine at all. It just accepts connections and wait for the client to send
-either the "HELO vmajor=x;vminor=y" message or the "INFO" message. 
-
-Following a HELO-request the server responds with the contents of the 
-tptest.servers file. Look at that file for more info on what should be in it.
-An INFO request is responded to with a few lines containing contact information
-about the owners of the master server. This is to allow clients to always give
-their users up-to-date contact information. The information just needs to be
-updated on the master server. The contact info is currently hard-coded into
-the master server so a recompile is needed when the info changes.
-
-
-How to write a test application:
---------------------------------
-
-main.c:
--------
-
- #include <stdio.h>
- #include "tpengine.h"
- #include "tpclient.h"
-
- main(int argc, char **argv) {
-   TPEngine * engp;
-   int msSend, msRecv;
-   
-   if (argc < 3) {
-     printf("Usage: %s <server IP> <server control port>\n", argv[0]);
-     exit(1);
-   }
-
-   // Initialize the test engine
-   if ((engp = CreateContext()) == NULL) {
-     printf("Failed to create engine context\n");
-     exit(1);
-   }
-
-   // Set address to selected test server
-   engp->hostIP = inet_addr(argv[1]);
-   engp->hostCtrlPort = atoi(argv[2]);
-
-   // This program only does UDP receive tests
-   engp->tpMode = M_UDP_RECV;
-
-   // ...five second long ones
-   engp->sessionTime = 5;
-
-   // at a rate of 300 kbit/s
-   engp->bitsPerSecond = 300000;
-
-   // Call the client support function RecalculatePPSSZ() to set the
-   // packet size and packet rate values to something that fits our
-   // selected bitrate
-   RecalculatePPSSZ(engp);
-
-   if ((StartClientContext(engp) != 0) {
-     printf("StartClientContext() failed\n");
-     exit(1);
-   }
-
-   // Do the actual test
-   while (engp->state != CLSM_COMPLETE && engp->state != CLSM_FAILED) {
-     RunClientContext(engp);
-   }
-
-   // Report the results
-
-   printf("%d bytes sent, %d bytes received\n",
-	engp->stats.BytesSent, engp->BytesRecvd);
-   printf("%d packets sent, %d packets received\n",
-	engp->stats.PktsSent, engp->stats.PktsRecvd);
-
-   // Calculate the send time, in milliseconds
-   msSend = (engp->stats.StopSend.tv_sec - engp->stats.StartSend.tv_sec) * 1000;
-   msSend += ((engp->stats.StopSend.tv_usec - engp->stats.StartSend.tv_usec) / 1000);
-   printf("Send time: %d ms      Send rate: %d bit/s", msSend,
-	(engp->stats.BytesSent * 8 * 1000) / msSend);
-
-   // Calculate the receive time, in milliseconds
-   msRecv = (engp->stats.StopRecv.tv_sec - engp->stats.StartRecv.tv_sec) * 1000;
-   msRecv += ((engp->stats.StopRecv.tv_usec - engp->stats.StartRecv.tv_usec) / 1000);
-   printf("Receive time: %d ms      Receive rate (throughput speed): %d bit/s", msRecv,
-	(engp->stats.BytesRecvd * 8 * 1000) / msRecv);
-
-   // Note that the receive time is always the value used for calculating 
-   // network throughput, in send as well as receive tests. The receive time tells 
-   // you when packet #1 arrived at its destination (engp->stats.StartRecv) and
-   // when the last packet arrived (engp->stats.StopRecv). The difference is the 
-   // time the whole transfer took and that can be used to calculate the bandwidth.
-
-   // Clean up
-   DeleteContext(engp);
-
-   exit(0);
- }
-
-
-Compile and link with tpengine.o, tpclient.o and your choice of tpio_xxx.o
-
-
-
-  /Ragnar Lonn <prl@gatorhole.se> 2002-09-29
-
-
-
-
------------------
-
-
-
-
-
-
-TPTEST 2.01 differs from 2.0 mainly in the fact that a TCP test has 
-been introduced. The protocol has been somewhat extended to allow for
-the TCP tests but 2.0 and 2.01 are compatible (except that a test
-involving either a 2.0 client or server will not be able to perform
-a TCP test of course, only UDP).
-
-The protocol now looks like this:
-
-   TEST Vmajor,Vminor,Testtype,UDPport,PPS,Packetsize,Packets,Time,TCPBytes
-
-   Vmajor = version number, major (1)
-   Vminor = version number, minor (0)
-   Testtype = 0 (full duplex), 1 (send only) or 2 (receive only)
-		6 (TCP send) and 8 (TCP receive)
-   UDPport = client UDP port number
-   PPS = Requested no of packets per second
-   Packetsize = Requested packet size (bytes)
-   Paket = No of packets to be sent (time * PPS)
-   Time = time (in seconds) the test is to be run
-   TCPBytes = the number of bytes to transfer in a TCP test
-
-First of all, Testtype includes a couple of new test modes, namely no 6
-and 8 (there are other modes also like server mode and some auto-test
-modes the client uses but they are, as of now, internal to the servers 
-and clients. See the source code and especially tptest.h for more details).
-
-Second, there is an extra value added to the end of the TEST string -
-TCPBytes. This is the number of bytes to transfer in a TCP send or receive
-test. It is 0 (zero) for other tests. Note that a 2.0 server will accept
-the whole TEST line and just ignore the last value. It will, however,
-complain about invalid test mode if you try to do a TCP send or receive
-test. A 2.01 server being contacted by a 2.0 client on the other hand,
-will look for 9 values following the TEST command and when it doesn't
-see 9 values it will scan just 8.
-
-A slightly kludgy addition to the protocol, but one which I found no
-way of avoiding without spending even more unpaid hours on the program,
-was to add a "COOKIE" reply from client to server when a TCP Receive
-test was initiated. An example:
-
-1. The client connects to the server
-2. The server says "200 Welcome"
-3. The client says "TEST 2,1,8,3456,0,0,0,10,200000"
-
-(to do a TCP Receive test with a timeout of 10 seconds)
-
-4. The server says "210 7654 7655 0xf466c204"
-
-(210 = OK response code, 7654/7655 = UDP ports (not used), 0xf466c204 = cookie)
-
-5. The client repeats the cookie to the server using the "COOKIE" command:
-   The client says "COOKIE 0xf466c204"
-
-6. The server starts sending data on the TCP connection
-
-The UDP receive and full duplex tests handle this by including the cookie
-value in the NATOPEN packets sent by the client to the server to open any 
-NAT gateways that may exist between the client and the server. In the TCP
-tests there is no need to open any NATs so we have to get the cookie to
-the server somehow. A better way might have been to have the server send
-a cookie to any client that connects - include it in the welcome message -
-and let the client repeat the cookie when requesting a service. Well, maybe
-in some later version.
-
-Other things:
-
-- Cleaned up the Makefile a little and made it easier to follow (I hope)
-
-
-  / Ragnar Lonn <prl@gatorhole.se> 2002-01-13
-
-
-
-
------------------
-
-
-
-
-TPTEST 2.0 differs from TPTEST 1.0 in a few ways, which are
-described below.
-
-- TPTEST 2.0 implements a feature that opens NAT gateways/firewalls
-  for testing of incoming aswell as outgoing bandwidth. 
-
-- TPTEST 2.0 also implements a Cookie feature to enhance security.
-
-- This text file is only available in english as of now. It is too
-  much work having to write everything down in more than one language
-  and the people reading this are extremely likely to be used to
-  reading technical documentation in english anyhow.
-
-
-
-Changes to the client-server protocol
--------------------------------------
-
-The text-based command protocol used between test client and server
-now works like this (the reader is expected to be familiar with TCP-
-based Internet application protocols like e.g. SMTP, NNTP) :
-
-1. The client connects to a test server on a TCP port (default: 1632)
-
-
-2. The server says "200 <welcome message>" to signal its status as
-   available for testing.
-
-   If the server is not available it can respond "4xx <message>" 
-   (come back later) or "5xx <message>" (don't come back at all)
-
-
-3. The client requests a test session by using the TEST command:
-
-   TEST Vmajor,Vminor,Testtype,UDPport,PPS,Packetsize,Packets,Time
-
-   Vmajor = version number, major (1)
-   Vminor = version number, minor (0)
-   Testtype = 0 (full duplex), 1 (send only) or 2 (receive only)
-   UDPport = client UDP port number
-   PPS = Requested no of packets per second
-   Packetsize = Requested packet size (bytes)
-   Paket = No of packets to be sent (time * PPS)
-   Time = time (in seconds) the test is to be run
-
-   (Note that the syntax here is identical to the one used in TPTEST 1.0)
-
-
-4. If all is OK, the server responds with:
-
-   210 ServerUDPReceivePort ServerUDPSendPort 0xCookie 
-
-   ServerUDPReceivePort = The local port the server is expecting test packets on
-   ServerUDPSendPort = The local port the server will use to send outgoing packets
-   Cookie = A magic cookie the client has to include in all UDP packets it sends
-
-   The client then knows what UDP port the server expects packet to arrive at and 
-   also what UDP port the server will be using when sending its outgoing packets.
-   The Cookie value is a random number created by the server that the client has
-   to include in all UDP packets it sends to the server or the server will just
-   ignore the packets as they arrive.
-
-   A typical server response might look like this:
-
-   210 3458 3459 0xbc568a3e
-
-   This means that the server is using UDP port 3458 as the receive port for
-   incoming (to the server) UDP packets, it is using UDP port 3459 when sending
-   outgoing UDP packets, and it requires the client to include the value
-   bc568a3e in the "Cookie" header field of all its outgoing UDP packets
-   during the test.
-
-5. The test starts, if it is a SEND test. The client then starts sending
-   UDP packets to the server.
-
-   ...or...
-
-5b.If the test is a "receive test" or a "full duplex test", which means that
-   the server has to send packets to the client, the server will not send any
-   packets to the client until the client has first sent the server an UDP
-   packet containing the right cookie value. The client uses this opportunity
-   to send its "NATOPEN" packets which are fairly short (60 bytes) packets
-   sent from the client's UDP *RECEIVE* port to the server's UDP *SEND* port.
-
-   This is why the client needs to know the port the server will be using to
-   send its packets. The client will send several packets until it receives
-   a packet back from the server. When that happens, the client will enter
-   the real test mode and start counting packets received and reception
-   times. The server will always "ack" a NATOPEN packet, even when it is
-   performing the actal test. An ACK packet that gets lost in transit means 
-   the server might fire away the test but the client will then treat the 
-   first received test packet as the ACK and so count one packet less during
-   the test. If it doesn't get an ACK or a test packet back, the client will
-   resend the NATOPEN packet a few times before giving up.
-
-6. The server ACKs the NATOPEN packet (it just returns it on the same ports)
-
-7. The server starts the test in case of a RECEIVE test or the client starts
-   the test in case of a FULL DUPLEX test.
-
-8. Statistics are exchanged between client and server using the STATS
-   command on the control channel.
-
-
-The STATS line is exactly the same as the one in TPTEST 1.0
-
-Why not release a 1.1 version instead of 2.0?  Well, feature- and 
-functionality-wise 1.1 seems more right but this version is *incompatible*
-with version 1.0 due to the unavoidable changes to the client-server
-protocol. It seemed more right to use the minor version number for 
-feature changes that didn't affect compatibility and the major version
-number for changes that did.
-
-
-  /prl@gatorhole.se 2001-10-23
-
-
--------
-
-
-
-
-
-
-TPTEST 1.0
-
-New control protocol between client and server
-----------------------------------------------
-
-   The data structures that were sent on the control channel between
-   client and server have been replaced by a text-based command
-   protocol that works like this:
-
-   (This text requires some knowledge of text-based Internet
-    application protocols in order to be completely understandable)
-
-   The client connects to the test server on the control (TCP) channel.
-
-   The test server says "200 welcome" if it accepts any clients.
-   Otherwise it says "4xx try again later" or "5xx go away"
-
-   After a 200-response the client says:
-   
-   TEST Vmajor,Vminor,Testtype,UDPport,PPS,Packetsize,Packets,Time
-
-   Vmajor = version number, major (1)
-   Vminor = version number, minor (0)
-   Testtype = 0 (full duplex), 1 (send only) or 2 (receive only)
-   UDPport = client UDP port number
-   PPS = Requested no of packets per second
-   Packetsize = Requested packet size (bytes)
-   Paket = No of packets to be sent (time * PPS)
-   Time = time (in seconds) the test is to be run
-
-   The server responds with "200 ServerUDPport" if all is OK. The client
-   then knows what UDP port the server is expecting packets to arrive at.
-
-   If something's wrong the server says "5xx error message" or if it is
-   a temporary problem "4xx error message".
-
-   After completed test the test results are sent using a STATS
-   command on the control channel. In the case of a send-only or a
-   full duplex test the client will be the one to initiate the 
-   statistics-exchange but in the case of a receive-only test it is
-   the server that first sends a STATS line. The STATS line looks
-   like this:
-
-   STATS Vmajor,Vminor,PS,PU,PR,TXB,RXB,MaxRTT,MinRTT,
-         TX1s:TX1us,TX2s:TX2us,RX1s:RX1us,RX2s:RX2us
-
-   (everything on a single line)
-
-   PS = No of packets sent
-   PU = No of packets unsent
-   PR = No of packets received
-   TXB = No of bytes sent (64-bit integer)
-   RXB = No of bytes received (64-bit integer)
-   MaxRTT = Max roundtrip time (full duplex test)
-   MinRTT = Min roundtrip time (full duplex test)
-   TX1s:TX1us = Time in seconds and microseconds when transmission started
-   TX2s:TX2us = Time in seconds and microseconds when transmission ended
-   RX1s:RX1us = Time in seconds and microseconds when reception started
-   RX2s:RX2us = Time in seconds and microseconds when reception ended
-
-   Note that The time values (TX1s:TX1us and the others) have two components 
-   each - two 32-bit integers that together comprise a "timeval" value with
-   seconds since 1970 and microseconds since last second. In textform they
-   can look like this:
-
-   1014336000:578459,1014336005:579388 (TX1s:TX1us,TX2s:TX2us of a test
-   that lasted 5 seconds)
-
-
-The server program has got overload protection
--------------------------------------------------
-
-   In tptest.h there is a DENYFILE definition which is defined, by default,
-   as "/tmp/tptest.deny". If this file exists, tptest will refuse new client
-   connections. Connecting clients will receive a "4xx" answer when they try
-   to connect.
-
-   Read further down also, about the server config file.
-
-
-
-The server program has got a config file
--------------------------------------------
-
-   Using the -f flag it is possible to tell the server to read a config file. 
-   The config file contains max values for various test parameters - it tells
-   the server what types of test values to accept. It is possible to limit
-   bitrate per client, packet size, packet rate and test time and also the
-   number of simultaneous clients the server will accept. Finally, it is
-   possible to deny service to certain IP-numbers or ranges of IP-numbers
-   using regular expressions. Look at the supplied sample tptest.conf file
-   for more info on how to do all this.
-
-   Starting the server with the command line:
-
-        tptest -m s -f ./tptest.conf
-
-   Will make it read the config file on startup. If you have made changes in 
-   the file and want tptest to reload its config you can send it a kill -HUP 
-   signal and it will do a config reload.
-
-
-
-The windows client and the master server
-----------------------------------------
-
-   A TPTEST client for Windows (Win32) has been written and in connection
-   with this we have also invented a master server function that keeps track
-   of available test servers. This is to make it easier for testers to find
-   test servers they can use and also to make it easier to reach users with
-   info about new versions of the client program.
-
-   A protocol for communication between master server and client has been
-   created and it works as follows:
-
-   The client connects to the master server (usually on port 1632).
-
-   The client says:
-
-   HELO Vmajor,Vminor
-
-   Whereupon the master server responds with something like:
-
-   250-bleak.pdc.kth.se TCP 1632 "100Mbps, KTH, Stockholm, Sverige"
-   250-croclist.gatorhole.com
-   250 
-
-   The 250 code means that all is OK and that the master server is sending
-   a list of the known test servers in existence. If there is a minus sign
-   directly after "250" it means that the current line is not the last line
-   but will be followed by more lines. After "250" and possibly a minus
-   sign follows the hostname of the test server. If there is nothing after
-   that the client will assume that the test server will accept connections
-   on TCP port 1632 which is default. If there is anything within quotation
-   marks "" it is interpreted as a short description of the test server.
-   The client may show this description to the user to help the user 
-   select a test server. 
-
-   If the client has an old version of the client software, the master server
-   may answer:
-
-   501 You need to upgrade. 
-
-   The client can also request contact information from the master server
-   using the INFO command. The syntax is:
-   
-   The client says:
-
-   INFO
-
-   And the master server replies, for instance:
-
-   250-The Swedish ICT-commission network throughput test program
-   250-Email: bandbreddstest@itkommissionen.se
-   250-WWW: http://www.itkommissionen.se/
-   250
-
-   The reply, then, is a number of lines of text with contact information
-   for those who want to know more or upgrade their client, etc.
-   
-
-   The master server:
-
-   The current master server program is very simple. It only knows the
-   INFO and HELO commands and when it gets a HELO command it just burps
-   up the contents of a certain file to the connected client, line by
-   line.
-
-   By default, this file is "/etc/tptest.servers" but that can easily
-   be changed in tptestmaster.c by changing the DATAFILE definition
-   or by supplying the filename as the only commandline argument when
-   starting tptestmaster:
-
-     ./tptestmaster /etc/tptest.servers
-
-   Tptestmaster also checks for a DENYFILE which is, by default,
-   "/tmp/tptestmaster.deny" and if it exists it means that tptestmaster
-   refuses new connections.
-
-   Note that tptestmaster and the tptest servers normally use the same
-   TCP port (1632) by default. This means that if you want to run both
-   a master server and a test server on the same machine you have to use
-   another port for one of them (it's easiest to let the test server
-   use another port).
-
-
-
-   The Windows client:
-
-   The Windows client performs its tests in the same way the Unix client
-   does but it includes some extra features to make things easier to the
-   user, especially when starting a test. The Unix client does not, for
-   example, support the master server protocol.
-
-   The Windows client user may click directly on the big START button 
-   and by doing that immediately start a test without having to decide
-   what server to use, what packet size, data rate, etc. This auto-test
-   procedure works by the client first connecting to the master server
-   (the address of the default master server is compiled into the
-    client program), fetching a list of the available test servers and
-   then selecting the first server in the list that wants to be spoken
-   to using a protocol the client knows (Currently, the only protocol
-   available today is "TCP" but the client supports the use of 
-   different TCP ports at least). The client then makes several
-   5-second tests at first a really low speed and then increasing the
-   speed a little for each test until the test result stops improving.
-   When the test result (the throughput) doesn't get any better the
-   client assumes it has found the maximum throughput and stops the
-   test and displays the results to the user.
-
-   The user may also click on the "Select test speed" button and choose
-   a certain speed to be tested. If s/he does that the selected speed
-   will be the only speed tested.
-
-   If the user chooses to use the Advanced menu (Advanced mode) it has
-   options to set what test server to use and also to control in detail
-   the various parameters of the test, just like with the Unix client.
-
-
-Other changes
--------------
-
-   TPTEST 0.97 and earlier versions regarded 1 kbps as 1024 bits/second.
-   There is some confusion about this but we have concluded that when
-   talking about network bandwidth it is more common that 1000 bits
-   equals 1 kilobit so from version 1.0 all TPTEST software considers
-   1 kbps to be 1000 bits/s. 
-
-   When someone goes shopping for network bandwidth they often buy 
-   bandwidth at speeds that are multiples of 64 kbps and that means 
-   that a connection that is labeled "1 Mbps" can often be 1024 kbps
-   (16 x 64 kbps). TPTEST will in such a case correctly state the
-   speed as 1.024 Mbps or 1024 kbps.
-
-   A so-called T1-connection is 1536 kbps (24 x 64 kbps) and that is,
-   then, not exactly 1.5 Mbps which one might think but rather 1.54 Mbps.
-
-   1 kB = 1 kilobyte = 1024 bytes
-   64 kB = 64 kilobyte = 65536 bytes
-   1 MB = 1 megabyte = 1048576 bytes
-
-   1 kbit = 1 kilobit = 1000 bits
-   64 kbit = 64 kilobit = 64000 bits
-   1 Mbit = 1 megabit = 1000000 bits
-
diff --git a/tptest/src/tptestclient.man b/tptest/src/tptestclient.man
deleted file mode 100644
index 55e332d3782f3ab77e394089ca75f5887679b049..0000000000000000000000000000000000000000
--- a/tptest/src/tptestclient.man
+++ /dev/null
@@ -1,79 +0,0 @@
-Usage: tptestclient [options] <-m mode> <parameters> <address> <port>
-
-options: <> = required argument, [] = optional argument
-  -b <local address>        Bind to local address/interface
-  -n <repetitions>          Repeat test n number of times (0 = infinite)
-  -v <verbosity>            Set verbosity level
-  -s <verbosity>            Set syslog verbosity level
-  -e <email>                Set email for TPTEST/Statistik
-  -p <password>             Set password for TPTEST/Statistik
-  -d <delaytime>            Set delaytime between repeated tests
-  -S <sendbuf size>         Try to set size of socket send buffer
-  -R <recvbuf size>         Try to set size of socket receive buffer
-  -t                        No text output
-
-test modes & parameters:
-  udp-send | us             UDP send to server
-    parameters: <testtime> <bitrate>
-    parameters: <testtime> <packetsize> <packets/sec>
-  udp-receive | ur          UDP receive from server
-    parameters: <testtime> <bitrate>
-    parameters: <testtime> <packetsize> <packets/sec>
-  udp-fdx | uf              UDP full duplex
-    parameters: <testtime> <bitrate>
-    parameters: <testtime> <packetsize> <packets/sec>
-  tcp-send | ts             TCP send to server
-    parameters: <max testtime> <bytes to send>
-  tcp-receive | tr          TCP receive from server
-    parameters: <max testtime> <bytes to receive>
-  tcp-send-auto | tsa       TCP auto send to server
-  tcp-receive-auto | tra    TCP auto receive from server
-  tcp-auto | ta             TCP auto (auto send + auto receive)
-
-
-
-Examples:
-
-1. Starting an infinitely repeating TPTEST/Statistik session with user "joe" 
-   and pw "xyz" to server "server.some.domain" on control port 1650 :
-
-    ./tptestclient -n0 -e joe -p xyz -m tcp-auto server.some.domain 1650
-
-
-2. Starting a one-time, 5-second UDP-Send test with packet size 1100 bytes
-   and packet rate 200 packets per second :
-
-    ./tptestclient -m udp-send 5 1100 200 server.some.domain 1650
-
-
-3. Starting three consecutive automatic (meaning they figure out the
-   amount of data to send to get a good test result) TCP-Send tests,
-   sending output both to stdout and to syslog at the highest verbosity
-   level :
-
-    ./tptestclient -n3 -v2 -s2 -m tcp-send-auto server.some.domain 1650
-
-
-
-Tips:
-
-  - "tcp-send-auto" can be abbreviated to "tsa". All the various modes
-    have abbreviations for the weaker typists out there
-
-  - For TPTEST/Statistik usage, the program will while running remember 
-    the last throughput rates up- and downstream and when starting a new
-    test, it will on the first try use what it thinks is the appropriate 
-    amount of data to make the test run in approximately 20 seconds. This 
-    usually reduces the number of "sub-tests" performed in order to get 
-    a good result.
-
-    This means that running the program in stand-alone mode with infinite
-    repetition, or perhaps starting it once every hour or so through cron, 
-    and supplying it with a "-n10" option, will result in more test
-    results per hour and less load on the test servers.
-
-  - For standard TPTEST 3 usage, you can use e.g. "-d 60" along with 
-    "-n0" to cause the program to loop infinitely, performing tests but
-    waiting 60 seconds between each consecutive test.
-
-  - Socket send and receive buffers 
diff --git a/wifimngr/Makefile b/wifimngr/Makefile
index a0af6fbc7acc36840c36b5247e297a20152d748d..07e1f60ff997021df3976d21b383fab9b60e6786 100644
--- a/wifimngr/Makefile
+++ b/wifimngr/Makefile
@@ -8,29 +8,35 @@ include $(INCLUDE_DIR)/kernel.mk
 PKG_NAME:=wifimngr
 PKG_VERSION:=1.0.0
 PKG_RELEASE:=1
-PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+
+PKG_SOURCE_VERSION:=c8d30103f49af2db81691385dc44316a2207ada1
+PKG_SOURCE_PROTO:=git
+ifeq ($(CONFIG_BCM_OPEN),y)
+PKG_SOURCE_URL:=http://public.inteno.se/wifimngr
+else
+PKG_SOURCE_URL:=git@public.inteno.se:wifimngr
+endif
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
 
 LDFLAGS+= \
-        -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
-		-Wl,-rpath-link=$(STAGING_DIR)/lib
+	-Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
+	-Wl,-rpath-link=$(STAGING_DIR)/lib
 
 define Package/wifimngr
-  CATEGORY:=Network
-  DEPENDS:=+libpthread +libstdcpp +librt +libjson +alljoyn +ubus +libuci
-  TITLE:=WiFi Manager
+	CATEGORY:=Network
+	DEPENDS:=+libpthread +libstdcpp +librt +libjson alljoyn +ubus +libuci
+	TITLE:=WiFi Manager
 endef
 
 define Package/wifimngr/description
 	wifimngr manages wireless driver
 endef
 
-define Build/Prepare
-	mkdir -p $(PKG_BUILD_DIR)
-	$(CP) ./src/* $(PKG_BUILD_DIR)/
-endef
-
 define Package/wifimngr/install
 	$(INSTALL_DIR) $(1)/sbin
 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/wifimngr $(1)/sbin/
diff --git a/wifimngr/src/Makefile b/wifimngr/src/Makefile
deleted file mode 100644
index 952ea65098ce6eeac64139032fc9f82561d21837..0000000000000000000000000000000000000000
--- a/wifimngr/src/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-CC		= g++
-CXXFLAGS	= -Wall -pipe -std=c++98 -fno-rtti -fno-exceptions -Wno-long-long -Wno-deprecated -g -DQCC_OS_LINUX -DQCC_OS_GROUP_POSIX -DQCC_CPU_X86
-LIBS		= -lalljoyn -lstdc++ -lcrypto -lpthread -lrt -luci -lubus -lubox -lblobmsg_json -ljson-c
-OBJS		= wifimngr.o tools.o ubus.o jsp.o
-SRCS		= wifimngr.cc tools.cc ubus.c jsp.c
-LIBSRCS		= 
-ISRCS		= wifi.h common.h
-
-all: wifimngr
-
-wifimngr: ${OBJS}
-	${CC} ${LDFLAGS} ${LIBSRCS} -o wifimngr ${OBJS} ${LIBS}
-
-clean:
-	rm -f wifimngr *.o
-
diff --git a/wifimngr/src/common.h b/wifimngr/src/common.h
deleted file mode 100644
index 9ebe8b0fffd43617eecf1d12ba8b336720863f28..0000000000000000000000000000000000000000
--- a/wifimngr/src/common.h
+++ /dev/null
@@ -1,14 +0,0 @@
-typedef struct {
-	int conntype;
-	char hostname[128];
-	char macaddr[24];
-	char wdev[8];
-} Client;
-
-void ubus_listener();
-void wps_event(const char *key, const char *val);
-void removeNewline(char *buf);
-const char *chrCmd(const char *pFmt, ...);
-
-const char *json_parse_and_get(const char *str, char *var);
-void json_parse_clients(Client *clnt);
diff --git a/wifimngr/src/jsp.c b/wifimngr/src/jsp.c
deleted file mode 100644
index 795a722bc511a23415fe343fd509e3b9baf737e5..0000000000000000000000000000000000000000
--- a/wifimngr/src/jsp.c
+++ /dev/null
@@ -1,139 +0,0 @@
-#include <string.h>
-#include <stdio.h>
-
-#include <json-c/json.h>
-
-#include "common.h"
-
-const char*
-json_parse_and_get(const char *str, char *var)
-{
-	json_object *obj;
-	char result[128];
-	
-	obj = json_tokener_parse(str);
-	if (is_error(obj) || json_object_get_type(obj) != json_type_object) {
-		return NULL;
-	}
-
-	json_object_object_foreach(obj, key, val) {
-		if(!strcmp(key, var)) {
-			switch (json_object_get_type(val)) {
-			case json_type_object:
-				break;
-			case json_type_array:
-				break;
-			case json_type_string:
-				sprintf(result, "%s", json_object_get_string(val));
-				break;
-			case json_type_boolean:
-				sprintf(result, "%d", json_object_get_boolean(val));
-				break;
-			case json_type_int:
-				sprintf(result, "%d", json_object_get_int(val));
-				break;
-			default:
-				break;
-			}
-		}
-	}
-	json_object_put(obj);
-
-	if (strlen(result))
-		return strdup(result);
-	else
-		return NULL;
-}
-
-static Client clients[128];
-static int cno;
-
-static int add_json_element(const char *key, json_object *obj);
-static int add_json_client_element(const char *key, json_object *obj);
-
-static int add_json_object(json_object *obj)
-{
-	int ret = 0;
-
-	json_object_object_foreach(obj, key, val) {
-		if (strstr(key, "client-")) {
-			cno++;
-			ret = add_json_element(key, val);
-		} else if (!strcmp(key, "wireless") || !strcmp(key, "wdev") || !strcmp(key, "hostname") || !strcmp(key, "macaddr") || !strcmp(key, "connected")) {
-			ret = add_json_client_element(key, val);
-		}
-		if (ret)
-			break;
-	}
-
-	return ret;
-}
-
-static int add_json_client_element(const char *key, json_object *obj)
-{
-	char *type;
-
-	if (!obj)
-		return -1;
-
-	if (!strcmp(key, "hostname")) {
-		strcpy(clients[cno].hostname, json_object_get_string(obj));
-	} else if (!strcmp(key, "macaddr")) {
-		strcpy(clients[cno].macaddr, json_object_get_string(obj));
-	} else if (!strcmp(key, "connected")) {
-		clients[cno].conntype = json_object_get_boolean(obj);
-	} else if (!strcmp(key, "wireless")) {
-		if (json_object_get_boolean(obj))
-			clients[cno].conntype = 2;
-	} else if (!strcmp(key, "wdev")) {
-		strcpy(clients[cno].wdev, json_object_get_string(obj));
-	}
-
-	return 0;
-}
-
-static int add_json_element(const char *key, json_object *obj)
-{
-	char *type;
-
-	if (!obj)
-		return -1;
-
-	switch (json_object_get_type(obj)) {
-	case json_type_object:
-		add_json_object(obj);
-		break;
-	default:
-		return -1;
-	}
-
-	return 0;
-}
-
-void
-json_parse_clients(Client *clnt)
-{
-	json_object *obj;
-	FILE *in;
-	char clist[50000];
-
-	cno = -1;
-	memset(clients, '\0', sizeof(clients));
-
-	if ((in = popen("ubus -S call router clients", "r")))
-		fgets(clist, sizeof(clist), in);
-	pclose(in);
-
-	if(strlen(clist) < 64)
-		return;
-
-	obj = json_tokener_parse(clist);
-	if (is_error(obj) || json_object_get_type(obj) != json_type_object) {
-		fprintf(stderr, "Failed to parse message data\n");
-		return;
-	}
-	add_json_object(obj);
-	json_object_put(obj);
-
-	memcpy(clnt, clients, sizeof(clients));
-}
diff --git a/wifimngr/src/tools.cc b/wifimngr/src/tools.cc
deleted file mode 100644
index b5a93cb6ec525dcc071212593231687167cf9369..0000000000000000000000000000000000000000
--- a/wifimngr/src/tools.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-extern "C"
-{
-	#include <string.h>
-	#include <stdarg.h>
-	#include <stdlib.h>
-
-	#include "common.h"
-}
-
-#include "wifi.h"
-
-#include <iostream>
-#include <fstream>
-#include <iterator>
-#include <sstream>
-
-extern "C"
-{
-	void
-	removeNewline(char *buf)
-	{
-		int len;
-		len = strlen(buf) - 1;
-		if (buf[len] == '\n')
-			buf[len] = 0;
-	}
-
-	void
-	dotToUnderscore(char *buf)
-	{
-		int i = 0;
-
-		while (buf[i]) {
-			if (buf[i] == '.')
-				buf[i] = '_';
-			i++;
-		}
-		buf[i] = '\0';
-	}
-}
-
-void
-runCmd(const char *pFmt, ...)
-{
-	va_list ap;
-	char cmd[256] = {0};
-	int len=0, maxLen;
-
-	maxLen = sizeof(cmd);
-
-	va_start(ap, pFmt);
-
-	if (len < maxLen)
-	{
-		maxLen -= len;
-		vsnprintf(&cmd[len], maxLen, pFmt, ap);
-	}
-
-	system(cmd);
-
-	va_end(ap);
-}
-
-const char*
-chrCmd(const char *pFmt, ...)
-{
-	va_list ap;
-	char cmd[256] = {0};
-	int len=0, maxLen;
-
-	maxLen = sizeof(cmd);
-
-	va_start(ap, pFmt);
-
-	if (len < maxLen)
-	{
-		maxLen -= len;
-		vsnprintf(&cmd[len], maxLen, pFmt, ap);
-	}
-
-	va_end(ap);
-
-	FILE *pipe;
-	char buffer[128];
-	if ((pipe = popen(cmd, "r")))
-		fgets(buffer, sizeof(buffer), pipe);
-	pclose(pipe);
-
-	if (strlen(buffer))
-		return strdup(buffer);
-	else
-		return NULL;
-}
-
-string
-strCmd(const char *pFmt, ...)
-{
-	va_list ap;
-	char cmd[256] = {0};
-	int len=0, maxLen;
-
-	maxLen = sizeof(cmd);
-
-	va_start(ap, pFmt);
-
-	if (len < maxLen)
-	{
-		maxLen -= len;
-		vsnprintf(&cmd[len], maxLen, pFmt, ap);
-	}
-
-	va_end(ap);
-
-	FILE* pipe = popen(cmd, "r");
-	string result = "";
-	char buffer[128];
-	if (pipe) {
-		while(!feof(pipe)) {
-			if(fgets(buffer, 128, pipe) != NULL)
-				result += buffer;
-		}
-	}
-	pclose(pipe);
-	result.erase(result.find_last_not_of("\n")+1);
-	return result;
-}
-
-string
-readFile(char *path)
-{
-	ifstream file(path);
-	string str((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
-	return str;
-}
-
-string
-toStr(int num)
-{
-	ostringstream result;
-	result << num;
-	return result.str();
-}
-
-static struct uci_context *uci_ctx;
-static struct uci_ptr ptr;
-
-struct uci_package *
-init_package(const char *config)
-{
-	struct uci_context *ctx = uci_ctx;
-	struct uci_package *p = NULL;
-
-	if (!ctx) {
-		ctx = uci_alloc_context();
-		uci_ctx = ctx;
-	} else {
-		p = uci_lookup_package(ctx, config);
-		if (p)
-			uci_unload(ctx, p);
-	}
-
-	if (uci_load(ctx, config, &p))
-		return NULL;
-
-	return p;
-}
-
-static inline int
-uciGetPtr(const char *p, const char *s, const char *o, const char *t)
-{
-	memset(&ptr, 0, sizeof(ptr));
-	ptr.package = p;
-	ptr.section = s;
-	ptr.option = o;
-	ptr.value = t;
-	return uci_lookup_ptr(uci_ctx, &ptr, NULL, true);
-}
-
-const char*
-uciGet(const char *p, const char *s, const char *o)
-{
-	const char *value = NULL;
-
-	if(uciGetPtr(p, s, o, NULL))
-		return NULL;
-
-	if(ptr.o->type == UCI_TYPE_STRING)
-		value = ptr.o->v.string;
-
-	return value;
-}
-
-void
-uciSet(const char *p, const char *s, const char *o, const char *t)
-{
-	uciGetPtr(p, s, o, (t)?(t):(""));
-	uci_set(uci_ctx, &ptr);
-}
-
-void
-uciCommit(const char *p)
-{
-	if(uciGetPtr(p, NULL, NULL, NULL))
-		return;
-	uci_commit(uci_ctx, &ptr.p, false);
-}
-
-const char *
-ugets(struct uci_section *s, const char *opt)
-{
-	const char *value = NULL;
-	value = uci_lookup_option_string(uci_ctx, s, opt);
-	return value;
-}
-
-int
-ugeti(struct uci_section *s, const char *opt)
-{
-	const char *value = NULL;
-	int ret = 0;
-	if ((value = uci_lookup_option_string(uci_ctx, s, opt))) ret = atoi(value);
-	return ret;
-}
-
-void
-uset(struct uci_section *s, const char *opt, const char *value)
-{
-	int found = string(s->package->path).find_last_of('/');
-	const char *path = string(s->package->path).substr(found+1).c_str();
-	uciGetPtr(path, s->e.name, opt, (value)?(value):(""));
-	uci_set(uci_ctx, &ptr);
-}
-
-void
-ucommit(struct uci_section *s)
-{
-	int found = string(s->package->path).find_last_of('/');
-	const char *path = string(s->package->path).substr(found+1).c_str();
-	if(uciGetPtr(path, NULL, NULL, NULL))
-		return;
-	uci_commit(uci_ctx, &ptr.p, false);
-}
-
diff --git a/wifimngr/src/ubus.c b/wifimngr/src/ubus.c
deleted file mode 100644
index d9cc73d3892b369b0dc2c2747f3b0e55f41952ce..0000000000000000000000000000000000000000
--- a/wifimngr/src/ubus.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <unistd.h>
-
-#include <libubox/blobmsg.h>
-#include <libubox/blobmsg_json.h>
-#include <libubox/uloop.h>
-#include <libubus.h>
-
-#include "common.h"
-
-static struct ubus_context *ctx;
-static struct ubus_event_handler event_listener;
-static struct blob_buf b;
-
-static void
-receive_event(struct ubus_context *ctx, struct ubus_event_handler *ev, const char *type, struct blob_attr *msg)
-{
-	char *str;
-	const char *sta;
-
-	str = blobmsg_format_json(msg, true);
-
-	if(!strcmp(type, "wps")) {
-		if(sta = json_parse_and_get(str, "status"))
-			wps_event("status", sta);
-		else if (sta = json_parse_and_get(str, "sta"))
-			wps_event("sta", sta);
-	}
-
-	free(str);
-}
-
-void
-ubus_listener()
-{
-	const char *ubus_socket = NULL;
-	int ret;
-
-	uloop_init();
-
-	ctx = ubus_connect(ubus_socket);
-	if (!ctx) {
-		fprintf(stderr, "Failed to connect to ubus\n");
-		return;
-	}
-
-	ubus_add_uloop(ctx);
-
-	event_listener.cb = receive_event;
-	ret = ubus_register_event_handler(ctx, &event_listener, "wps");
-	if (ret)
-		fprintf(stderr, "Couldn't register to router events\n");
-
-	uloop_run();
-
-	ubus_free(ctx);
-	uloop_done();
-}
diff --git a/wifimngr/src/wifi.h b/wifimngr/src/wifi.h
deleted file mode 100644
index 8b1ae2333425094fba5bfd2b0fbdb652c50f4cd2..0000000000000000000000000000000000000000
--- a/wifimngr/src/wifi.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef WIFI_H
-#define WIFI_H
-
-#include <iostream>
-#include <string>
-using namespace std;
-
-//class Wireless {
-//	public:
-//	string ssid, encryption, key;
-//	string radio2g, radio5g;
-//	int enable, channel2g, channel5g;
-//	string getChannels (int);
-//	void setChannel (int,int);
-//	void setSsid (string);
-//	void setKey (string);
-//};
-
-//class WirelessRadio {
-//	public:
-//	string name, country, hwmode;
-//	char band;
-//	int bwCap, channel, autoChanTimer, dfsChanSelect, obssCoex, txPower, rxChainPwrSave;
-//	int frameBursting, fragThresh, rtsThresh, dtimInterval, bcnInterval, wmmMode;
-//	void setChannel (int);
-//};
-
-//class WirelessInterface {
-//	public:
-//	string ifname;
-//	string radio, mode, ssid, encryption, cipher, key;
-//	int enable, gtkRekeyIntv, enableWps, macFilterMode;
-//	int hidden, maxAssoc, isolate, enableWmf; 
-//	void setFilterList (string);
-//	string getMacFilterList (void);
-//};
-
-//class WPS {
-//	public:
-//	int enable;
-//	void activate (int);
-//	void changeStatus ();
-//};
-
-#endif
-
-#define	MAX_WDEV 2
-#define	MAX_WIFC 2
-
-#include <uci.h>
-struct uci_package *init_package(const char *config);
-const char * ugets(struct uci_section *s, const char *opt);
-int ugeti(struct uci_section *s, const char *opt);
-void uset(struct uci_section *s, const char *opt, const char *value);
-void ucommit(struct uci_section *s);
-const char* uciGet(const char *p, const char *s, const char *o);
-void uciSet(const char *p, const char *s, const char *o, const char *t);
-void uciCommit(const char *p);
-void runCmd(const char *pFmt, ...);
-string strCmd(const char *pFmt, ...);
-string toStr(int num);
-//void populateWireless(void);
diff --git a/wifimngr/src/wifimngr.cc b/wifimngr/src/wifimngr.cc
deleted file mode 100644
index b531fe8eee2aee9d1503a6f68a19ab3ee15ee952..0000000000000000000000000000000000000000
--- a/wifimngr/src/wifimngr.cc
+++ /dev/null
@@ -1,755 +0,0 @@
-#include <qcc/Debug.h>
-#include <qcc/Log.h>
-#include <qcc/Mutex.h>
-#include <qcc/String.h>
-#include <qcc/StringUtil.h>
-
-#include <alljoyn/BusAttachment.h>
-#include <alljoyn/BusListener.h>
-#include <alljoyn/BusObject.h>
-#include <alljoyn/AboutObj.h>
-#include <alljoyn/AboutIconObj.h>
-
-#include <signal.h>
-#include <stdio.h>
-
-#include "wifi.h"
-
-extern "C" {
-	#include "common.h"
-}
-
-#define ArraySize(a)  (sizeof(a) / sizeof(a[0]))
-
-using namespace qcc;
-using namespace ajn;
-
-static struct uci_package *uci_wireless;
-
-static const char* wirelessInterfaceXML =
-	"<node>"
-		"<interface name='org.allseen.WiFi'>"
-			"<property name='Version' type='i' access='read'/>"
-			"<property name='Enable' type='i' access='readwrite'/>"
-			"<property name='Ssid' type='s' access='readwrite'/>"
-			"<property name='Key' type='s' access='readwrite'/>"
-			"<property name='EnableWps' type='i' access='readwrite'/>"
-			"<property name='Channel2g' type='i' access='readwrite'/>"
-			"<property name='Channel5g' type='i' access='readwrite'/>"
-			"<method name='ApplyChanges'>"
-			"</method>"
-			"<method name='CurrentChannel'>"
-				"<arg name='freq' type='i' direction='in'/>"
-				"<arg name='channel' type='i' direction='out'/>"
-			"</method>"
-			"<method name='GetChannels'>"
-				"<arg name='freq' type='i' direction='in'/>"
-				"<arg name='channels' type='ai' direction='out'/>"
-			"</method>"
-		"</interface>"
-		"<interface name='org.allseen.WPS'>"
-			"<property name='Version' type='i' access='read'/>"
-			"<method name='WpsPushButton'>"
-				"<arg name='active' type='i' direction='in'/>"
-			"</method>"
-			"<signal name='WpsResponse' sessionless='true'>"
-				"<arg name='respCode' type='i'/>"
-			"</signal>"
-		"</interface>"
-		"<interface name='org.allseen.Clients'>"
-			"<property name='Version' type='i' access='read'/>"
-			"<method name='GetClients'>"
-				"<arg name='clients' type='a(ssiii)' direction='out'/>"
-			"</method>"
-		"</interface>"
-	"</node>";
-
-static SessionPort ASSIGNED_SESSION_PORT = 900;
-
-class MySessionPortListener : public SessionPortListener {
-    bool AcceptSessionJoiner(ajn::SessionPort sessionPort, const char* joiner, const ajn::SessionOpts& opts)
-    {
-        if (sessionPort != ASSIGNED_SESSION_PORT) {
-            printf("Rejecting join attempt on unexpected session port %d\n", sessionPort);
-            return false;
-        }
-
-//        cout << "Accepting JoinSessionRequest from " << joiner << " (opts.proximity= " << opts.proximity
-//                << ", opts.traffic=" << opts.traffic << ", opts.transports=" << opts.transports << ")." << endl;
-        return true;
-    }
-    void SessionJoined(SessionPort sessionPort, SessionId id, const char* joiner)
-    {
-        printf("Session Joined SessionId = %u\n", id);
-    }
-};
-
-class WirelessBusObject : public BusObject {
-  public:
-    WirelessBusObject(BusAttachment& bus, const char* path);
-
-    QStatus Get(const char* ifcName, const char* propName, MsgArg& val);
-    QStatus Set(const char* ifcName, const char* propName, MsgArg& val);
-    QStatus SendWpsSignal(int respcode);
-
-    void ApplyChanges(const InterfaceDescription::Member* member, Message& msg);
-    void CurrentChannel(const InterfaceDescription::Member* member, Message& msg);
-    void GetChannels(const InterfaceDescription::Member* member, Message& msg);
-    void WpsPushButton(const InterfaceDescription::Member* member, Message& msg);
-    void GetClients(const InterfaceDescription::Member* member, Message& msg);
-
-    void setChannel(int freq);
-    void setSsid();
-    void setKey();
-    void changeWifiStatus(void);
-    void changeWpsStatus(void);
-    void wpsPushButton(int status);
-
-    String ssid, encryption, key, radio2g, radio5g;
-    int enableWifi, enableWps;
-    int channel2g, channel5g;
-    SessionId id;
-    bool stop;
-    Mutex lock;
-};
-
-WirelessBusObject::WirelessBusObject(BusAttachment& bus, const char* path):BusObject(path) {
-        const InterfaceDescription* wireless_iface = bus.GetInterface("org.allseen.WiFi");
-        if (wireless_iface == NULL) {
-            printf("The interfaceDescription pointer for org.allseen.WiFi was NULL when it should not have been.\n");
-            return;
-        }
-        AddInterface(*wireless_iface, ANNOUNCED);
-
-        const InterfaceDescription* wps_iface = bus.GetInterface("org.allseen.WPS");
-        if (wps_iface == NULL) {
-            printf("The interfaceDescription pointer for org.allseen.WPS was NULL when it should not have been.\n");
-            return;
-        }
-        AddInterface(*wps_iface, ANNOUNCED);
-
-        const InterfaceDescription* client_iface = bus.GetInterface("org.allseen.Clients");
-        if (client_iface == NULL) {
-            printf("The interfaceDescription pointer for org.allseen.Clients was NULL when it should not have been.\n");
-            return;
-        }
-        AddInterface(*client_iface, ANNOUNCED);
-
-        /* Register the method handlers with the object */
-        const MethodEntry methodEntries[] = {
-            { wireless_iface->GetMember("ApplyChanges"), static_cast<MessageReceiver::MethodHandler>(&WirelessBusObject::ApplyChanges) },
-	    { wireless_iface->GetMember("CurrentChannel"), static_cast<MessageReceiver::MethodHandler>(&WirelessBusObject::CurrentChannel) },
-            { wireless_iface->GetMember("GetChannels"), static_cast<MessageReceiver::MethodHandler>(&WirelessBusObject::GetChannels) },
-	    { wps_iface->GetMember("WpsPushButton"), static_cast<MessageReceiver::MethodHandler>(&WirelessBusObject::WpsPushButton) },
-	    { client_iface->GetMember("GetClients"), static_cast<MessageReceiver::MethodHandler>(&WirelessBusObject::GetClients) }
-        };
-        AddMethodHandlers(methodEntries, sizeof(methodEntries) / sizeof(methodEntries[0]));
-}
-
-void WirelessBusObject::ApplyChanges(const InterfaceDescription::Member* member, Message& msg) {
-        printf("ApplyChanges method called\n");
-
-	string vifs;
-	char vifsbuf[32];
-	char *token;
-
-	vifs = strCmd("nvram show | grep vifs | cut -d'=' -f2 | tr '\n' ' '");
-	snprintf(vifsbuf, 32, "%s", vifs.c_str());
-
-	token = strtok(vifsbuf, " ");
-	while (token != NULL)
-	{
-		runCmd("nvram set %s_ssid=%s", token, ssid.c_str());
-		runCmd("nvram set %s_wpa_psk=%s", token, key.c_str());
-		runCmd("wlctl -i %s ssid %s", token, ssid.c_str());
-		token = strtok (NULL, " ");
-	}
-
-	runCmd("killall -9 nas; nas");
-	runCmd("killall -SIGTERM wps_monitor; wps_monitor &");
-
-	QStatus status = MethodReply(msg, NULL, 1);
-        if (status != ER_OK) {
-            printf("Failed to create MethodReply for ApplyChanges.\n");
-        }
-}
-
-void WirelessBusObject::CurrentChannel(const InterfaceDescription::Member* member, Message& msg) {
-        printf("CurrentChannel method called: %d\n", msg->GetArg(0)->v_int32);
-	int freq = msg->GetArg(0)->v_int32;
-	String wl;
-	string channel;
-	int chn;
-
-	(freq == 5)?(wl = radio5g):(wl = radio2g);
-	//channel = strCmd("wlctl -i %s channel | grep current | awk '{print$NF}'", wl.c_str());
-	channel = strCmd("wlctl -i %s status | grep Primary | awk '{print$NF}'", wl.c_str());
-	chn = atoi(channel.c_str());
-
-	MsgArg arg[1];
-	arg[0].Set("i", chn);
-        QStatus status = MethodReply(msg, arg, 1);
-        if (status != ER_OK) {
-            printf("Failed to create MethodReply for CurrentChannel.\n");
-        }
-}
-
-void WirelessBusObject::GetChannels(const InterfaceDescription::Member* member, Message& msg) {
-        printf("GetChannels method called: %d\n", msg->GetArg(0)->v_int32);
-	int freq = msg->GetArg(0)->v_int32;
-	int *chn = new int[16];
-	String wl;
-	string channels;
-	char *token;
-	char chbuf[128];
-	int i = 0;
-
-	(freq == 5)?(wl = radio5g):(wl = radio2g);
-	channels = strCmd("wlctl -i %s channels", wl.c_str());
-	snprintf(chbuf, 128, "%s", channels.c_str());
-
-	token = strtok(chbuf, " ");
-	while (token != NULL)
-	{
-		chn[i] = atoi(token);
-		token = strtok (NULL, " ");
-		i++;
-	}
-
-	MsgArg arg[1];
-	arg[0].Set("ai", i, chn);
-        QStatus status = MethodReply(msg, arg, 1);
-        if (status != ER_OK) {
-            printf("Failed to create MethodReply for GetChannels.\n");
-        }
-
-	delete[] chn;
-}
-
-void WirelessBusObject::GetClients(const InterfaceDescription::Member* member, Message& msg) {
-	printf("GetClients method called\n");
-	Client clients[128];
-	MsgArg cln[128];
-	int freq, snr, noise, rssi;
-	int i = 0;
-
-	json_parse_clients(clients);
-	while(strlen(clients[i].macaddr) > 16) {
-		freq = 0;
-		snr = 0;
-		if (clients[i].conntype == 2) {
-			if (strcmp(clients[i].wdev, radio5g.c_str()) == 0)
-				freq = 5;
-			else if (strcmp(clients[i].wdev, radio2g.c_str()) == 0)
-				freq = 2;
-			noise = atoi(chrCmd("wlctl -i %s noise", clients[i].wdev));
-			rssi = atoi(chrCmd("wlctl -i %s rssi %s", clients[i].wdev, clients[i].macaddr));
-			snr = rssi - noise;
-		}
-		cln[i].Set("(ssiii)", clients[i].hostname, clients[i].macaddr, clients[i].conntype, freq, snr);
-		i++;
-	}
-
-	MsgArg arg[1];
-	arg[0].Set("a(ssiii)", i, cln);
-        QStatus status = MethodReply(msg, arg, 1);
-        if (status != ER_OK) {
-            printf("Failed to create MethodReply for GetClients.\n");
-        }
-}
-
-void WirelessBusObject::WpsPushButton(const InterfaceDescription::Member* member, Message& msg) {
-        printf("WpsPushButton method called: %d\n", msg->GetArg(0)->v_int32);
-	QStatus status = MethodReply(msg, NULL, 1);
-        if (status != ER_OK) {
-            printf("Failed to create MethodReply for WpsPushButton.\n");
-        }
-	wpsPushButton(msg->GetArg(0)->v_int32);
-}
-
-QStatus WirelessBusObject::SendWpsSignal(int respcode) {
-	const InterfaceDescription* bus_ifc = bus->GetInterface("org.allseen.WPS");
-	const InterfaceDescription::Member* wpsResponse = (bus_ifc ? bus_ifc->GetMember("WpsResponse") : NULL);
-	uint8_t flags = ALLJOYN_FLAG_SESSIONLESS;
-
-	assert(wpsResponse);
-
-        MsgArg arg("i", respcode);
-        QStatus status = Signal(NULL, 0, *wpsResponse, &arg, 1, 0, flags);
-
-
-	const char *sgnl = NULL;
-	if (respcode == 2)
-		sgnl = "is activated";
-	else if (respcode == 1)
-		sgnl = "pairing is successful";
-	else if (respcode == 0)
-		sgnl = "pairing is timed out";
-	else if (respcode == 3)
-		sgnl = "is terminated";
-	else if (respcode == -1)
-		sgnl = "status is changed";
-
-	printf("Sending WPS %s signal\n", sgnl);
-
-        if (status != ER_OK) {
-            printf("Failed to create WPS Signal.\n");
-        }
-	return status;
-}
-
-QStatus WirelessBusObject::Get(const char* ifcName, const char* propName, MsgArg& val)
-{
-    QStatus status = ER_BUS_NO_SUCH_PROPERTY;
-    if (strcmp(ifcName, "org.allseen.WiFi") == 0) {
-        lock.Lock();
-        if (strcmp(propName, "Enable") == 0) {
-            val.Set("i", enableWifi);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Get property %s (%d) at %s\n", propName, enableWifi, GetPath());
-        } else if (strcmp(propName, "Ssid") == 0) {
-            val.Set("s", ssid.c_str());
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Get property %s (%s) at %s\n", propName, ssid.c_str(), GetPath());
-        } else if (strcmp(propName, "Key") == 0) {
-            val.Set("s", key.c_str());
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Get property %s (%s) at %s\n", propName, key.c_str(), GetPath());
-        } else if (strcmp(propName, "Channel2g") == 0) {
-            val.Set("i", channel2g);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Get property %s (%d) at %s\n", propName, channel2g, GetPath());
-        } else if (strcmp(propName, "Channel5g") == 0) {
-            val.Set("i", channel5g);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Get property %s (%d) at %s\n", propName, channel5g, GetPath());
-        } else if (strcmp(propName, "EnableWps") == 0) {
-            val.Set("i", enableWps);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Get property %s (%d) at %s\n", propName, enableWps, GetPath());
-        }
-        lock.Unlock();
-//    } else if (strcmp(ifcName, "org.allseen.WPS") == 0) {
-//        lock.Lock();
-//        if (strcmp(propName, "Enable") == 0) {
-//            val.Set("i", enableWps);
-//            status = ER_OK;
-//            QCC_SyncPrintf("WPS Get property %s (%d) at %s\n", propName, enableWps, GetPath());
-//        }
-//        lock.Unlock();
-    }
-    return status;
-}
-
-QStatus WirelessBusObject::Set(const char* ifcName, const char* propName, MsgArg& val)
-{
-    QStatus status = ER_BUS_NO_SUCH_PROPERTY;
-    if (strcmp(ifcName, "org.allseen.WiFi") == 0) {
-        lock.Lock();
-        if (strcmp(propName, "Enable") == 0) {
-            val.Get("i", &enableWifi);
-            EmitPropChanged(ifcName, propName, val, id);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Set property %s (%d) at %s\n", propName, enableWifi, GetPath());
-	    changeWifiStatus();
-        } else if (strcmp(propName, "Ssid") == 0) {
-            const char* s;
-            val.Get("s", &s);
-            ssid = s;
-            EmitPropChanged(ifcName, propName, val, id);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Set property %s (%s) at %s\n", propName, ssid.c_str(), GetPath());
-	    setSsid();
-        } else if (strcmp(propName, "Key") == 0) {
-            const char* s;
-            val.Get("s", &s);
-            key = s;
-            EmitPropChanged(ifcName, propName, val, id);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Set property %s (%s) at %s\n", propName, key.c_str(), GetPath());
-	    setKey();
-        } else if (strcmp(propName, "Channel2g") == 0) {
-            val.Get("i", &channel2g);
-            EmitPropChanged(ifcName, propName, val, id);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Set property %s (%d) at %s\n", propName, channel2g, GetPath());
-	    setChannel(2);
-        } else if (strcmp(propName, "Channel5g") == 0) {
-            val.Get("i", &channel5g);
-            EmitPropChanged(ifcName, propName, val, id);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Set property %s (%d) at %s\n", propName, channel5g, GetPath());
-	    setChannel(5);
-        } else if (strcmp(propName, "EnableWps") == 0) {
-            val.Get("i", &enableWps);
-            EmitPropChanged(ifcName, propName, val, id);
-            status = ER_OK;
-            QCC_SyncPrintf("WiFi Set property %s (%d) at %s\n", propName, enableWps, GetPath());
-	    changeWpsStatus();
-        }
-        lock.Unlock();
-//    } else if (strcmp(ifcName, "org.allseen.WPS") == 0) {
-//        lock.Lock();
-//        if (strcmp(propName, "Enable") == 0) {
-//            val.Get("i", &enableWps);
-//            EmitPropChanged(ifcName, propName, val, id);
-//            status = ER_OK;
-//            QCC_SyncPrintf("WPS Set property %s (%d) at %s\n", propName, enableWps, GetPath());
-//	    changeWpsStatus();
-//        }
-//        lock.Unlock();
-    }
-    return status;
-}
-
-void WirelessBusObject::setChannel(int freq) {
-	String wl;
-	int ch;
-	char channel[4];
-	string acsifs;
-	bool restartAcsd = true;
-
-	if (freq == 5) {
-		wl = radio5g;
-		ch = channel5g;
-	} else {
-		wl = radio2g;
-		ch = channel2g;
-	}
-
-	acsifs = strCmd("nvram get acs_ifnames");
-
-	if (ch == 0) {
-		if (acsifs == "")
-			runCmd("nvram set acs_ifnames=%s", wl.c_str());
-		else if (acsifs.find(wl.c_str()) == string::npos)
-			runCmd("nvram set acs_ifnames=\"%s %s\"", acsifs.c_str(), wl.c_str());
-		else
-			restartAcsd = false;
-
-		strncpy(channel, "auto", 4);
-		if (restartAcsd || strCmd("pidof acsd") == "") {
-			runCmd("killall -9 acsd; acsd");
-		} else {
-			runCmd("acs_cli -i %s mode 2", wl.c_str());
-			runCmd("acs_cli -i %s autochannel", wl.c_str());
-		}
-	} else {
-		snprintf(channel, 3, "%d", ch);
-		runCmd("acs_cli -i %s mode 0", wl.c_str());
-		runCmd("wlctl -i %s down", wl.c_str());
-		runCmd("wlctl -i %s channel %d", wl.c_str(), ch);
-		runCmd("wlctl -i %s up", wl.c_str());
-	}
-
-	uciSet("wireless", wl.c_str(), "channel", channel);
-	uciCommit("wireless");
-}
-
-void WirelessBusObject::setSsid() {
-	struct uci_element *e;
-	struct uci_section *s;
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-iface")) {
-			uset(s, "ssid", ssid.c_str());
-		}
-	}
-	ucommit(s);
-}
-
-void WirelessBusObject::setKey() {
-	struct uci_element *e;
-	struct uci_section *s;
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-iface")) {
-			uset(s, "key", key.c_str());
-		}
-	}
-	ucommit(s);
-}
-
-void WirelessBusObject::changeWifiStatus() {
-	struct uci_element *e;
-	struct uci_section *s;
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-device")) {
-			uset(s, "radio", enableWifi?"on":"off");
-		}
-	}
-	ucommit(s);
-
-	if (enableWifi)
-		runCmd("wifi up &");
-	else
-		runCmd("wifi down &");
-
-//	uci_foreach_element(&uci_wireless->sections, e) {
-//		s = uci_to_section(e);
-//		if (!strcmp(s->type, "wifi-iface")) {
-//			uset(s, "disabled", enableWifi?"0":"1");
-//		}
-//	}
-//	ucommit(s);
-
-//	if (enableWifi)
-//		runCmd("ubus call led.wifi set '{\"state\":\"ok\"}'");
-//	else
-//		runCmd("ubus call led.wifi set '{\"state\":\"off\"}'");
-
-//	string vifs;
-//	char vifsbuf[32];
-//	char *token;
-
-//	vifs = strCmd("nvram show | grep vifs | cut -d'=' -f2 | tr '\n' ' '");
-//	snprintf(vifsbuf, 32, "%s", vifs.c_str());
-
-//	token = strtok(vifsbuf, " ");
-//	while (token != NULL)
-//	{
-//		runCmd("wifi %s %s", enableWifi?"enable":"disable", token);
-//		token = strtok (NULL, " ");
-//	}
-}
-
-void WirelessBusObject::changeWpsStatus() {
-	struct uci_element *e;
-	struct uci_section *s;
-
-	/* send wps status changed signal */
-	SendWpsSignal(-1);
-
-	char wps[2];
-	snprintf(wps, 2, "%d", enableWps);
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-iface")) {
-			uset(s, "wps_pbc", wps);
-		}
-	}
-	ucommit(s);
-
-	string vifs;
-	char vifsbuf[32];
-	char *token;
-
-	vifs = strCmd("nvram show | grep vifs | cut -d'=' -f2 | tr '\n' ' '");
-	snprintf(vifsbuf, 32, "%s", vifs.c_str());
-
-	token = strtok(vifsbuf, " ");
-	while (token != NULL)
-	{
-		runCmd("nvram set %s_wps_mode=%s", token, (enableWps)?"enabled":"disabled");
-		token = strtok (NULL, " ");
-	}
-
-	if (enableWps) {
-		printf("Enabling WPS\n");
-		runCmd("nvram set wps_proc_status=0");
-		if (strCmd("pidof wps_monitor") == "") {
-			printf("Activating WPS\n");
-			runCmd("wps_monitor &");
-		}
-	} else {
-		printf("Disabling WPS\n");
-		runCmd("killall -SIGTERM wps_monitor 2>/dev/null");
-	}
-}
-
-void WirelessBusObject::wpsPushButton(int status) {
-	if (status) {
-		if (strCmd("pidof wps_monitor") == "") {
-			printf("Activating WPS\n");
-			runCmd("wps_monitor &");
-			usleep(100000);
-		}
-		printf("Starting WPS Pairing\n");
-		runCmd("killall -SIGUSR2 wps_monitor");
-	} else {
-		printf("Terminating WPS Pairing\n");
-		runCmd("nvram set wps_proc_status=0");
-		runCmd("killall -SIGTERM wps_monitor");
-	}
-}
-
-
-WirelessBusObject *MyBus;
-
-void wps_event(const char *key, const char *val)
-{
-	int respcode = 2;
-	if(!strcmp(val, "timeout"))
-		respcode = 0;
-	else if (!strcmp(val, "terminated"))
-		respcode = 3;
-	else if (!strcmp(key, "sta"))
-		respcode = 1;
-
-	if (respcode != 3)
-		MyBus->SendWpsSignal(respcode);
-}
-
-static void
-populateWireless()
-{
-	struct uci_element *e;
-	struct uci_section *s;
-	String channel, chanspec;
-	const char *radio = NULL;
-
-	if(!(uci_wireless = init_package("wireless")))
-		return;
-
-	MyBus->enableWifi = 1;
-	MyBus->enableWps = 0;
-	MyBus->channel2g = 0;
-	MyBus->channel5g = -1;
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-device")) {
-			if(!strcmp(ugets(s, "band"), "a")) {
-				MyBus->radio5g = s->e.name;
-				chanspec = ugets(s, "channel");
-				channel = chanspec.substr(0, chanspec.find('/'));
-				if (!strcmp(channel.c_str(), "auto"))
-					MyBus->channel5g = 0;
-				else
-					MyBus->channel5g = ugeti(s, "channel");
-			} else {
-				MyBus->radio2g = s->e.name;
-				radio = ugets(s, "radio");
-				if (radio && strcmp(radio, "off") == 0)
-					MyBus->enableWifi = 0;
-				chanspec = ugets(s, "channel");
-				channel = chanspec.substr(0, chanspec.find('/'));
-				if (channel == "auto")
-					MyBus->channel2g = 0;
-				else
-					MyBus->channel2g = ugeti(s, "channel");
-			}
-		} else if (!strcmp(s->type, "wifi-iface")) {
-			MyBus->ssid = ugets(s, "ssid");
-			MyBus->encryption = ugets(s, "encryption");
-			MyBus->key = ugets(s, "key");
-			if (ugeti(s, "wps_pbc") == 1)
-				MyBus->enableWps = 1;
-		}
-	}
-}
-
-int main(int argc, char** argv)
-{
-    QStatus status;
-    String advName = "org.alljoyn.alljoyn_wireless";
-
-    /* wait for  for alljoyn to start */
-    int tm = 10;
-    while (tm && strCmd("pidof alljoyn-daemon") == "") {
-	sleep(tm);
-	tm--;
-    }
-    sleep(1);
-
-    BusAttachment bus("Wireless", true);
-
-    status = bus.Start();
-    if (ER_OK == status) {
-        printf("BusAttachment started.\n");
-    } else {
-        printf("FAILED to start BusAttachment (%s)\n", QCC_StatusText(status));
-        exit(1);
-    }
-
-    status = bus.Connect();
-    if (ER_OK == status) {
-        printf("BusAttachment connect succeeded. BusAttachment Unique name is %s\n", bus.GetUniqueName().c_str());
-    } else {
-        printf("FAILED to connect to router node (%s)\n", QCC_StatusText(status));
-        exit(1);
-    }
-
-    status = bus.CreateInterfacesFromXml(wirelessInterfaceXML);
-
-    /* Request well-known name */
-    status = bus.RequestName(advName.c_str(), DBUS_NAME_FLAG_DO_NOT_QUEUE);
-    if (ER_OK == status) {
-        printf("RequestName('%s') succeeded.\n", advName.c_str());
-    } else {
-        printf("RequestName('%s') failed (status=%s).\n", advName.c_str(), QCC_StatusText(status));
-    }
-    /*-------------------------------*/
-
-    WirelessBusObject wirelessBusObject(bus, "/org/alljoyn/wireless");
-
-    MyBus = &wirelessBusObject;
-
-    populateWireless();
-
-    bus.RegisterBusObject(wirelessBusObject);
-
-    SessionOpts opts(SessionOpts::TRAFFIC_MESSAGES, false, SessionOpts::PROXIMITY_ANY, TRANSPORT_ANY);
-    SessionPort sp = ASSIGNED_SESSION_PORT;
-    MySessionPortListener sessionPortListener;
-    status = bus.BindSessionPort(sp, opts, sessionPortListener);
-    if (ER_OK == status) {
-        printf("BindSessionPort succeeded.\n");
-    } else {
-        printf("BindSessionPort failed (%s)\n", QCC_StatusText(status));
-        exit(1);
-    }
-
-    /* Advertise well-known name */
-    status = bus.AdvertiseName(advName.c_str(), TRANSPORT_ANY);
-    if (ER_OK == status) {
-        printf("Advertisement of the service name '%s' succeeded.\n", advName.c_str());
-    } else {
-        printf("Failed to advertise name '%s' (%s).\n", advName.c_str(), QCC_StatusText(status));
-    }
-    /*-------------------------------*/
-
-    // Setup the about data
-    AboutData aboutData("en");
-
-    uint8_t appId[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
-    status = aboutData.SetAppId(appId, 16);
-    status = aboutData.SetDeviceName(strCmd("db get hw.board.hardware").c_str());
-    status = aboutData.SetDeviceId(strCmd("db get hw.board.BaseMacAddr").c_str());
-    status = aboutData.SetAppName("WiFi Manager");
-    status = aboutData.SetManufacturer("Inteno");
-    status = aboutData.SetModelNumber(strCmd("db get hw.board.routerModel | cut -d'-' -f 2").c_str());
-    status = aboutData.SetDescription("Manage WiFi");
-    status = aboutData.SetDateOfManufacture(strCmd("db get hw.board.iopVersion | awk -F'[-,_]' '{print$4}'").c_str());
-    status = aboutData.SetSoftwareVersion(strCmd("db get hw.board.iopVersion | awk -F'[-,_]' '{print$3}'").c_str());
-    status = aboutData.SetHardwareVersion(strCmd("db get hw.board.hardwareVersion").c_str());
-    status = aboutData.SetSupportUrl("http://www.iopsys.eu");
-    if (!aboutData.IsValid()) {
-        printf("failed to setup about data.\n");
-    }
-
-    AboutIcon icon;
-    status = icon.SetUrl("wp-content/uploads/2014/09/iopsys_logo_CMYK_invert_circle.png", "http://www.iopsys.eu");
-    if (ER_OK != status) {
-        printf("Failed to setup the AboutIcon.\n");
-    }
-    AboutIconObj aboutIconObj(bus, icon);
-
-    // Announce about signal
-    AboutObj aboutObj(bus, BusObject::ANNOUNCED);
-    status = aboutObj.Announce(ASSIGNED_SESSION_PORT, aboutData);
-    if (ER_OK == status) {
-        printf("AboutObj Announce Succeeded.\n");
-    } else {
-        printf("AboutObj Announce failed (%s)\n", QCC_StatusText(status));
-    }
-
-    ubus_listener();
-
-    return 0;
-}
diff --git a/wifimngr/src/wireless.cc b/wifimngr/src/wireless.cc
deleted file mode 100644
index 0a56ff903cda1dbe2147f5314d659856b479a501..0000000000000000000000000000000000000000
--- a/wifimngr/src/wireless.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * wifimngr -- wifi manager
- *
- * Copyright (C) 2012-2013 Inteno Broadband Technology AB. All rights reserved.
- *
- * Author: sukru.senli@inteno.se
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-
-#include "wifi.h"
-
-extern "C"
-{
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <stdbool.h>
-
-#include <sys/sysinfo.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <fcntl.h>
-}
-
-static struct uci_package *uci_wireless;
-
-//WirelessRadio WDev[MAX_WDEV];
-//WirelessInterface WIfc[MAX_WIFC];
-
-//void
-//populateWirelessInterfaces()
-//{
-//	struct uci_element *e;
-//	struct uci_section *s;
-//	const char *device;
-//	int idx = 0;
-//	int vif;
-//	int vif0 = 0;
-//	int vif1 = 0;
-//	char wif[8];
-
-//	uci_foreach_element(&uci_wireless->sections, e) {
-//		s = uci_to_section(e);
-//		if (!strcmp(s->type, "wifi-iface")) {
-//			device = ugets(s, "device");
-//			WIfc[idx].radio = device;
-//			if (!strcmp(device, "wl0")) {
-//				vif = vif0;
-//				vif0++;
-//			} else {
-//				vif = vif1;
-//				vif1++;
-//			}
-//			if (vif > 0)
-//				sprintf(wif, "%s.%d", device, vif);
-//			else
-//				strcpy(wif, device);
-//			WIfc[idx].ifname = std::string(wif);
-//			WIfc[idx].ssid = ugets(s, "ssid");
-//			WIfc[idx].encryption = ugets(s, "encryption");
-//			WIfc[idx].key = ugets(s, "key");
-//			idx++;
-//		}
-//	}
-//}
-
-//void
-//populateWirelessRadios()
-//{
-//	struct uci_element *e;
-//	struct uci_section *s;
-//	int idx = 0;
-
-//	if(!(uci_wireless = init_package("wireless")))
-//		return;
-
-//	uci_foreach_element(&uci_wireless->sections, e) {
-//		s = uci_to_section(e);
-//		if (!strcmp(s->type, "wifi-device")) {
-//			WDev[idx].name = s->e.name;
-//			WDev[idx].bwCap = ugeti(s, "bandwidth");
-//			WDev[idx].hwmode = ugets(s, "hwmode");
-//			WDev[idx].channel = ugeti(s, "channel");
-//			WDev[idx].autoChanTimer = ugeti(s, "scantimer");
-//			idx++;
-//		}
-//	}
-//}
-
-Wireless WL;
-WPS Wps;
-
-string Wireless::getChannels(int freq) {
-	string wl;
-	if (freq == 5)
-		wl = WL.radio5g;
-	else
-		wl = WL.radio2g;
-
-	return strCmd("wlctl -i %s channels", wl.c_str());
-}
-
-void Wireless::setChannel(int freq, int ch) {
-	string wl;
-
-	char channel[3];
-	snprintf(channel, 3, "%d", ch);
-
-	if (freq == 5) {
-		wl = WL.radio5g;
-		WL.channel5g = ch;
-	} else {
-		wl = WL.radio2g;
-		WL.channel2g = ch;
-	}
-
-	uciSet("wireless", wl.c_str(), "channel", channel);
-	uciCommit("wireless");
-	runCmd("wlctl -i %s down", wl.c_str());
-	runCmd("wlctl -i %s channel %d", wl.c_str(), ch);
-	runCmd("wlctl -i %s up", wl.c_str());
-}
-
-void Wireless::setSsid(string ssid) {
-	struct uci_element *e;
-	struct uci_section *s;
-
-	if (WL.ssid == ssid)
-		return;
-
-	WL.ssid = ssid;
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-iface")) {
-			uset(s, "ssid", ssid.c_str());
-		}
-	}
-	ucommit(s);
-
-	runCmd("sed -i \"s/_ssid=.*/_ssid=%s/g\" /etc/config/broadcom", ssid.c_str());
-	runCmd("killall -9 nas; nas");
-	runCmd("killall -SIGTERM wps_monitor; wps_monitor &");
-}
-
-void Wireless::setKey(string key) {
-	struct uci_element *e;
-	struct uci_section *s;
-
-	if (WL.key == key)
-		return;
-
-	WL.key = key;
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-iface")) {
-			uset(s, "key", key.c_str());
-		}
-	}
-	ucommit(s);
-
-	runCmd("sed -i \"s/_wpa_psk=.*/_wpa_psk=%s/g\" /etc/config/broadcom", key.c_str());
-	runCmd("killall -9 nas; nas");
-	runCmd("killall -SIGTERM wps_monitor; wps_monitor &");
-}
-
-void WPS::activate(int status) {
-	if (status) {
-		if (strCmd("pidof wps_monitor") == "") {
-			runCmd("wps_monitor &");
-			usleep(100000);
-		}
-		runCmd("killall -SIGUSR2 wps_monitor");
-	} else
-		runCmd("killall -SIGTERM wps_monitor");
-}
-
-void WPS::changeStatus() {
-	struct uci_element *e;
-	struct uci_section *s;
-
-	char wps[2];
-	snprintf(wps, 2, "%d", Wps.enable);
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-iface")) {
-			uset(s, "wps_pbc", wps);
-		}
-	}
-	ucommit(s);
-
-	if (Wps.enable) {
-		runCmd("sed -i \"s/wps_mode 'disabled'/wps_mode 'enabled'/g\" /etc/config/broadcom");
-		if (strCmd("pidof wps_monitor") == "")
-			runCmd("wps_monitor &");
-	} else {
-		runCmd("sed -i \"s/wps_mode 'enabled'/wps_mode 'disabled'/g\" /etc/config/broadcom");
-		runCmd("killall -SIGTERM wps_monitor 2>/dev/null");
-	}
-}
-
-void
-populateWireless()
-{
-	struct uci_element *e;
-	struct uci_section *s;
-	string channel, chanspec;
-
-	if(!(uci_wireless = init_package("wireless")))
-		return;
-
-	Wps.enable = 0;
-	WL.channel2g = 0;
-	WL.channel5g = -1;
-
-	uci_foreach_element(&uci_wireless->sections, e) {
-		s = uci_to_section(e);
-		if (!strcmp(s->type, "wifi-device")) {
-			if(!strcmp(ugets(s, "band"), "a")) {
-				WL.radio5g = s->e.name;
-				chanspec = ugets(s, "channel");
-				channel = chanspec.substr(0, chanspec.find('/'));
-				if (!strcmp(channel.c_str(), "auto"))
-					WL.channel5g = 0;
-				else
-					WL.channel5g = ugeti(s, "channel");
-			} else {
-				WL.radio2g = s->e.name;
-				chanspec = ugets(s, "channel");
-				channel = chanspec.substr(0, chanspec.find('/'));
-				if (channel == "auto")
-					WL.channel2g = 0;
-				else
-					WL.channel2g = ugeti(s, "channel");
-			}
-		} else if (!strcmp(s->type, "wifi-iface")) {
-			WL.ssid = ugets(s, "ssid");
-			WL.encryption = ugets(s, "encryption");
-			WL.key = ugets(s, "key");
-			if (ugeti(s, "wps_pbc") == 1)
-				Wps.enable = 1;
-		}
-	}
-}