diff --git a/cmd/ud.go b/cmd/ud.go
index 9f8d84835d37b16dd14c8d09c09e17ba54f97b3d..44d159684a40756dcc724c88b1a17b94c7ed9b65 100644
--- a/cmd/ud.go
+++ b/cmd/ud.go
@@ -78,21 +78,21 @@ var udCmd = &cobra.Command{
 		waitUntilConnected(connected)
 
 		// Make user discovery manager
-		stream := client.GetRng().GetStream()
-		defer stream.Close()
+		rng := client.GetRng()
 		userToRegister := viper.GetString("register")
 		userDiscoveryMgr, err := ud.NewManager(client.GetCmix(),
 			client.GetE2E(), client.NetworkFollowerStatus,
 			client.GetEventReporter(),
 			client.GetComms(), client.GetStorage(),
-			stream,
+			rng,
 			userToRegister, client.GetStorage().GetKV())
 		if err != nil {
 			if strings.Contains(err.Error(), ud.IsRegisteredErr) {
 				userDiscoveryMgr, err = ud.LoadManager(client.GetCmix(),
 					client.GetE2E(), client.GetEventReporter(),
 					client.GetComms(),
-					client.GetStorage(), client.GetStorage().GetKV())
+					client.GetStorage(), client.GetRng(),
+					client.GetStorage().GetKV())
 				if err != nil {
 					jww.FATAL.Panicf("Failed to load UD manager: %+v", err)
 				}
@@ -163,12 +163,15 @@ var udCmd = &cobra.Command{
 				}
 				printContact(newContact)
 			}
+
+			stream := rng.GetStream()
 			_, _, err = ud.Lookup(client.GetCmix(),
 				stream, client.GetE2E().GetGroup(),
 				udContact, cb, lookupID, single.GetDefaultRequestParams())
 			if err != nil {
 				jww.WARN.Printf("Failed UD lookup: %+v", err)
 			}
+			stream.Close()
 
 			time.Sleep(31 * time.Second)
 		}
@@ -256,6 +259,8 @@ var udCmd = &cobra.Command{
 			}
 		}
 
