diff --git a/calico_node/.gitignore b/calico_node/.gitignore
index 5aa1876..6d8ff47 100644
--- a/calico_node/.gitignore
+++ b/calico_node/.gitignore
@@ -20,6 +20,5 @@ calicoctl/calicoctl
 bin
 release
 *.coverprofile
-vendor
 nosetests.xml
 testfile.yaml
diff --git a/calico_node/filesystem/etc/rc.local b/calico_node/filesystem/etc/rc.local
index 2158a47..5c13184 100755
--- a/calico_node/filesystem/etc/rc.local
+++ b/calico_node/filesystem/etc/rc.local
@@ -8,6 +8,9 @@ if [ -n "$CALICO_NETWORKING" ]; then
 	fi
 fi
 
+# Override backend: force to "gobgp"
+export CALICO_NETWORKING_BACKEND=gobgp
+
 # Run the startup initialisation script.  These ensure the node is correctly
 # configured to run.
 startup || exit 1
@@ -30,7 +33,7 @@ mkdir /etc/service/enabled
 # Allow felix to be disabled, for example, if the user is running Felix
 # outside the container.
 if [ -z "$CALICO_DISABLE_FELIX" ]; then
-  cp -a /etc/service/available/felix /etc/service/enabled/
+  cp -hpR /etc/service/available/felix /etc/service/enabled/
 fi
 
 case "$CALICO_NETWORKING_BACKEND" in
@@ -41,9 +44,9 @@ case "$CALICO_NETWORKING_BACKEND" in
 	"gobgp" )
 	# Run calico-bgp-daemon instead of BIRD / Confd.
 	echo "CALICO_NETWORKING_BACKEND is gobgp - run calico-bgp-daemon"
-	cp -a /etc/service/available/calico-bgp-daemon /etc/service/enabled/
-	sh -c 'for file in `find /etc/calico/confd/conf.d/ -not -name 'tunl-ip.toml' -type f`; do rm $file; done'
-	cp -a /etc/service/available/confd /etc/service/enabled/
+	cp -hpR /etc/service/available/calico-bgp-daemon /etc/service/enabled/
+	sh -c 'for file in `find /etc/calico/confd/conf.d/ ! -name 'tunl-ip.toml' -type f`; do rm $file; done'
+	cp -hpR /etc/service/available/confd /etc/service/enabled/
 	;;
 	* )
 	# Run BIRD / Confd.
@@ -62,25 +65,17 @@ case "$CALICO_NETWORKING_BACKEND" in
     confd -confdir=/etc/calico/confd -onetime -keep-stage-file >/felix-startup-1.log 2>&1 || true
 
 	# Enable the confd and bird services
-	cp -a /etc/service/available/bird  /etc/service/enabled/
-	cp -a /etc/service/available/bird6 /etc/service/enabled/
-	cp -a /etc/service/available/confd /etc/service/enabled/
+	cp -hpR /etc/service/available/bird  /etc/service/enabled/
+	cp -hpR /etc/service/available/bird6 /etc/service/enabled/
+	cp -hpR /etc/service/available/confd /etc/service/enabled/
 	;;
 esac
 
-# If running libnetwork plugin in a separate container, CALICO_LIBNETWORK_ENABLED would be false.
-# CALICO_LIBNETWORK_ENABLED is "false" by default. It can be set by passing `--libnetwork` flag while starting the calico/node via calicoctl
-if [ "$CALICO_LIBNETWORK_ENABLED" == "true" ]; then
-	echo "Starting libnetwork service"
-	cp -a /etc/service/available/libnetwork  /etc/service/enabled/
-fi
-
 if [ "$CALICO_DISABLE_FILE_LOGGING" == "true" ]; then
 	rm -rf /etc/service/enabled/bird/log
 	rm -rf /etc/service/enabled/bird6/log
 	rm -rf /etc/service/enabled/confd/log
 	rm -rf /etc/service/enabled/felix/log
-	rm -rf /etc/service/enabled/libnetwork/log
 	rm -rf /etc/service/enabled/calico-bgp-daemon/log
 fi
 
diff --git a/calico_node/filesystem/etc/service/available/felix/run b/calico_node/filesystem/etc/service/available/felix/run
index 6b1be8d..fac01d3 100755
--- a/calico_node/filesystem/etc/service/available/felix/run
+++ b/calico_node/filesystem/etc/service/available/felix/run
@@ -15,4 +15,5 @@ export FELIX_ETCDCERTFILE=$ETCD_CERT_FILE
 if [ ! -z $DATASTORE_TYPE ]; then
     export FELIX_DATASTORETYPE=$DATASTORE_TYPE
 fi
+export GOMAXPROCS=3
 exec calico-felix
diff --git a/calico_node/filesystem/sbin/start_runit b/calico_node/filesystem/sbin/start_runit
index 3bfde58..45d7927 100755
--- a/calico_node/filesystem/sbin/start_runit
+++ b/calico_node/filesystem/sbin/start_runit
@@ -1,6 +1,6 @@
 #!/bin/sh
 # From https://github.com/faisyl/alpine-runit
