diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp
index 8f33d789ebde25871f9c480d229029507556fbd6..624be6082758a1e13922306f3dc1827052d289a6 100644
--- a/indra/llcommon/lluuid.cpp
+++ b/indra/llcommon/lluuid.cpp
@@ -912,7 +912,15 @@ BOOL LLUUID::parseUUID(const std::string& buf, LLUUID* value)
 }
 
 //static
-LLUUID LLUUID::generateNewID(std::string hash_string)
+LLUUID LLUUID::generateNewID()
+{
+	LLUUID new_id;
+	new_id.generate();
+	return new_id;
+}
+
+//static
+LLUUID LLUUID::generateNewID(const std::string& hash_string)
 {
 	LLUUID new_id;
 	if (hash_string.empty())
@@ -940,21 +948,10 @@ LLAssetID LLTransactionID::makeAssetID(const LLUUID& session) const
 	return result;
 }
 
-// Construct
-LLUUID::LLUUID()
-{
-	setNull();
-}
-
-
 // Faster than copying from memory
  void LLUUID::setNull()
 {
-	U32 *word = (U32 *)mData;
-	word[0] = 0;
-	word[1] = 0;
-	word[2] = 0;
-	word[3] = 0;
+	 memset(mData, 0, sizeof(mData));
 }
 
 
@@ -1009,36 +1006,6 @@ LLUUID::LLUUID()
 	return !(word[0] | word[1] | word[2] | word[3]);
 }
 
-// Copy constructor
- LLUUID::LLUUID(const LLUUID& rhs)
-{
-	U32 *tmp = (U32 *)mData;
-	U32 *rhstmp = (U32 *)rhs.mData;
-	tmp[0] = rhstmp[0];
-	tmp[1] = rhstmp[1];
-	tmp[2] = rhstmp[2];
-	tmp[3] = rhstmp[3];
-}
-
- LLUUID::~LLUUID()
-{
-}
-
-// Assignment
- LLUUID& LLUUID::operator=(const LLUUID& rhs)
-{
-	// No need to check the case where this==&rhs.  The branch is slower than the write.
-	U32 *tmp = (U32 *)mData;
-	U32 *rhstmp = (U32 *)rhs.mData;
-	tmp[0] = rhstmp[0];
-	tmp[1] = rhstmp[1];
-	tmp[2] = rhstmp[2];
-	tmp[3] = rhstmp[3];
-	
-	return *this;
-}
-
-
  LLUUID::LLUUID(const char *in_string)
 {
 	if (!in_string || in_string[0] == 0)
@@ -1107,6 +1074,10 @@ LLUUID::LLUUID()
 
  U32 LLUUID::getCRC32() const
 {
-	U32 *tmp = (U32*)mData;
-	return tmp[0] + tmp[1] + tmp[2] + tmp[3];
+	U32 ret = 0;
+	for(U32 i = 0;i < 4;++i)
+	{
+		ret += (mData[i*4]) | (mData[i*4+1]) << 8 | (mData[i*4+2]) << 16 | (mData[i*4+3]) << 24;
+	}
+	return ret;
 }
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index fe7482ba29f82c70598a1497da8e04f4fa1f5faa..46ff41b0dda1c57e23f496dfca03ec2298f7ee01 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -52,13 +52,9 @@ class LL_COMMON_API LLUUID
 	//
 	// CREATORS
 	//
-	LLUUID();
+	LLUUID() = default;
 	explicit LLUUID(const char *in_string); // Convert from string.
 	explicit LLUUID(const std::string& in_string); // Convert from string.
-	LLUUID(const LLUUID &in);
-	LLUUID &operator=(const LLUUID &rhs);
-
-	~LLUUID();
 
 	//
 	// MANIPULATORS
@@ -66,7 +62,9 @@ class LL_COMMON_API LLUUID
 	void	generate();					// Generate a new UUID
 	void	generate(const std::string& stream); //Generate a new UUID based on hash of input stream
 
-	static LLUUID generateNewID(std::string stream = "");	//static version of above for use in initializer expressions such as constructor params, etc. 
+	//static versions of above for use in initializer expressions such as constructor params, etc. 
+	static LLUUID generateNewID();	
+	static LLUUID generateNewID(const std::string& stream);	//static version of above for use in initializer expressions such as constructor params, etc. 
 
 	BOOL	set(const char *in_string, BOOL emit = TRUE);	// Convert from string, if emit is FALSE, do not emit warnings
 	BOOL	set(const std::string& in_string, BOOL emit = TRUE);	// Convert from string, if emit is FALSE, do not emit warnings
@@ -129,8 +127,11 @@ class LL_COMMON_API LLUUID
 
 	static BOOL parseUUID(const std::string& buf, LLUUID* value);
 
-	U8 mData[UUID_BYTES];
+	U8 mData[UUID_BYTES] = {};
 };
+static_assert(std::is_trivially_copyable<LLUUID>::value, "LLUUID must be trivial copy");
+static_assert(std::is_trivially_move_assignable<LLUUID>::value, "LLUUID must be trivial move");
+static_assert(std::is_standard_layout<LLUUID>::value, "LLUUID must be a standard layout type");
 
 typedef std::vector<LLUUID> uuid_vec_t;
 typedef std::set<LLUUID> uuid_set_t;