diff --git a/src/UsefulBuf.c b/src/UsefulBuf.c
index b64c0b5..c8e5d28 100644
--- a/src/UsefulBuf.c
+++ b/src/UsefulBuf.c
@@ -100,13 +100,14 @@
  */
 UsefulBufC UsefulBuf_CopyOffset(UsefulBuf Dest, size_t uOffset, const UsefulBufC Src)
 {
-    if(Src.len > Dest.len - uOffset) {
-        return NULLUsefulBufC;
-    }
+   // Do this with subtraction so it doesn't give erroneous result if uOffset + Src.len overflows
+   if(uOffset > Dest.len || Src.len > Dest.len - uOffset) { // uOffset + Src.len > Dest.len
+      return NULLUsefulBufC;
+   }
     
-    memcpy(Dest.ptr + uOffset, Src.ptr, Src.len);
+   memcpy(Dest.ptr + uOffset, Src.ptr, Src.len);
     
-    return((UsefulBufC){Dest.ptr, Src.len});
+   return((UsefulBufC){Dest.ptr, Src.len + uOffset});
 }
 
 
diff --git a/test/UsefulBuf_Tests.c b/test/UsefulBuf_Tests.c
index 05d04a2..f79c08c 100644
--- a/test/UsefulBuf_Tests.c
+++ b/test/UsefulBuf_Tests.c
@@ -64,7 +64,7 @@
  
    There is nothing adversarial in this test
  */
-const char * NonAdversarialUOBTest()
+const char * UOBTest_NonAdversarial()
 {
    const char *szReturn = NULL;
 
@@ -146,8 +146,6 @@
    
    // append the bytes
    UsefulOutBuf_AppendData(pUOB, (const uint8_t *)"bluster", num);
-      
-   // TODO: test UsefulOutBuf_AppendString
    
    // check error status after
    if(UsefulOutBuf_GetError(pUOB) != expected)
@@ -171,8 +169,6 @@
    
    UsefulOutBuf_InsertData(pUOB, (const uint8_t *)"bluster", num, pos);
    
-   // TODO: test UsefulOutBuf_InsertString
-   
    if(UsefulOutBuf_GetError(pUOB) != expected)
       return 1;
    
@@ -191,7 +187,7 @@
  
  */
 
-const char *BoundaryConditionsTest()
+const char *UOBTest_BoundaryConditionsTest()
 {
    UsefulBuf_MakeStackUB(outbuf,2);
    
@@ -238,9 +234,9 @@
    
    UsefulOutBuf_Reset(&UOB);
    // put data in the buffer
-   UsefulOutBuf_AppendData(&UOB, "abc123", 6);
+   UsefulOutBuf_AppendString(&UOB, "abc123");
    
-   UsefulOutBuf_InsertData(&UOB, "xyz*&^", 6, 0);
+   UsefulOutBuf_InsertString(&UOB, "xyz*&^", 0);
    
    if(!UsefulOutBuf_GetError(&UOB)) {
       return "insert with data should have failed";
@@ -286,7 +282,14 @@
    if(UsefulOutBuf_RoomLeft(&UOB) != 10)
       return "room left failed";
    
-   // TODO: test UsefulOutBuf_WillItFit
+   if(!UsefulOutBuf_WillItFit(&UOB, 9)) {
+      return "it did not fit";
+   }
+
+   if(UsefulOutBuf_WillItFit(&UOB, 11)) {
+      return "it should have not fit";
+   }
+   
    
    // Next -- make sure that the magic number checking is working right
    UOB.magic = 8888; // make magic bogus
@@ -399,14 +402,34 @@
       return "Copy should have failed";
    }
    
-   // TODO: complete this test
-   // UsefulBuf_CopyOffset();
-   // TODO: complete this test
-   // UsefulBuf_CopyPtr();
-   // TODO: complete this test
-   // UsefulBuf_Head();
-   // TODO: complete this test
-   // UsefulBuf_CopyPtr();
+   if(UsefulBuf_IsNULLC(UsefulBuf_CopyPtr(Temp2, "xx", 2))) {
+      return "CopyPtr failed";
+   }
+   
+   UsefulBufC xxyy = UsefulBuf_CopyOffset(Temp2, 2, UsefulBuf_FromSZLiteral("yy"));
+   if(UsefulBuf_IsNULLC(xxyy)) {
+      return "CopyOffset Failed";
+   }
+   
+   if(UsefulBuf_Compare(UsefulBuf_Head(xxyy, 3), UsefulBuf_FromSZLiteral("xxy"))) {
+      return "head failed";
+   }
+
+   if(UsefulBuf_Compare(UsefulBuf_Tail(xxyy, 1), UsefulBuf_FromSZLiteral("xyy"))) {
+      return "tail failed";
+   }
+   
+   if(!UsefulBuf_IsNULLC(UsefulBuf_Head(xxyy, 5))) {
+      return "head should have failed";
+   }
+
+   if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(xxyy, 5))) {
+      return "tail should have failed";
+   }
+   
+   if(!UsefulBuf_IsNULLC(UsefulBuf_CopyOffset(Temp2, 100, UsefulBuf_FromSZLiteral("yy")))) {
+      return "Copy Offset should have failed";
+   }
    
    // Try to copy into a NULL/empty buf and see failure
    UsefulBuf UBNull = NULLUsefulBuf;
