diff --git a/api/authenticatedChannel.go b/api/authenticatedChannel.go
index 01d486c577d8c50752f19e706511fd71455eaba7..a9125a0306b5f4bcbb0229320dd495c25bffb103 100644
--- a/api/authenticatedChannel.go
+++ b/api/authenticatedChannel.go
@@ -7,6 +7,7 @@ import (
 	"gitlab.com/elixxir/client/interfaces"
 	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/client/storage/e2e"
+	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/primitives/id"
 )
 
@@ -110,6 +111,6 @@ func (c *Client) MakePrecannedContact(precannedID uint) contact.Contact {
 		ID:             precanned.ID,
 		DhPubKey:       partnerPubKey,
 		OwnershipProof: nil,
-		Facts:          make([]contact.Fact, 0),
+		Facts:          make([]fact.Fact, 0),
 	}
 }
\ No newline at end of file
diff --git a/auth/callback.go b/auth/callback.go
index 51accb18d5c13e72ca010edc24c6085dccdfeb81..060d74030f73fdf7e91e23827635b3ec3e8dfcd0 100644
--- a/auth/callback.go
+++ b/auth/callback.go
@@ -11,6 +11,7 @@ import (
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/diffieHellman"
 	cAuth "gitlab.com/elixxir/crypto/e2e/auth"
+	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/elixxir/primitives/format"
 	"strings"
 )
@@ -148,7 +149,7 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 	}
 
 	//process the inner payload
