diff --git a/mongo/collection.go b/mongo/collection.go
index 223e6ebd91137fa7a9b98ab1782f96668c73b651..99e3b711ae3b7481d88082e922a6baaa12c4a46d 100644
--- a/mongo/collection.go
+++ b/mongo/collection.go
@@ -240,9 +240,11 @@ func (col *Collection) Append(item interface{}) (interface{}, error) {
 	}
 
 	// And other interfaces?
-	if setter, ok := item.(ObjectIdIDSetter); ok {
-		if err := setter.SetID(id); err != nil {
-			return nil, err
+	if _, ok := id.(bson.ObjectId); ok {
+		if setter, ok := item.(ObjectIdIDSetter); ok {
+			if err := setter.SetID(id.(bson.ObjectId)); err != nil {
+				return nil, err
+			}
 		}
 	}
 
@@ -260,7 +262,7 @@ func (col *Collection) Exists() bool {
 }
 
 // Fetches object _id or generates a new one if object doesn't have one or the one it has is invalid
-func getID(item interface{}) bson.ObjectId {
+func getID(item interface{}) interface{} {
 	v := reflect.ValueOf(item)
 
 	switch v.Kind() {
@@ -312,6 +314,8 @@ func getID(item interface{}) bson.ObjectId {
 				if bsonID.Valid() {
 					return bsonID
 				}
+			} else {
+				return v.FieldByName(fieldName).Interface()
 			}
 		}
 	}
diff --git a/mongo/database.go b/mongo/database.go
index 705f727eafd847eceeabfd61c8f11fb50aae800f..7a0a0acca746f7f1630e87fb80139ec4f5657fa1 100644
--- a/mongo/database.go
+++ b/mongo/database.go
@@ -249,6 +249,11 @@ func (s *Source) versionAtLeast(version ...int) bool {
 		s.version = buildInfo.VersionArray
 	}
 
+	// Check major version first
+	if s.version[0] > version[0] {
+		return true
+	}
+
 	for i := range version {
 		if i == len(s.version) {
 			return false