diff --git a/api/client.go b/api/client.go
index 37227372bfd21c14d5eff5ee88a3f909dbc819bf..15555c63728f2fd8012d3d2edc0f2aecd045ec7a 100644
--- a/api/client.go
+++ b/api/client.go
@@ -58,6 +58,8 @@ type Client struct {
 
 	//handler for external services
 	services *serviceProcessiesList
+
+	clientErrorChannel chan interfaces.ClientError
 }
 
 // NewClient creates client storage, generates keys, connects, and registers
@@ -200,21 +202,20 @@ func Login(storageDir string, password []byte, parameters params.Network) (*Clie
 	def := c.storage.GetBaseNDF()
 
 	//initialize permissioning
-	if def.Registration.Address != ""{
-		err = c.initPermissioning(def)
+	if def.Registration.Address != "" {
+		err = c.registerPermissioning(def)
 		if err != nil {
 			return nil, err
 		}
-	}else{
+	} else {
 		jww.WARN.Printf("Registration with permissioning skipped due to " +
 			"blank permissionign address. Client will not be able to register " +
 			"or track network.")
 	}
 
-
 	// Initialize network and link it to context
 	c.network, err = network.NewManager(c.storage, c.switchboard, c.rng, c.comms,
-		parameters, def)
+		parameters, def, SEMVER)
 	if err != nil {
 		return nil, err
 	}
@@ -264,12 +265,12 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte,
 	c.storage.SetBaseNDF(def)
 
 	//initialize permissioning
-	if def.Registration.Address != ""{
-		err = c.initPermissioning(def)
+	if def.Registration.Address != "" {
+		err = c.registerPermissioning(def)
 		if err != nil {
 			return nil, err
 		}
-	}else{
+	} else {
 		jww.WARN.Printf("Registration with permissioning skipped due to " +
 			"blank permissionign address. Client will not be able to register " +
 			"or track network.")
@@ -277,7 +278,7 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte,
 
 	// Initialize network and link it to context
 	c.network, err = network.NewManager(c.storage, c.switchboard, c.rng, c.comms,
-		parameters, def)
+		parameters, def, SEMVER)
 	if err != nil {
 		return nil, err
 	}
@@ -294,7 +295,7 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte,
 	return c, nil
 }
 
-func (c *Client)initComms()error{
+func (c *Client) initComms() error {
 	var err error
 
 	//get the user from session
@@ -312,23 +313,18 @@ func (c *Client)initComms()error{
 	return nil
 }
 
-func (c *Client)initPermissioning(def *ndf.NetworkDefinition)error{
+func (c *Client) registerPermissioning(def *ndf.NetworkDefinition) error {
 	var err error
-	//initialize permissioning
-	c.permissioning, err = permissioning.Init(c.comms, def)
-	if err != nil {
-		return errors.WithMessage(err, "failed to init "+
-			"permissioning handler")
-	}
-
-	// check the client version is up to date to the network
-	err = c.checkVersion()
-	if err != nil {
-		return errors.WithMessage(err, "failed to load client")
-	}
 
 	//register with permissioning if necessary
-	if c.storage.GetRegistrationStatus() == storage.KeyGenComplete  {
+	if c.storage.GetRegistrationStatus() == storage.KeyGenComplete {
+		//initialize permissioning
+		c.permissioning, err = permissioning.Init(c.comms, def)
+		if err != nil {
+			return errors.WithMessage(err, "failed to init "+
+				"permissioning handler")
+		}
+
 		jww.INFO.Printf("Client has not registered yet, attempting registration")
 		err = c.registerWithPermissioning()
 		if err != nil {
@@ -371,20 +367,34 @@ func (c *Client)initPermissioning(def *ndf.NetworkDefinition)error{
 //		Responds to confirmations of successful rekey operations
 //   - Auth Callback (/auth/callback.go)
 //      Handles both auth confirm and requests
-func (c *Client) StartNetworkFollower() error {
+func (c *Client) StartNetworkFollower() (<-chan interfaces.ClientError, error) {
 	jww.INFO.Printf("StartNetworkFollower()")
 
+	c.clientErrorChannel = make(chan interfaces.ClientError, 1000)
+
+	cer := func(source, message, trace string) {
+		select {
+		case c.clientErrorChannel <- interfaces.ClientError{
+			Source:  source,
+			Message: message,
+			Trace:   trace,
+		}:
+		default:
+			jww.WARN.Printf("Failed to notify about ClientError from %s: %s", source, message)
+		}
+	}
+
 	err := c.status.toStarting()
 	if err != nil {
-		return errors.WithMessage(err, "Failed to Start the Network Follower")
+		return nil, errors.WithMessage(err, "Failed to Start the Network Follower")
 	}
 
 	stopAuth := c.auth.StartProcessies()
 	c.runner.Add(stopAuth)
 
-	stopFollow, err := c.network.Follow()
+	stopFollow, err := c.network.Follow(cer)
 	if err != nil {
-		return errors.WithMessage(err, "Failed to start following "+
+		return nil, errors.WithMessage(err, "Failed to start following "+
 			"the network")
 	}
 	c.runner.Add(stopFollow)
@@ -393,12 +403,12 @@ func (c *Client) StartNetworkFollower() error {
 
 	err = c.status.toRunning()
 	if err != nil {
-		return errors.WithMessage(err, "Failed to Start the Network Follower")
+		return nil, errors.WithMessage(err, "Failed to Start the Network Follower")
 	}
 
 	c.services.run(c.runner)
 
-	return nil
+	return c.clientErrorChannel, nil
 }
 
 // StopNetworkFollower stops the network follower if it is running.
@@ -411,6 +421,7 @@ func (c *Client) StopNetworkFollower(timeout time.Duration) error {
 	if err != nil {
 		return errors.WithMessage(err, "Failed to Stop the Network Follower")
 	}
+	close(c.clientErrorChannel)
 	err = c.runner.Close(timeout)
 	if err != nil {
 		return errors.WithMessage(err, "Failed to Stop the Network Follower")
diff --git a/api/utilsInterfaces_test.go b/api/utilsInterfaces_test.go
index 6eb4c466a51845e756f275483271a785b643feaa..9afcb9a55f5eb99695a20d36a96c141fdd47cbc6 100644
--- a/api/utilsInterfaces_test.go
+++ b/api/utilsInterfaces_test.go
@@ -85,7 +85,7 @@ type testNetworkManagerGeneric struct {
 func (t *testNetworkManagerGeneric) GetHealthTracker() interfaces.HealthTracker {
 	return nil
 }
-func (t *testNetworkManagerGeneric) Follow() (stoppable.Stoppable, error) {
+func (t *testNetworkManagerGeneric) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
 	return nil, nil
 }
 func (t *testNetworkManagerGeneric) CheckGarbledMessages() {
diff --git a/api/version.go b/api/version.go
index a8c26beae37b2c4cc19e1a53ee03b79cc2fe3799..57d607b585497d1c4e73ef104536e19b8ab82ed2 100644
--- a/api/version.go
+++ b/api/version.go
@@ -7,12 +7,7 @@
 
 package api
 
-import (
-	"github.com/pkg/errors"
-	jww "github.com/spf13/jwalterweatherman"
-	"gitlab.com/elixxir/primitives/version"
-)
-
+/*
 func (c *Client) Version() version.Version {
 	v, err := version.ParseVersion(SEMVER)
 	if err != nil {
@@ -44,3 +39,4 @@ func (c *Client) checkVersion() error {
 
 	return nil
 }
+*/
diff --git a/bindings/callback.go b/bindings/callback.go
index 4fc0431a41718961405f040fed2a0691aa86b44d..1237e7fcf981f763fcf8dcb3be233d37e48741fd 100644
--- a/bindings/callback.go
+++ b/bindings/callback.go
@@ -92,3 +92,7 @@ func newRoundListUnregister(rounds []id.Round, ec []*dataStructures.EventCallbac
 	}
 	return &Unregister{f: f}
 }
+
+type ClientError interface {
+	Report(source, message, trace string)
+}
diff --git a/bindings/client.go b/bindings/client.go
index 866721af2ed32316a3191c0b60d7bfbdfe82691a..2d080e7baab96b3c99f0bf8a0b46de9b155ba1d5 100644
--- a/bindings/client.go
+++ b/bindings/client.go
@@ -174,11 +174,18 @@ func UnmarshalSendReport(b []byte) (*SendReport, error) {
 //		Responds to sent rekeys and executes them
 //   - KeyExchange Confirm (/keyExchange/confirm.go)
 //		Responds to confirmations of successful rekey operations
-func (c *Client) StartNetworkFollower() error {
-	if err := c.api.StartNetworkFollower(); err != nil {
+func (c *Client) StartNetworkFollower(clientError ClientError) error {
+	errChan, err := c.api.StartNetworkFollower()
+	if err != nil {
 		return errors.New(fmt.Sprintf("Failed to start the "+
 			"network follower: %+v", err))
 	}
+
+	go func() {
+		for report := range errChan {
+			go clientError.Report(report.Source, report.Message, report.Trace)
+		}
+	}()
 	return nil
 }
 
@@ -310,15 +317,15 @@ func (c *Client) WaitForRoundCompletion(marshaledSendReport []byte,
 
 	sr, err := UnmarshalSendReport(marshaledSendReport)
 	if err != nil {
-		 return errors.New(fmt.Sprintf("Failed to "+
+		return errors.New(fmt.Sprintf("Failed to "+
 			"WaitForRoundCompletion callback due to bad Send Report: %+v", err))
 	}
 
-	f := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]api.RoundResult){
+	f := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]api.RoundResult) {
 		results := make([]byte, len(sr.rl.list))
 
-		for i, r := range sr.rl.list{
-			if result, exists := rounds[r]; exists{
+		for i, r := range sr.rl.list {
+			if result, exists := rounds[r]; exists {
 				results[i] = byte(result)
 			}
 		}
@@ -326,7 +333,7 @@ func (c *Client) WaitForRoundCompletion(marshaledSendReport []byte,
 		mdc.EventCallback(sr.mid.Marshal(), allRoundsSucceeded, timedOut, results)
 	}
 
-	timeout := time.Duration(timeoutMS)*time.Millisecond
+	timeout := time.Duration(timeoutMS) * time.Millisecond
 
 	return c.api.GetRoundResults(sr.rl.list, timeout, f)
 }
diff --git a/cmd/root.go b/cmd/root.go
index a5b550f5ec405391b4ae96e57eb83f1d26f18ed2..e1b272b25e21e7097cd34a8b6940621fa2af2a61 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -86,7 +86,7 @@ var rootCmd = &cobra.Command{
 			})
 		}
 
-		err := client.StartNetworkFollower()
+		_, err := client.StartNetworkFollower()
 		if err != nil {
 			jww.FATAL.Panicf("%+v", err)
 		}
diff --git a/cmd/single.go b/cmd/single.go
index 3f9ee4ccbf5be8b2ec00fa592bf9a676821d4429..cf2b07f78cdc6cbcd64181d84f4bc63dd53a4f67 100644
--- a/cmd/single.go
+++ b/cmd/single.go
@@ -62,7 +62,7 @@ var singleCmd = &cobra.Command{
 			})
 		}
 
-		err := client.StartNetworkFollower()
+		_, err := client.StartNetworkFollower()
 		if err != nil {
 			jww.FATAL.Panicf("%+v", err)
 		}
diff --git a/cmd/ud.go b/cmd/ud.go
index 3c890c2e39c300901df26e164d448b219c41299c..0153f5e8c53a6dffd49631f5890af4b0effc11b9 100644
--- a/cmd/ud.go
+++ b/cmd/ud.go
@@ -62,7 +62,7 @@ var udCmd = &cobra.Command{
 			})
 		}
 
-		err := client.StartNetworkFollower()
+		_, err := client.StartNetworkFollower()
 		if err != nil {
 			jww.FATAL.Panicf("%+v", err)
 		}
diff --git a/cmd/version.go b/cmd/version.go
index 17ca3b7041e5e0ec2b0944f05c50e1d642f5d61e..071eb540c59b62abb17cfd128fa14a84ed665b4a 100644
--- a/cmd/version.go
+++ b/cmd/version.go
@@ -26,6 +26,10 @@ func Version() string {
 	return out
 }
 
+func GetVersion() string {
+	return currentVersion
+}
+
 func init() {
 	rootCmd.AddCommand(versionCmd)
 	rootCmd.AddCommand(generateCmd)
diff --git a/globals/version_vars.go b/globals/version_vars.go
index 7e5cc97102041b2236f514fe150a470f5595802a..603941fe81dabba2c02b864a43b0758805762b30 100644
--- a/globals/version_vars.go
+++ b/globals/version_vars.go
@@ -1,9 +1,9 @@
 // Code generated by go generate; DO NOT EDIT.
 // This file was generated by robots at
-// 2021-02-15 13:16:40.214748 -0600 CST m=+0.021065952
+// 2021-02-25 09:56:56.054196 -0800 PST m=+0.028922558
 package globals
 
-const GITVERSION = `e5e78f6b fixed the useage of the excluded list in send cMix`
+const GITVERSION = `09d47fb7 added a new logging print to single use`
 const SEMVER = "1.4.0"
 const DEPENDENCIES = `module gitlab.com/elixxir/client
 
@@ -24,13 +24,13 @@ require (
 	github.com/spf13/jwalterweatherman v1.1.0
 	github.com/spf13/viper v1.7.1
 	gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228
-	gitlab.com/elixxir/comms v0.0.4-0.20210215180544-d672a6bfd53a
-	gitlab.com/elixxir/crypto v0.0.7-0.20210210215733-951b4e717763
+	gitlab.com/elixxir/comms v0.0.4-0.20210224193109-e8dd662ec218
+	gitlab.com/elixxir/crypto v0.0.7-0.20210223210315-b2072c080b0f
 	gitlab.com/elixxir/ekv v0.1.4
-	gitlab.com/elixxir/primitives v0.0.3-0.20210210215643-bf48247248e5
-	gitlab.com/xx_network/comms v0.0.4-0.20210210215624-622913c0a215
-	gitlab.com/xx_network/crypto v0.0.5-0.20210210215543-446333e9022e
-	gitlab.com/xx_network/primitives v0.0.4-0.20210215191517-2f56b21d6ed7
+	gitlab.com/elixxir/primitives v0.0.3-0.20210225041422-ada5b068c1e3
+	gitlab.com/xx_network/comms v0.0.4-0.20210224201327-b0ce36c0c989
+	gitlab.com/xx_network/crypto v0.0.5-0.20210223210125-9c1a8a8f1ec6
+	gitlab.com/xx_network/primitives v0.0.4-0.20210224190828-4e0728a36eb3
 	golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad
 	golang.org/x/net v0.0.0-20201224014010-6772e930b67b // indirect
 	golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 // indirect
diff --git a/go.mod b/go.mod
index 1f39961060ebe7d93306f484fa55b7b8257e5c21..98998a181d9598a2e357c22a6b4cfd206b21f57a 100644
--- a/go.mod
+++ b/go.mod
@@ -17,13 +17,13 @@ require (
 	github.com/spf13/jwalterweatherman v1.1.0
 	github.com/spf13/viper v1.7.1
 	gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228
-	gitlab.com/elixxir/comms v0.0.4-0.20210223210438-35bdbcaf78be
+	gitlab.com/elixxir/comms v0.0.4-0.20210224193109-e8dd662ec218
 	gitlab.com/elixxir/crypto v0.0.7-0.20210223210315-b2072c080b0f
 	gitlab.com/elixxir/ekv v0.1.4
-	gitlab.com/elixxir/primitives v0.0.3-0.20210223210226-cccb5f7d4839
-	gitlab.com/xx_network/comms v0.0.4-0.20210223210205-6d1cb7fde5d1
+	gitlab.com/elixxir/primitives v0.0.3-0.20210225041422-ada5b068c1e3
+	gitlab.com/xx_network/comms v0.0.4-0.20210224201327-b0ce36c0c989
 	gitlab.com/xx_network/crypto v0.0.5-0.20210223210125-9c1a8a8f1ec6
-	gitlab.com/xx_network/primitives v0.0.4-0.20210219231511-983054dbee36
+	gitlab.com/xx_network/primitives v0.0.4-0.20210224190828-4e0728a36eb3
 	golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad
 	golang.org/x/net v0.0.0-20201224014010-6772e930b67b // indirect
 	golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 // indirect
diff --git a/go.sum b/go.sum
index 15d0acc8b72962ddf8c0015dd4ac85ff82628ebd..e8dafcbc34e08bc42fdef0c8026bf42415285611 100644
--- a/go.sum
+++ b/go.sum
@@ -251,24 +251,12 @@ github.com/zeebo/pcg v1.0.0 h1:dt+dx+HvX8g7Un32rY9XWoYnd0NmKmrIzpHF7qiTDj0=
 github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 h1:Gi6rj4mAlK0BJIk1HIzBVMjWNjIUfstrsXC2VqLYPcA=
 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k=
-gitlab.com/elixxir/comms v0.0.4-0.20210210215855-f8a4b9751c59 h1:/MSWVvLFV8Z2H37l+9fC3z5aO/fXktwd3RKFT21dvcM=
-gitlab.com/elixxir/comms v0.0.4-0.20210210215855-f8a4b9751c59/go.mod h1:ZXv+fpI/kRCzxxX6p4JXlonJVDl49t4+v71kEkBipgM=
-gitlab.com/elixxir/comms v0.0.4-0.20210212194414-4c36bb47fa96 h1:66NNOMK9zQqW3xmGYll8wB/BKD5jMHOyYjpgwQD7b+Q=
-gitlab.com/elixxir/comms v0.0.4-0.20210212194414-4c36bb47fa96/go.mod h1:ZXv+fpI/kRCzxxX6p4JXlonJVDl49t4+v71kEkBipgM=
-gitlab.com/elixxir/comms v0.0.4-0.20210218234550-f2e03b19bdb2 h1:p5GunVi5sP9atTw3DKBkgV6k3eR9iTyI6m9GbUr8hhA=
-gitlab.com/elixxir/comms v0.0.4-0.20210218234550-f2e03b19bdb2/go.mod h1:GCbfPWB7VF5ZeDsLBCwfy0JiquG4OK6gsRjaIS66+yg=
-gitlab.com/elixxir/comms v0.0.4-0.20210223182501-0b9a9fc80f48 h1:fV6kL7PVZ+uR+TXGChGkCGdEM/DwThmQMcEhZTORt0w=
-gitlab.com/elixxir/comms v0.0.4-0.20210223182501-0b9a9fc80f48/go.mod h1:GCbfPWB7VF5ZeDsLBCwfy0JiquG4OK6gsRjaIS66+yg=
-gitlab.com/elixxir/comms v0.0.4-0.20210223210438-35bdbcaf78be h1:+2OeULnvHDy52gP+KtyBwhOYO1Q3eJOIWI/cV4PRM1U=
-gitlab.com/elixxir/comms v0.0.4-0.20210223210438-35bdbcaf78be/go.mod h1:NcZ0SiO2Lf/+nXK0weAgmTiocO6rz1Inl3mfL5go3Ac=
+gitlab.com/elixxir/comms v0.0.4-0.20210224193109-e8dd662ec218 h1:TIvXa3SCqdxSruIuD3+fh3DFoN+nf6YV4F7RpvG0E8c=
+gitlab.com/elixxir/comms v0.0.4-0.20210224193109-e8dd662ec218/go.mod h1:BZLamz1D+9WHyNkx+LTKtV2dCJGnz4Oic8H6H7ACzxM=
 gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4 h1:28ftZDeYEko7xptCZzeFWS1Iam95dj46TWFVVlKmw6A=
 gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c=
 gitlab.com/elixxir/crypto v0.0.3 h1:znCt/x2bL4y8czTPaaFkwzdgSgW3BJc/1+dxyf1jqVw=
 gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
-gitlab.com/elixxir/crypto v0.0.7-0.20210210215733-951b4e717763 h1:MUFs4H4kTdPm/fsagl8vm2yGF6JR+/6fKSg1Y68XAQI=
-gitlab.com/elixxir/crypto v0.0.7-0.20210210215733-951b4e717763/go.mod h1:ucX9BoKoDlE6e3yjnTuVD2mc72nQUket44DxISyivUw=
-gitlab.com/elixxir/crypto v0.0.7-0.20210216174551-f806f79610eb h1:aPcrTC0QdrPqz4NgoAt5sfXt/+EFrNUwIns0s0VCQmg=
-gitlab.com/elixxir/crypto v0.0.7-0.20210216174551-f806f79610eb/go.mod h1:CLP8kULKW9A5oZHQ1zMCx4swMhBw2IMO68z4U/FkvcU=
 gitlab.com/elixxir/crypto v0.0.7-0.20210223210315-b2072c080b0f h1:VQDGEmfw6CLfmiN2asiNOJrodkDEGYVXDBDNfXsjTmk=
 gitlab.com/elixxir/crypto v0.0.7-0.20210223210315-b2072c080b0f/go.mod h1:onm3bf+h/yIza245YXHuUW2hUQ1Ga8K4doXk5AKnrgg=
 gitlab.com/elixxir/ekv v0.1.4 h1:NLVMwsFEKArWcsDHu2DbXlm9374iSgn7oIA3rVSsvjc=
@@ -278,27 +266,17 @@ gitlab.com/elixxir/primitives v0.0.0-20200804170709-a1896d262cd9/go.mod h1:p0Vel
 gitlab.com/elixxir/primitives v0.0.0-20200804182913-788f47bded40/go.mod h1:tzdFFvb1ESmuTCOl1z6+yf6oAICDxH2NPUemVgoNLxc=
 gitlab.com/elixxir/primitives v0.0.1 h1:q61anawANlNAExfkeQEE1NCsNih6vNV1FFLoUQX6txQ=
 gitlab.com/elixxir/primitives v0.0.1/go.mod h1:kNp47yPqja2lHSiS4DddTvFpB/4D9dB2YKnw5c+LJCE=
-gitlab.com/elixxir/primitives v0.0.3-0.20210210215643-bf48247248e5 h1:ExAOci0J5i53G+pA+oQ9ushG4WE0GQSiaO6JidHGEuw=
-gitlab.com/elixxir/primitives v0.0.3-0.20210210215643-bf48247248e5/go.mod h1:Cz0fCtgUKnVdo2rJgiJ/h3N8a2SPW8tP9tn6cV/+t1s=
-gitlab.com/elixxir/primitives v0.0.3-0.20210216174458-2a23825c1eb1 h1:BfcaQtKgIbafExdHkeKIJ5XEGe9MvUiv+yg9u7jwqhY=
-gitlab.com/elixxir/primitives v0.0.3-0.20210216174458-2a23825c1eb1/go.mod h1:Wpz7WGZ/CpO6oHNmVTgTNBETTRXi40arWjom1uwu/1s=
-gitlab.com/elixxir/primitives v0.0.3-0.20210223180234-8e5d82635c20 h1:76cC9BusM1hozdeEIosvfTXm/bYa/IVEY8Z9BvCrxq8=
-gitlab.com/elixxir/primitives v0.0.3-0.20210223180234-8e5d82635c20/go.mod h1:Wpz7WGZ/CpO6oHNmVTgTNBETTRXi40arWjom1uwu/1s=
 gitlab.com/elixxir/primitives v0.0.3-0.20210223210226-cccb5f7d4839 h1:BvHO58ibn08sxll46vLIngFf37Ab76GV3xC+DM2m/Uo=
 gitlab.com/elixxir/primitives v0.0.3-0.20210223210226-cccb5f7d4839/go.mod h1:LnvSPo0OMyHV4YMtnFelXwPu2UtU38h6DZrwUry6fjU=
+gitlab.com/elixxir/primitives v0.0.3-0.20210225041422-ada5b068c1e3 h1:hh3Y9kpGsw9VLqRodMIdyaJs/Onu73uktnkgwKZkmF4=
+gitlab.com/elixxir/primitives v0.0.3-0.20210225041422-ada5b068c1e3/go.mod h1:LnvSPo0OMyHV4YMtnFelXwPu2UtU38h6DZrwUry6fjU=
 gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw=
-gitlab.com/xx_network/comms v0.0.4-0.20210210215624-622913c0a215 h1:f+cobRegYJH2x6cFkf1RfJEGFnX/vq2hGLltFC+g4Bk=
-gitlab.com/xx_network/comms v0.0.4-0.20210210215624-622913c0a215/go.mod h1:P81n1Rv0so+uIWGkGDEUt/bEvpksM6yfB0iB22rbFx4=
-gitlab.com/xx_network/comms v0.0.4-0.20210216174438-0790d1f1f225 h1:ZVxPD76xDLdTSGY2w/aGRMiiry7SauD8sq4c+see6aM=
-gitlab.com/xx_network/comms v0.0.4-0.20210216174438-0790d1f1f225/go.mod h1:e7dy2wznC4U4bG/U3xFGYYsnnd8zHOhoSxzFkGPQYX4=
-gitlab.com/xx_network/comms v0.0.4-0.20210223210205-6d1cb7fde5d1 h1:AVKHbi69RA9DRIwgEPfRqCucmpsheskU9g+a4mGkDKo=
-gitlab.com/xx_network/comms v0.0.4-0.20210223210205-6d1cb7fde5d1/go.mod h1:H10pJ7id+76aJeC1zP9F/N8cFBj1KtmkWHAmDILwZMw=
+gitlab.com/xx_network/comms v0.0.4-0.20210224192239-f69087c5d7f4/go.mod h1:c/NEKv1QiZWYEp6fRc9ti1fds/eUWoyIckeEm+9ZvBU=
+gitlab.com/xx_network/comms v0.0.4-0.20210224201327-b0ce36c0c989 h1:Na1krYc+uLnEzc/nqdkpNL4oTw2obixEzhGzVFVboJw=
+gitlab.com/xx_network/comms v0.0.4-0.20210224201327-b0ce36c0c989/go.mod h1:H10pJ7id+76aJeC1zP9F/N8cFBj1KtmkWHAmDILwZMw=
 gitlab.com/xx_network/crypto v0.0.3/go.mod h1:DF2HYvvCw9wkBybXcXAgQMzX+MiGbFPjwt3t17VRqRE=
 gitlab.com/xx_network/crypto v0.0.4 h1:lpKOL5mTJ2awWMfgBy30oD/UvJVrWZzUimSHlOdZZxo=
 gitlab.com/xx_network/crypto v0.0.4/go.mod h1:+lcQEy+Th4eswFgQDwT0EXKp4AXrlubxalwQFH5O0Mk=
-gitlab.com/xx_network/crypto v0.0.5-0.20210210215543-446333e9022e h1:wRRIu5sB+5t2NgbLXCJsyqA3DK7a8rRUwPza2Vy5Rdc=
-gitlab.com/xx_network/crypto v0.0.5-0.20210210215543-446333e9022e/go.mod h1:NiPI62thPru+eYlBucjl2/OLUND3wKLOhPrIHvK/nCA=
-gitlab.com/xx_network/crypto v0.0.5-0.20210216174356-e81e1ddf8fb7 h1:vyL+m7D7w+RgMPARzcKCR8UMGC2foqNU6cSb1J6Dkis=
 gitlab.com/xx_network/crypto v0.0.5-0.20210216174356-e81e1ddf8fb7/go.mod h1:8J+/VBcMlBj2sZuSDaVKI/i58awFZ5Zdb4JdEwGVrqo=
 gitlab.com/xx_network/crypto v0.0.5-0.20210223210125-9c1a8a8f1ec6 h1:VOHKnXEeNsE7HV6jXRAnitaMz4Bk9+HNeGD65/Y14YM=
 gitlab.com/xx_network/crypto v0.0.5-0.20210223210125-9c1a8a8f1ec6/go.mod h1:hv5iBFSfmrhTkS8cAu1+/SlXXDzpHhZou+cgBSf8hAI=
@@ -307,16 +285,11 @@ gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da h1:CCVslUwNC
 gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da/go.mod h1:OK9xevzWCaPO7b1wiluVJGk7R5ZsuC7pHY5hteZFQug=
 gitlab.com/xx_network/primitives v0.0.2 h1:r45yKenJ9e7PylI1ZXJ1Es09oYNaYXjxVy9+uYlwo7Y=
 gitlab.com/xx_network/primitives v0.0.2/go.mod h1:cs0QlFpdMDI6lAo61lDRH2JZz+3aVkHy+QogOB6F/qc=
-gitlab.com/xx_network/primitives v0.0.4-0.20210210215152-e4534abf3ae5 h1:skLonqleopw1osf3xBQTNX9NjTV/OQP6AM4HKpLNUdc=
-gitlab.com/xx_network/primitives v0.0.4-0.20210210215152-e4534abf3ae5/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
-gitlab.com/xx_network/primitives v0.0.4-0.20210212180522-50ec526a6c12 h1:dOQS9tzT4fllDhU37pbJhAAW8qlB0HDjuf74rvzOZQQ=
-gitlab.com/xx_network/primitives v0.0.4-0.20210212180522-50ec526a6c12/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
-gitlab.com/xx_network/primitives v0.0.4-0.20210215192713-e32335847d4f h1:0wFEYIHuPkWJuDkbDXNrwC5yGwkd7Mugt2BwcTqQbFY=
 gitlab.com/xx_network/primitives v0.0.4-0.20210215192713-e32335847d4f/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
-gitlab.com/xx_network/primitives v0.0.4-0.20210219220414-99c389307a84 h1:dvc/2RMlgffJHy2mJd+GK9jhWLni42o5ChFPZ2oYgkw=
-gitlab.com/xx_network/primitives v0.0.4-0.20210219220414-99c389307a84/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
 gitlab.com/xx_network/primitives v0.0.4-0.20210219231511-983054dbee36 h1:41qeW7XB9Rllsi6fe37+eaQCLjTGchpvcJqwEvZxeXE=
 gitlab.com/xx_network/primitives v0.0.4-0.20210219231511-983054dbee36/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
+gitlab.com/xx_network/primitives v0.0.4-0.20210224190828-4e0728a36eb3 h1:Mhabfbm+F2obo1shlAG6xtxkeEoTvT3UaSa3+VBh08s=
+gitlab.com/xx_network/primitives v0.0.4-0.20210224190828-4e0728a36eb3/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE=
 gitlab.com/xx_network/ring v0.0.2 h1:TlPjlbFdhtJrwvRgIg4ScdngMTaynx/ByHBRZiXCoL0=
 gitlab.com/xx_network/ring v0.0.2/go.mod h1:aLzpP2TiZTQut/PVHR40EJAomzugDdHXetbieRClXIM=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
diff --git a/interfaces/networkManager.go b/interfaces/networkManager.go
index b7ff3a886346a0d23934b6ef359db4e872101415..29e9b0a51ae54b0e5b48b3ede489b07dd1d28007 100644
--- a/interfaces/networkManager.go
+++ b/interfaces/networkManager.go
@@ -24,7 +24,7 @@ type NetworkManager interface {
 	SendCMIX(message format.Message, recipient *id.ID, p params.CMIX) (id.Round, ephemeral.Id, error)
 	GetInstance() *network.Instance
 	GetHealthTracker() HealthTracker
-	Follow() (stoppable.Stoppable, error)
+	Follow(report ClientErrorReport) (stoppable.Stoppable, error)
 	CheckGarbledMessages()
 }
 
diff --git a/keyExchange/utils_test.go b/keyExchange/utils_test.go
index bda05f0b822888261f8f61f460840536dd9ddbc5..8ad9f13b7d8ab05ecc9d5c75a8f7c8078c01ed1e 100644
--- a/keyExchange/utils_test.go
+++ b/keyExchange/utils_test.go
@@ -57,7 +57,7 @@ func (t *testNetworkManagerGeneric) GetHealthTracker() interfaces.HealthTracker
 	return nil
 }
 
-func (t *testNetworkManagerGeneric) Follow() (stoppable.Stoppable, error) {
+func (t *testNetworkManagerGeneric) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
 	return nil, nil
 }
 
@@ -136,7 +136,7 @@ func (t *testNetworkManagerFullExchange) GetHealthTracker() interfaces.HealthTra
 	return nil
 }
 
-func (t *testNetworkManagerFullExchange) Follow() (stoppable.Stoppable, error) {
+func (t *testNetworkManagerFullExchange) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
 	return nil, nil
 }
 
diff --git a/network/ephemeral/testutil.go b/network/ephemeral/testutil.go
index 1691ae8bd450fd70cd03e0f8f8c00733c16ec828..ca4eaff034acf331e005dc5c002b6d9cd53d4d77 100644
--- a/network/ephemeral/testutil.go
+++ b/network/ephemeral/testutil.go
@@ -68,7 +68,7 @@ func (t *testNetworkManager) GetHealthTracker() interfaces.HealthTracker {
 	return nil
 }
 
-func (t *testNetworkManager) Follow() (stoppable.Stoppable, error) {
+func (t *testNetworkManager) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
 	return nil, nil
 }
 
diff --git a/network/follow.go b/network/follow.go
index 869dd5cdb21aee3f59125006f1feed9371132e5f..dd6a4e3942bc1084cf934f56ba4422bcb917b78c 100644
--- a/network/follow.go
+++ b/network/follow.go
@@ -24,7 +24,9 @@ package network
 
 import (
 	"bytes"
+	"fmt"
 	jww "github.com/spf13/jwalterweatherman"
+	"gitlab.com/elixxir/client/interfaces"
 	"gitlab.com/elixxir/client/network/gateway"
 	"gitlab.com/elixxir/client/network/rounds"
 	pb "gitlab.com/elixxir/comms/mixmessages"
@@ -37,7 +39,7 @@ import (
 	"time"
 )
 
-const debugTrackPeriod = 1*time.Minute
+const debugTrackPeriod = 1 * time.Minute
 
 //comms interface makes testing easier
 type followNetworkComms interface {
@@ -47,7 +49,7 @@ type followNetworkComms interface {
 
 // followNetwork polls the network to get updated on the state of nodes, the
 // round status, and informs the client when messages can be retrieved.
-func (m *manager) followNetwork(quitCh <-chan struct{}) {
+func (m *manager) followNetwork(report interfaces.ClientErrorReport, quitCh <-chan struct{}) {
 	ticker := time.NewTicker(m.param.TrackNetworkPeriod)
 	TrackTicker := time.NewTicker(debugTrackPeriod)
 	rng := m.Rng.GetStream()
@@ -59,8 +61,8 @@ func (m *manager) followNetwork(quitCh <-chan struct{}) {
 			rng.Close()
 			done = true
 		case <-ticker.C:
-			m.follow(rng, m.Comms)
-		case <- TrackTicker.C:
+			m.follow(report, rng, m.Comms)
+		case <-TrackTicker.C:
 			jww.INFO.Println(m.tracker.Report())
 			m.tracker = newPollTracker()
 		}
@@ -68,8 +70,7 @@ func (m *manager) followNetwork(quitCh <-chan struct{}) {
 }
 
 // executes each iteration of the follower
-func (m *manager) follow(rng csprng.Source, comms followNetworkComms) {
-
+func (m *manager) follow(report interfaces.ClientErrorReport, rng csprng.Source, comms followNetworkComms) {
 
 	//get the identity we will poll for
 	identity, err := m.Session.Reception().GetIdentity(rng)
@@ -97,6 +98,7 @@ func (m *manager) follow(rng csprng.Source, comms followNetworkComms) {
 		ReceptionID:    identity.EphId[:],
 		StartTimestamp: identity.StartRequest.UnixNano(),
 		EndTimestamp:   identity.EndRequest.UnixNano(),
+		ClientVersion:  []byte(m.clientVersion),
 	}
 	jww.TRACE.Printf("Executing poll for %v(%s) range: %s-%s(%s) from %s",
 		identity.EphId.Int64(), identity.Source, identity.StartRequest,
@@ -104,6 +106,11 @@ func (m *manager) follow(rng csprng.Source, comms followNetworkComms) {
 
 	pollResp, err := comms.SendPoll(gwHost, &pollReq)
 	if err != nil {
+		report(
+			"NetworkFollower",
+			fmt.Sprintf("Failed to poll network, \"%s\", Gateway: %s", err.Error(), gwHost.String()),
+			fmt.Sprintf("%+v", err),
+		)
 		jww.ERROR.Printf("Unable to poll %s for NDF: %+v", gwHost, err)
 		return
 	}
diff --git a/network/manager.go b/network/manager.go
index b2d43c8e6ab50465a1f66fc035b5330ad3eec450..ca62c9c5f82ee9b188b3130b507d9f8a60f53227 100644
--- a/network/manager.go
+++ b/network/manager.go
@@ -50,12 +50,14 @@ type manager struct {
 
 	//map of polls for debugging
 	tracker *pollTracker
+
+	clientVersion string
 }
 
 // NewManager builds a new reception manager object using inputted key fields
 func NewManager(session *storage.Session, switchboard *switchboard.Switchboard,
 	rng *fastRNG.StreamGenerator, comms *client.Comms,
-	params params.Network, ndf *ndf.NetworkDefinition) (interfaces.NetworkManager, error) {
+	params params.Network, ndf *ndf.NetworkDefinition, clientVersion string) (interfaces.NetworkManager, error) {
 
 	//start network instance
 	instance, err := network.NewInstance(comms.ProtoComms, ndf, nil, nil)
@@ -73,9 +75,10 @@ func NewManager(session *storage.Session, switchboard *switchboard.Switchboard,
 
 	//create manager object
 	m := manager{
-		param:   params,
-		running: &running,
-		tracker: newPollTracker(),
+		param:         params,
+		running:       &running,
+		tracker:       newPollTracker(),
+		clientVersion: clientVersion,
 	}
 
 	m.Internal = internal.Internal{
@@ -87,7 +90,7 @@ func NewManager(session *storage.Session, switchboard *switchboard.Switchboard,
 		NodeRegistration: make(chan network.NodeGateway, params.RegNodesBufferLen),
 		Instance:         instance,
 		TransmissionID:   session.User().GetCryptographicIdentity().GetTransmissionID(),
-		ReceptionID: 	  session.User().GetCryptographicIdentity().GetReceptionID(),
+		ReceptionID:      session.User().GetCryptographicIdentity().GetReceptionID(),
 	}
 
 	//create sub managers
@@ -107,7 +110,7 @@ func NewManager(session *storage.Session, switchboard *switchboard.Switchboard,
 //	 - Garbled Messages (/network/message/garbled.go)
 //	 - Critical Messages (/network/message/critical.go)
 //   - Ephemeral ID tracking (network/ephemeral/tracker.go)
-func (m *manager) Follow() (stoppable.Stoppable, error) {
+func (m *manager) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
 	if !atomic.CompareAndSwapUint32(m.running, 0, 1) {
 		return nil, errors.Errorf("network routines are already running")
 	}
@@ -129,7 +132,7 @@ func (m *manager) Follow() (stoppable.Stoppable, error) {
 
 	// Start the Network Tracker
 	trackNetworkStopper := stoppable.NewSingle("TrackNetwork")
-	go m.followNetwork(trackNetworkStopper.Quit())
+	go m.followNetwork(report, trackNetworkStopper.Quit())
 	multi.Add(trackNetworkStopper)
 
 	// Message reception
diff --git a/permissioning/remoteVersion.go b/permissioning/remoteVersion.go
index 95bf44fc5a1e840de3e68e1e9dc8bf569e9e3974..e1973c1d81ee96e6a861fd5ba863eac0f9a65da2 100644
--- a/permissioning/remoteVersion.go
+++ b/permissioning/remoteVersion.go
@@ -7,13 +7,7 @@
 
 package permissioning
 
-import (
-	"github.com/pkg/errors"
-	pb "gitlab.com/elixxir/comms/mixmessages"
-	"gitlab.com/elixxir/primitives/version"
-	"gitlab.com/xx_network/comms/connect"
-)
-
+/*
 // GetNetworkVersion contacts the permissioning server and returns the current
 // supported client version.
 // returns a bool which designates if the network is enforcing versioning
@@ -50,3 +44,4 @@ func getRemoteVersion(permissioningHost *connect.Host, comms getRemoteClientVers
 
 	return true, netVersion, nil
 }
+*/
diff --git a/permissioning/remoteVersion_test.go b/permissioning/remoteVersion_test.go
index 68c76466af94db46c191fc3195e98132dddc8da9..ed114a0350f97147abae88947faf000dbd3dbac2 100644
--- a/permissioning/remoteVersion_test.go
+++ b/permissioning/remoteVersion_test.go
@@ -8,13 +8,8 @@
 package permissioning
 
 import (
-	"github.com/pkg/errors"
 	pb "gitlab.com/elixxir/comms/mixmessages"
-	"gitlab.com/elixxir/primitives/version"
 	"gitlab.com/xx_network/comms/connect"
-	"gitlab.com/xx_network/primitives/id"
-	"reflect"
-	"testing"
 )
 
 type MockVersionSender struct {
@@ -32,6 +27,7 @@ func (s *MockVersionSender) SendGetCurrentClientVersionMessage(
 	return &pb.ClientVersion{Version: s.returnVersion}, s.returnErr
 }
 
+/*
 // Test happy path: get a version
 func TestPermissioning_GetNetworkVersion(t *testing.T) {
 	var sender MockVersionSender
@@ -109,3 +105,4 @@ func TestPermissioning_GetNetworkVersion_Errors(t *testing.T) {
 		t.Error("Should return an error indicating the version string was unparseable")
 	}
 }
+*/
diff --git a/single/manager_test.go b/single/manager_test.go
index 33427010d53d967a2a2dd52fb1971b661974e2d9..e5f1c20a2d8cb70b623a9d318c916515c3b9024a 100644
--- a/single/manager_test.go
+++ b/single/manager_test.go
@@ -312,7 +312,7 @@ func (tnm *testNetworkManager) GetHealthTracker() interfaces.HealthTracker {
 	return nil
 }
 
-func (tnm *testNetworkManager) Follow() (stoppable.Stoppable, error) {
+func (tnm *testNetworkManager) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
 	return nil, nil
 }