-env > /etc/envvars
+env > /etc/environment
 
 /etc/rc.local
 retval=$?
@@ -13,4 +13,4 @@ fi
 # Source any additional environment that was added by the startup script
 . ./startup.env
 
-exec /sbin/runsvdir -P /etc/service/enabled
+exec /opt/freeware/sbin/runsvdir /etc/service/enabled
diff --git a/calico_node/startup/startup.go b/calico_node/startup/startup.go
index bdf3be3..9e2ce42 100644
--- a/calico_node/startup/startup.go
+++ b/calico_node/startup/startup.go
@@ -57,12 +57,12 @@ const (
 // auto detect IP method
 var DEFAULT_INTERFACES_TO_EXCLUDE []string = []string{
 	"docker.*", "cbr.*", "dummy.*",
-	"virbr.*", "lxcbr.*", "veth.*", "lo",
+	"virbr.*", "lxcbr.*", "veth.*", "lo", "vi.*",
 	"cali.*", "tunl.*", "flannel.*", "kube-ipvs.*",
 }
 
 // Version string, set during build.
-var VERSION string
+var VERSION string = "v3.0.4"
 
 // For testing purposes we define an exit function that we can override.
 var exitFunction = os.Exit
@@ -701,9 +701,7 @@ func ipv6Supported() bool {
 		return false
 	}
 
-	// If supported, then also check /proc/sys/net/ipv6.
-	_, err := os.Stat("/proc/sys/net/ipv6")
-	supported := (err == nil)
+	supported := true
 	log.Infof("IPv6 supported on this platform: %v", supported)
 	return supported
 }
diff --git a/calico_node/vendor/github.com/sirupsen/logrus/terminal_aix.go b/calico_node/vendor/github.com/sirupsen/logrus/terminal_aix.go
new file mode 100644
index 0000000..6841999
--- /dev/null
+++ b/calico_node/vendor/github.com/sirupsen/logrus/terminal_aix.go
@@ -0,0 +1,26 @@
+// Based on ssh/terminal:
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build aix
+
+package logrus
+
+import (
+	"io"
+	"os"
+	"syscall"
+)
+
+// IsTerminal returns true if stderr's file descriptor is a terminal.
+func IsTerminal(f io.Writer) bool {
+	var termios syscall.Termios
+	switch v := f.(type) {
+	case *os.File:
+		err := syscall.Tcgetattr(int(v.Fd()), &termios)
+		return err == nil
+	default:
+		return false
+	}
+}
diff --git a/calico_node/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go b/calico_node/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go
new file mode 100644
index 0000000..c906345
--- /dev/null
+++ b/calico_node/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go
@@ -0,0 +1,102 @@
+// Based on ssh/terminal:
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package terminal
+
+import (
+	"io"
+	"syscall"
+)
+
+// State represents the state of the terminal.
+type State struct {
+	termios syscall.Termios
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+	var termios syscall.Termios
+	err := syscall.Tcgetattr(fd, &termios)
+	return err == nil
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+	var oldState State
+	if err := syscall.Tcgetattr(fd, &oldState.termios); err != nil {
+		return nil, err
+	}
+
+	newState := oldState.termios
+	newState.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON
+	newState.Oflag &^= syscall.OPOST
+	newState.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN
+	newState.Cflag &^= syscall.CSIZE | syscall.PARENB
+	newState.Cflag |= syscall.CS8
+
+	if err := syscall.Tcsetattr(fd, syscall.TCSANOW, &newState); err != nil {
+		return nil, err
+	}
+	return &oldState, nil
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, oldState *State) error {
+	return syscall.Tcsetattr(fd, syscall.TCSANOW, &oldState.termios)
+}
+
+// passwordReader is an io.Reader that reads from a specific file descriptor.
+type passwordReader int
+
+func (r passwordReader) Read(buf []byte) (int, error) {
+	return syscall.Read(int(r), buf)
+}
+
+// ReadPassword reads a line of input from a terminal without local echo.  This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+	var oldState syscall.Termios
+	if err := syscall.Tcgetattr(fd, &oldState); err != nil {
+		return nil, err
+	}
+
+	newState := oldState
+	newState.Lflag &^= syscall.ECHO | syscall.ECHOE | syscall.ECHOK | syscall.ECHONL
+	if err := syscall.Tcsetattr(fd, syscall.TCSANOW, &newState); err != nil {
+		return nil, err
+	}
+
+	defer func() {
+		syscall.Tcsetattr(fd, syscall.TCSANOW, &oldState)
+	}()
+
+	var buf [16]byte
+	var ret []byte
+	for {
+		n, err := syscall.Read(fd, buf[:])
+		if err != nil {
+			return nil, err
+		}
+		if n == 0 {
+			if len(ret) == 0 {
+				return nil, io.EOF
+			}
+			break
+		}
+		if buf[n-1] == '\n' {
+			n--
+		}
+		ret = append(ret, buf[:n]...)
+		if n < len(buf) {
+			break
+		}
+	}
+
+	return ret, nil
+}