+		stream := rng.GetStream()
+		defer stream.Close()
 		_, _, err = ud.Search(client.GetCmix(),
 			client.GetEventReporter(),
 			stream, client.GetE2E().GetGroup(),
diff --git a/ud/addFact.go b/ud/addFact.go
index 6412e94b308871e9aa7266b2176e39cb8f169376..3c2b0af5428d71c57fd5f80cc3a0b5657bc9cccc 100644
--- a/ud/addFact.go
+++ b/ud/addFact.go
@@ -1,7 +1,6 @@
 package ud
 
 import (
-	"crypto/rand"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	pb "gitlab.com/elixxir/comms/mixmessages"
@@ -47,7 +46,9 @@ func (m *Manager) addFact(inFact fact.Fact, myId *id.ID,
 
 	// Sign our inFact for putting into the request
 	privKey := m.user.PortableUserInfo().ReceptionRSA
-	fSig, err := rsa.Sign(rand.Reader, privKey, hash.CMixHash, fHash, nil)
+	stream := m.rng.GetStream()
+	defer stream.Close()
+	fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil)
 	if err != nil {
 		return "", err
 	}
diff --git a/ud/manager.go b/ud/manager.go
index 1ce22eac8d6c24812c381fdc60753e07ba5e5e66..77dbc01f44def0d37e0d84ff208fb8cffe39befe 100644
--- a/ud/manager.go
+++ b/ud/manager.go
@@ -2,6 +2,7 @@ package ud
 
 import (
 	"fmt"
+	"gitlab.com/elixxir/crypto/fastRNG"
 	"sync"
 	"time"
 
@@ -14,7 +15,6 @@ import (
 	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/comms/connect"
-	"gitlab.com/xx_network/crypto/csprng"
 	"gitlab.com/xx_network/primitives/id"
 )
 
@@ -65,6 +65,10 @@ type Manager struct {
 	// alternativeUd is an alternate User discovery service to circumvent
 	// production. This is for testing with a separately deployed UD service.
 	alternativeUd *alternateUd
+
+	// rng is a fastRNG.StreamGenerator which is used to generate random
+	// data. This is used for signatures for adding/removing facts.
+	rng *fastRNG.StreamGenerator
 }
 
 // NewManager builds a new user discovery manager.
@@ -73,7 +77,7 @@ type Manager struct {
 func NewManager(services CMix, e2e E2E,
 	follower NetworkStatus,
 	events event.Reporter, comms Comms, userStore UserInfo,
-	rng csprng.Source, username string,
+	rng *fastRNG.StreamGenerator, username string,
 	kv *versioned.KV) (*Manager, error) {
 	jww.INFO.Println("ud.NewManager()")
 
@@ -90,6 +94,7 @@ func NewManager(services CMix, e2e E2E,
 		comms:   comms,
 		user:    userStore,
 		kv:      kv,
+		rng:     rng,
 	}
 
 	if m.isRegistered() {
@@ -111,7 +116,9 @@ func NewManager(services CMix, e2e E2E,
 	}
 
 	// Register with user discovery
-	err = m.register(username, rng, comms, udHost)
+	stream := rng.GetStream()
+	defer stream.Close()
+	err = m.register(username, stream, comms, udHost)
 	if err != nil {
 		return nil, errors.Errorf("Failed to register: %v", err)
 	}
@@ -132,6 +139,7 @@ func NewManager(services CMix, e2e E2E,
 func NewManagerFromBackup(services CMix,
 	e2e E2E, follower NetworkStatus,
 	events event.Reporter, comms Comms, userStore UserInfo,
+	rng *fastRNG.StreamGenerator,
 	email, phone fact.Fact, kv *versioned.KV) (*Manager, error) {
 	jww.INFO.Println("ud.NewManagerFromBackup()")
 	if follower() != xxdk.Running {
@@ -148,6 +156,7 @@ func NewManagerFromBackup(services CMix,
 		comms:   comms,
 		user:    userStore,
 		kv:      kv,
+		rng:     rng,
 	}
 
 	// Initialize our store
@@ -212,6 +221,7 @@ func InitStoreFromBackup(kv *versioned.KV,
 // instantiation of the manager by NewUserDiscovery.
 func LoadManager(services CMix, e2e E2E,
 	events event.Reporter, comms Comms, userStore UserInfo,
+	rng *fastRNG.StreamGenerator,
 	kv *versioned.KV) (*Manager, error) {
 
 	m := &Manager{
@@ -220,8 +230,8 @@ func LoadManager(services CMix, e2e E2E,
 		events:  events,
 		comms:   comms,
 		user:    userStore,
-
-		kv: kv,
+		rng:     rng,
+		kv:      kv,
 	}
 
 	if !m.isRegistered() {
diff --git a/ud/remove.go b/ud/remove.go
index 61d130ec240ad1bda693af3c39c9660f7858f597..b64a218e6d54f120de999478ef8b9fd5fb10dd0c 100644
--- a/ud/remove.go
+++ b/ud/remove.go
@@ -1,7 +1,6 @@
 package ud
 
 import (
-	"crypto/rand"
 	"fmt"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
@@ -47,7 +46,9 @@ func (m *Manager) removeFact(f fact.Fact,
 
 	// Sign our inFact for putting into the request
 	privKey := m.user.PortableUserInfo().ReceptionRSA
-	fSig, err := rsa.Sign(rand.Reader, privKey, hash.CMixHash, fHash, nil)
+	stream := m.rng.GetStream()
+	defer stream.Close()
+	fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil)
 	if err != nil {
 		return err
 	}
@@ -103,7 +104,9 @@ func (m *Manager) permanentDeleteAccount(f fact.Fact, myId *id.ID, privateKey *r
 	fHash := factID.Fingerprint(f)
 
 	// Sign our inFact for putting into the request
-	fsig, err := rsa.Sign(rand.Reader, privateKey, hash.CMixHash, fHash, nil)
+	stream := m.rng.GetStream()
+	defer stream.Close()
+	fsig, err := rsa.Sign(stream, privateKey, hash.CMixHash, fHash, nil)
 	if err != nil {
 		return err
 	}
diff --git a/ud/utils_test.go b/ud/utils_test.go
index 640c62ec048b356c66319a15e3e08f3ae187ff61..5124db19cd73f3b153afde487c4649a2276780ff 100644
--- a/ud/utils_test.go
+++ b/ud/utils_test.go
@@ -24,6 +24,7 @@ import (
 	"gitlab.com/elixxir/comms/testkeys"
 	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
+	"gitlab.com/elixxir/crypto/fastRNG"
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/elixxir/primitives/format"
 	"gitlab.com/xx_network/comms/messages"
@@ -69,6 +70,8 @@ func newTestManager(t *testing.T) (*Manager, *testNetworkManager) {
 		t.Fatalf("Failed to initialize store %v", err)
 	}
 
+	rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)
+
 	// Create our Manager object
 	m := &Manager{
 		e2e:    mockE2e{grp: getGroup()},
@@ -76,6 +79,7 @@ func newTestManager(t *testing.T) (*Manager, *testNetworkManager) {
 		user:   mockUser{testing: t, key: key},
 		store:  udStore,
 		comms:  &mockComms{},
+		rng:    rngGen,
 		kv:     kv,
 	}
 	tnm := newTestNetworkManager(t)