-	facts, msg, err := contact.UnstringifyFactList(
+	facts, msg, err := fact.UnstringifyFactList(
 		string(requestFmt.msgPayload))
 	if err != nil {
 		jww.WARN.Printf("failed to parse facts and message "+
@@ -264,7 +265,7 @@ func (m *Manager) doConfirm(sr *auth.SentRequest, grp *cyclic.Group,
 		ID:             sr.GetPartner().DeepCopy(),
 		DhPubKey:       partnerPubKey.DeepCopy(),
 		OwnershipProof: copySlice(ownershipProof),
-		Facts:          make([]contact.Fact, 0),
+		Facts:          make([]fact.Fact, 0),
 	}
 
 	//  fixme: if a crash occurs before or during the calls, the notification
diff --git a/bindings/contact.go b/bindings/contact.go
index 012eada71c84fc1a196cfc95acb24268b6a2f8f9..2bcc1d2b9c627a27ef0f091709fb4d458efe669e 100644
--- a/bindings/contact.go
+++ b/bindings/contact.go
@@ -3,11 +3,12 @@ package bindings
 import (
 	"errors"
 	"gitlab.com/elixxir/client/interfaces/contact"
+	"gitlab.com/elixxir/primitives/fact"
 )
 
 /* fact object*/
 type Fact struct {
-	f *contact.Fact
+	f *fact.Fact
 }
 
 func (f *Fact) Get() string {
@@ -61,13 +62,13 @@ func (fl *FactList) Get(i int) Fact {
 	return Fact{f: &(fl.c.Facts)[i]}
 }
 
-func (fl *FactList) Add(fact string, factType int) error {
-	ft := contact.FactType(factType)
+func (fl *FactList) Add(factData string, factType int) error {
+	ft := fact.FactType(factType)
 	if !ft.IsValid() {
 		return errors.New("Invalid fact type")
 	}
-	fl.c.Facts = append(fl.c.Facts, contact.Fact{
-		Fact: fact,
+	fl.c.Facts = append(fl.c.Facts, fact.Fact{
+		Fact: factData,
 		T:    ft,
 	})
 	return nil
diff --git a/go.mod b/go.mod
index e568acb2aa98d29c9cfe64494320f51de70846a2..c97e36887f34ed6fd43db83f4b7e813950d3379c 100644
--- a/go.mod
+++ b/go.mod
@@ -20,7 +20,7 @@ require (
 	gitlab.com/elixxir/comms v0.0.3
 	gitlab.com/elixxir/crypto v0.0.5-0.20201109234712-7e64de16970d
 	gitlab.com/elixxir/ekv v0.1.3
-	gitlab.com/elixxir/primitives v0.0.2
+	gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704
 	gitlab.com/xx_network/comms v0.0.3
 	gitlab.com/xx_network/crypto v0.0.4
 	gitlab.com/xx_network/primitives v0.0.2
diff --git a/go.sum b/go.sum
index ded0b95c33a9a461b26be11a48a649254529190b..a817df8c804ff30ae056fbb492edc23459d3d84c 100644
--- a/go.sum
+++ b/go.sum
@@ -258,10 +258,6 @@ 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.4 h1:8eWjvUepCU2PiqZM2NFYo6rFg1w8KWO1hMDwMNFEqoI=
 gitlab.com/elixxir/crypto v0.0.4/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
-gitlab.com/elixxir/crypto v0.0.5-0.20201109195944-c4a4090b258a h1:SnZm8bO8Cw4j7FDGqzt4kfP58peuNE3z1Q3NqifXwns=
-gitlab.com/elixxir/crypto v0.0.5-0.20201109195944-c4a4090b258a/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
-gitlab.com/elixxir/crypto v0.0.5-0.20201109203841-ba162a25be6e h1:rkT8Pzjgo9oF3uS8ExHGNUQoJX/22qK3lU+vU8QsOCY=
-gitlab.com/elixxir/crypto v0.0.5-0.20201109203841-ba162a25be6e/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
 gitlab.com/elixxir/crypto v0.0.5-0.20201109234712-7e64de16970d h1:9Peb/peftTVeO5gYqi37sZycMEiu05+2VZ/j8d5lldI=
 gitlab.com/elixxir/crypto v0.0.5-0.20201109234712-7e64de16970d/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
 gitlab.com/elixxir/ekv v0.1.3 h1:OE+LBMIhjGUMwc6hHJzYvEPNJQV7t1vMnJyIgxUMUo8=
@@ -273,6 +269,8 @@ gitlab.com/elixxir/primitives v0.0.1 h1:q61anawANlNAExfkeQEE1NCsNih6vNV1FFLoUQX6
 gitlab.com/elixxir/primitives v0.0.1/go.mod h1:kNp47yPqja2lHSiS4DddTvFpB/4D9dB2YKnw5c+LJCE=
 gitlab.com/elixxir/primitives v0.0.2 h1:PvyOOp/A6tCtmU7YnGhCCPRdmEogEzCi0Li/WfiVjGo=
 gitlab.com/elixxir/primitives v0.0.2/go.mod h1:3fxFHSlQhkV4vs+S0dZEz3Om3m+40WX8L806yvSnNFc=
+gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704 h1:JkFREumz8skDqkCjjzZnlf5tg+PBiMB9kfVn9z0VEfE=
+gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704/go.mod h1:3fxFHSlQhkV4vs+S0dZEz3Om3m+40WX8L806yvSnNFc=
 gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw=
 gitlab.com/xx_network/comms v0.0.3 h1:ch1eJI4WXUE/Kz0Kp9uDWX16B+hfVFmdHY+EOai4Wzc=
 gitlab.com/xx_network/comms v0.0.3/go.mod h1:YViGbRj7FjJYoaO4NpALGEd9dK/l8uUT000FEBbUTL8=
diff --git a/interfaces/contact/contact.go b/interfaces/contact/contact.go
index 2579f7a0501c1e6633c81fe2a8f147b6ab73b024..6c6e070d055a093c71f796cf284ffc5558c71e17 100644
--- a/interfaces/contact/contact.go
+++ b/interfaces/contact/contact.go
@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"github.com/pkg/errors"
 	"gitlab.com/elixxir/crypto/cyclic"
+	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/primitives/id"
 )
 
@@ -18,7 +19,7 @@ type Contact struct {
 	ID             *id.ID
 	DhPubKey       *cyclic.Int
 	OwnershipProof []byte
-	Facts          FactList
+	Facts          fact.FactList
 }
 
 func (c Contact) Marshal() ([]byte, error) {
diff --git a/interfaces/contact/fact.go b/interfaces/contact/fact.go
deleted file mode 100644
index bc838160dc33f6952d9b21ab6de8af2fb5c03cad..0000000000000000000000000000000000000000
--- a/interfaces/contact/fact.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package contact
-
-type Fact struct {
-	Fact string
-	T    FactType
-}
-
-func NewFact(ft FactType, fact string) (Fact, error) {
-	//todo: filter the fact string
-	return Fact{
-		Fact: fact,
-		T:    ft,
-	}, nil
-}
-
-// marshal is for transmission for UDB, not a part of the fact interface
-func (f Fact) Stringify() string {
-	return f.T.Stringify() + f.Fact
-}
-
-func UnstringifyFact(s string) (Fact, error) {
-	ft, err := UnstringifyFactType(s)
-	if err != nil {
-		return Fact{}, err
-	}
-
-	return NewFact(ft, s)
-}
diff --git a/interfaces/contact/factList.go b/interfaces/contact/factList.go
deleted file mode 100644
index 8d925669b181b0795155bbc61fc2d0ed70e458db..0000000000000000000000000000000000000000
--- a/interfaces/contact/factList.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package contact
-
-import (
-	"github.com/pkg/errors"
-	jww "github.com/spf13/jwalterweatherman"
-	"strings"
-)
-
-type FactList []Fact
-
-func (fl FactList) Stringify() string {
-	stringList := make([]string, len(fl))
-	for index, f := range fl {
-		stringList[index] = f.Stringify()
-	}
-
-	return strings.Join(stringList, factDelimiter) + factBreak
-}
-
-// unstrignifys facts followed by a facts break and with arbatrary data
-// atttached at the end
-func UnstringifyFactList(s string) ([]Fact, string, error) {
-	parts := strings.SplitN(s, factBreak, 2)
-	if len(parts) != 2 {
-		return nil, "", errors.New("Invalid fact string passed")
-	}
-	factStrings := strings.Split(parts[0], factDelimiter)
-
-	var factList []Fact
-	for _, fString := range factStrings {
-		fact, err := UnstringifyFact(fString)
-		if err != nil {
-			jww.WARN.Printf("Fact failed to unstringify, dropped: %s",
-				err)
-		} else {
-			factList = append(factList, fact)
-		}
-
-	}
-	return factList, parts[1], nil
-}
diff --git a/interfaces/contact/type.go b/interfaces/contact/type.go
deleted file mode 100644
index cc7263d5ffd0b4cc7714c3b18ecce674c8b31996..0000000000000000000000000000000000000000
--- a/interfaces/contact/type.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package contact
-
-import (
-	"fmt"
-	"github.com/pkg/errors"
-	jww "github.com/spf13/jwalterweatherman"
-)
-
-type FactType uint8
-
-const (
-	Username FactType = 0
-	Email    FactType = 1
-	Phone    FactType = 2
-)
-
-func (t FactType) String() string {
-	switch t {
-	case Username:
-		return "Username"
-	case Email:
-		return "Email"
-	case Phone:
-		return "Phone"
-	default:
-		return fmt.Sprintf("Unknown Fact FactType: %d", t)
-	}
-}
-
-func (t FactType) Stringify() string {
-	switch t {
-	case Username:
-		return "U"
-	case Email:
-		return "E"
-	case Phone:
-		return "P"
-	}
-	jww.FATAL.Panicf("Unknown Fact FactType: %d", t)
-	return "error"
-}
-
-func UnstringifyFactType(s string) (FactType, error) {
-	switch s {
-	case "U":
-		return Username, nil
-	case "E":
-		return Email, nil
-	case "P":
-		return Phone, nil
-	}
-	return 3, errors.Errorf("Unknown Fact FactType: %s", s)
-}
-
-func (t FactType) IsValid() bool {
-	return t == Username || t == Email || t == Phone
-}
diff --git a/interfaces/user/user.go b/interfaces/user/user.go
index 6973ca429abaf7ca93e553296fca833ccd1c10c7..094f9386abcd5298ce9cb09da1ea8f378783d3f9 100644
--- a/interfaces/user/user.go
+++ b/interfaces/user/user.go
@@ -3,6 +3,7 @@ package user
 import (
 	"gitlab.com/elixxir/client/interfaces/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
+	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/crypto/signature/rsa"
 	"gitlab.com/xx_network/primitives/id"
 )
@@ -27,6 +28,6 @@ func (u User) GetContact() contact.Contact {
 	return contact.Contact{
 		ID:       u.ID.DeepCopy(),
 		DhPubKey: u.E2eDhPublicKey,
-		Facts:    make([]contact.Fact, 0),
+		Facts:    make([]fact.Fact, 0),
 	}
 }