@@ -414,6 +437,7 @@
       return "Copy to NULL should have failed";
    }
    
+   
    // Try to set a NULL/empty buf; nothing should happen
    UsefulBuf_Set(&UBNull, '+'); // This will crash on failure
    
@@ -561,7 +585,7 @@
 }
 
 
-const char *  UBIntegerFormatTests()
+const char *  UIBTest_IntegerFormat()
 {
    UsefulOutBuf_MakeOnStack(UOB,100);
    
@@ -616,19 +640,56 @@
    if(UsefulInputBuf_GetDouble(&UIB) != d) {
       return "double out then in failed";
    }
-   
-   // TODO: test UsefulInputBuf_Seek
-   // TODO: test UsefulInputBuf_BytesUnconsumed
-   // TODO: test UsefulInputBuf_BytesAvailable
-   // TODO: test UsefulInputBuf_GetBytes
-   // TODO: test UsefulInputBuf_GetUsefulBuf
-   // TODO: test UsefulInputBuf_GetError
 
+   // Reset and go again for a few more tests
+   UsefulInputBuf_Init(&UIB, O);
+   
+   UsefulBufC Four = UsefulInputBuf_GetUsefulBuf(&UIB, 4);
+   if(UsefulBuf_IsNULLC(Four)) {
+      return "Four is NULL";
+   }
+   if(UsefulBuf_Compare(Four, UsefulBuf_FromByteArrayLiteral(pExpectedNetworkOrder))) {
+      return "Four compare failed";
+   }
+   
+   if(UsefulInputBuf_BytesUnconsumed(&UIB) != 23){
+      return "Wrong number of unconsumed bytes";
+   }
+
+   if(!UsefulInputBuf_BytesAvailable(&UIB, 23)){
+      return "Wrong number of bytes available I";
+   }
+
+   if(UsefulInputBuf_BytesAvailable(&UIB, 24)){
+      return "Wrong number of bytes available II";
+   }
+   
+   UsefulInputBuf_Seek(&UIB, 0);
+   
+   if(UsefulInputBuf_GetError(&UIB)) {
+      return "unexpected error after seek";
+   }
+   
+   const uint8_t *pGetBytes = (const uint8_t *)UsefulInputBuf_GetBytes(&UIB, 4);
+   if(pGetBytes == NULL) {
+      return "GetBytes returns NULL";
+   }
+   
+   if(memcmp(pGetBytes, pExpectedNetworkOrder, 4)) {
+      return "Got wrong bytes";
+   }
+   
+   UsefulInputBuf_Seek(&UIB, 28);
+
+   if(!UsefulInputBuf_GetError(&UIB)) {
+      return "expected error after seek";
+   }
+   
    return NULL;
 }
 
 
-const char *UBCopyUtilTest()
+const char *UBUTest_CopyUtil()
 {
    if(UsefulBufUtil_CopyFloatToUint32(65536.0F) != 0x47800000) {
       return "CopyFloatToUint32 failed";
diff --git a/test/UsefulBuf_Tests.h b/test/UsefulBuf_Tests.h
index 7b0eab1..6de859f 100644
--- a/test/UsefulBuf_Tests.h
+++ b/test/UsefulBuf_Tests.h
@@ -56,18 +56,18 @@
 #ifndef UsefulBuf_UsefulBuf_Tests_h
 #define UsefulBuf_UsefulBuf_Tests_h
 
-const char * NonAdversarialUOBTest(void);
+const char * UOBTest_NonAdversarial(void);
 
 const char *  TestBasicSanity(void);
 
-const char *  BoundaryConditionsTest(void);
+const char *  UOBTest_BoundaryConditionsTest(void);
 
 const char *  UBMacroConversionsTest(void);
 
 const char *  UBUtilTests(void);
 
-const char *  UBIntegerFormatTests(void);
+const char *  UIBTest_IntegerFormat(void);
 
-const char *  UBCopyUtilTest(void);
+const char *  UBUTest_CopyUtil(void);
 
 #endif
diff --git a/test/run_tests.c b/test/run_tests.c
index c86baa5..ae184d8 100644
--- a/test/run_tests.c
+++ b/test/run_tests.c
@@ -104,13 +104,13 @@
 } test_entry2;
 
 test_entry2 s_tests2[] = {
-    TEST_ENTRY(UBCopyUtilTest),
-    TEST_ENTRY(NonAdversarialUOBTest),
+    TEST_ENTRY(UBUTest_CopyUtil),
+    TEST_ENTRY(UOBTest_NonAdversarial),
     TEST_ENTRY(TestBasicSanity),
-    TEST_ENTRY(BoundaryConditionsTest),
+    TEST_ENTRY(UOBTest_BoundaryConditionsTest),
     TEST_ENTRY(UBMacroConversionsTest),
     TEST_ENTRY(UBUtilTests),
-    TEST_ENTRY(UBIntegerFormatTests)
+    TEST_ENTRY(UIBTest_IntegerFormat)
 };
 
 
