diff --git a/src/base/SConscript b/src/base/SConscript
index ba17f67..0c7558d 100644
--- a/src/base/SConscript
+++ b/src/base/SConscript
@@ -91,6 +91,7 @@
 GTest('circlebuf.test', 'circlebuf.test.cc')
 GTest('circular_queue.test', 'circular_queue.test.cc')
 GTest('sat_counter.test', 'sat_counter.test.cc')
+GTest('refcnt.test','refcnt.test.cc')
 
 DebugFlag('Annotate', "State machine annotation debugging")
 DebugFlag('AnnotateQ', "State machine annotation queue debugging")
diff --git a/src/base/refcnt.test.cc b/src/base/refcnt.test.cc
new file mode 100644
index 0000000..a4ff0b5
--- /dev/null
+++ b/src/base/refcnt.test.cc
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2019 The Regents of The University of California
+ * All rights resvered.
+ *
+ * Copyright (c) 2010 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ *          Bobby R. Bruce
+ */
+
+#include <gtest/gtest.h>
+
+#include <list>
+
+#include "base/refcnt.hh"
+
+using namespace std;
+
+namespace {
+
+class TestRC;
+typedef list<TestRC *> LiveList;
+LiveList liveList;
+
+int
+liveListSize(){
+    return liveList.size();
+}
+
+class TestRC : public RefCounted
+{
+  protected:
+    LiveList::iterator liveIt;
+
+  public:
+    TestRC()
+    {
+        liveList.push_front(this);
+        liveIt = liveList.begin();
+    }
+
+    ~TestRC()
+    {
+        liveList.erase(liveIt);
+    }
+
+    int testVal;
+};
+typedef RefCountingPtr<TestRC> Ptr;
+
+} // anonymous namespace
+
+TEST(RefcntTest, NullPointerCheck)
+{
+    // Create an empty Ptr and verify it's data pointer is NULL.
+    Ptr nullCheck;
+    EXPECT_EQ(NULL, nullCheck.get());
+    EXPECT_EQ(0, liveListSize());
+}
+
+TEST(RefcntTest, ConstructionFromPointer)
+{
+    // Construct a Ptr from a TestRC pointer.
+    Ptr constFromPointer = new TestRC();
+    EXPECT_EQ(1, liveListSize());
+}
+
+TEST(RefcntTest, ConstructionFromExistingPointer)
+{
+    // Construct a Ptr from an existing Ptr.
+    Ptr constFromPointer1 = new TestRC();
+    Ptr constFromPointer2 = constFromPointer1;
+
+    EXPECT_EQ(1, liveListSize());
+}
+
+TEST(RefcntTest, DestroyPointer)
+{
+    // Test a Ptr being destroyed.
+    Ptr *ptrPtr = new Ptr(new TestRC());
+    EXPECT_EQ(1, liveListSize());
+    delete ptrPtr;
+    EXPECT_EQ(0, liveListSize());
+}
+
+TEST(RefcntTest, AssignmentFromAPointerFromAPointer)
+{
+    // Test assignment from a pointer and from a Ptr.
+    Ptr assignmentTarget;
+    TestRC *assignmentSourcePointer = new TestRC();
+    EXPECT_EQ(liveListSize(), 1);
+    assignmentTarget = assignmentSourcePointer;
+    EXPECT_EQ(liveListSize(), 1);
+    assignmentTarget = NULL;
+    EXPECT_EQ(liveListSize(), 0);
+    Ptr assignmentSourcePtr(new TestRC());
+    EXPECT_EQ(liveListSize(), 1);
+    assignmentTarget = assignmentSourcePtr;
+    EXPECT_EQ(liveListSize(), 1);
+    assignmentSourcePtr = NULL;
+    EXPECT_EQ(liveListSize(), 1);
+    assignmentTarget = NULL;
+    EXPECT_EQ(liveListSize(), 0);
+}
+
+TEST(RefcntTest, AccessToClassPointers)
+{
+    // Test access to members of the pointed to class and dereferencing.
+    TestRC *accessTest = new TestRC();
+    Ptr accessTestPtr = accessTest;
+    accessTest->testVal = 1;
+    EXPECT_EQ(1, accessTestPtr->testVal);
+    EXPECT_EQ(1, (*accessTestPtr).testVal);
+    accessTest->testVal = 2;
+    EXPECT_EQ(2, accessTestPtr->testVal);
+    EXPECT_EQ(2, (*accessTestPtr).testVal);
+    accessTestPtr->testVal = 3;
+    EXPECT_EQ(3, accessTest->testVal);
+    (*accessTestPtr).testVal = 4;
+    EXPECT_EQ(4, accessTest->testVal);
+    accessTestPtr = NULL;
+    accessTest = NULL;
+    EXPECT_EQ(0, liveListSize());
+}
+
+TEST(RefcntTest, BoolAndLogicalNotOperatorOverloads)
+{
+    // Test bool and ! operator overloads.
+    Ptr boolTest = new TestRC();
+    EXPECT_EQ(boolTest, true);
+    EXPECT_EQ(!boolTest, false);
+    boolTest = NULL;
+    EXPECT_FALSE(boolTest);
+    EXPECT_TRUE(!boolTest);
+    EXPECT_EQ(0, liveListSize());
+}
+
+TEST(RefcntTest, EqualityOperators)
+{
+    // Test the equality operators.
+    TestRC *equalTestA = new TestRC();
+    Ptr equalTestAPtr = equalTestA;
+    Ptr equalTestAPtr2 = equalTestA;
+    TestRC *equalTestB = new TestRC();
+    Ptr equalTestBPtr = equalTestB;
+    EXPECT_TRUE(equalTestA == equalTestAPtr);
+    EXPECT_TRUE(equalTestAPtr == equalTestA);
+    EXPECT_TRUE(equalTestAPtr == equalTestAPtr2);
+    EXPECT_TRUE(equalTestA != equalTestBPtr);
+    EXPECT_TRUE(equalTestAPtr != equalTestB);
+    EXPECT_TRUE(equalTestAPtr != equalTestBPtr);
+}
\ No newline at end of file
diff --git a/src/unittest/refcnttest.cc b/src/unittest/refcnttest.cc
deleted file mode 100644
index 5701d24..0000000
--- a/src/unittest/refcnttest.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 2010 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Gabe Black
- */
-
-#include <cassert>
-#include <iostream>
-#include <list>
-
-#include "base/cprintf.hh"
-#include "base/refcnt.hh"
-#include "unittest/unittest.hh"
-
-using namespace std;
-using UnitTest::setCase;
-
-namespace {
-
-bool printNewDel = false;
-
-class TestRC;
-typedef list<TestRC *> LiveList;
-LiveList liveList;
-
-int
-live()
-{
-    return liveList.size();
-}
-
-int
-liveChange()
-{
-    static int oldLive = 0;
-    int newLive = live();
-    int diff =  newLive - oldLive;
-    oldLive = newLive;
-    return diff;
-}
-
-class TestRC : public RefCounted
-{
-  protected:
-    const char *_tag;
-    LiveList::iterator liveIt;
-
-  public:
-    TestRC(const char *newTag) : _tag(newTag)
-    {
-        if (printNewDel)
-            cprintf("  Creating object \"%s\"\n", _tag);
-        liveList.push_front(this);
-        liveIt = liveList.begin();
-    }
-
-    ~TestRC()
-    {
-        if (printNewDel)
-            cprintf("  Destroying object \"%s\"\n", _tag);
-        liveList.erase(liveIt);
-    }
-
-    const char *
-    tag()
-    {
-        return _tag;
-    }
-
-    int testVal;
-};
-
-typedef RefCountingPtr<TestRC> Ptr;
-
-} // anonymous namespace
-
-int
-main()
-{
-    assert(live() == 0);
-    assert(liveChange() == 0);
-
-    // Create an empty Ptr and verify it's data pointer is NULL.
-    setCase("NULL check");
-    Ptr nullCheck;
-    EXPECT_EQ(nullCheck.get(), NULL);
-
-    EXPECT_EQ(liveChange(), 0);
-
-    // Construct a Ptr from a TestRC pointer.
-    setCase("construction from pointer");
-    Ptr constFromPointer = new TestRC("construction from pointer");
-
-    EXPECT_EQ(liveChange(), 1);
-
-    // Construct a Ptr from an existing Ptr.
-    setCase("construction from a Ptr");
-    Ptr constFromPtr = constFromPointer;
-
-    EXPECT_EQ(liveChange(), 0);
-
-    // Test a Ptr being destroyed.
-    setCase("destroying a Ptr");
-    Ptr *ptrPtr = new Ptr(new TestRC("destroying a ptr"));
-    EXPECT_EQ(liveChange(), 1);
-    delete ptrPtr;
-    EXPECT_EQ(liveChange(), -1);
-
-    // Test assignment from a pointer and from a Ptr.
-    setCase("assignment operators");
-    Ptr assignmentTarget;
-    TestRC *assignmentSourcePointer = new TestRC("assignment source 1");
-    EXPECT_EQ(liveChange(), 1);
-    assignmentTarget = assignmentSourcePointer;
-    EXPECT_EQ(liveChange(), 0);
-    assignmentTarget = NULL;
-    EXPECT_EQ(liveChange(), -1);
-    Ptr assignmentSourcePtr(new TestRC("assignment source 2"));
-    EXPECT_EQ(liveChange(), 1);
-    assignmentTarget = assignmentSourcePtr;
-    EXPECT_EQ(liveChange(), 0);
-    assignmentSourcePtr = NULL;
-    EXPECT_EQ(liveChange(), 0);
-    assignmentTarget = NULL;
-    EXPECT_EQ(liveChange(), -1);
-
-    // Test access to members of the pointed to class and dereferencing.
-    setCase("access to members");
-    TestRC *accessTest = new TestRC("access test");
-    Ptr accessTestPtr = accessTest;
-    accessTest->testVal = 1;
-    EXPECT_EQ(accessTestPtr->testVal, 1);
-    EXPECT_EQ((*accessTestPtr).testVal, 1);
-    accessTest->testVal = 2;
-    EXPECT_EQ(accessTestPtr->testVal, 2);
-    EXPECT_EQ((*accessTestPtr).testVal, 2);
-    accessTestPtr->testVal = 3;
-    EXPECT_EQ(accessTest->testVal, 3);
-    (*accessTestPtr).testVal = 4;
-    EXPECT_EQ(accessTest->testVal, 4);
-    accessTestPtr = NULL;
-    accessTest = NULL;
-    EXPECT_EQ(liveChange(), 0);
-
-    // Test bool and ! operator overloads.
-    setCase("conversion to bool and ! overload");
-    Ptr boolTest = new TestRC("bool test");
-    EXPECT_EQ(boolTest, true);
-    EXPECT_EQ(!boolTest, false);
-    boolTest = NULL;
-    EXPECT_EQ(boolTest, false);
-    EXPECT_EQ(!boolTest, true);
-    EXPECT_EQ(liveChange(), 0);
-
-    // Test the equality operators.
-    setCase("equality operators");
-    TestRC *equalTestA = new TestRC("equal test a");
-    Ptr equalTestAPtr = equalTestA;
-    Ptr equalTestAPtr2 = equalTestA;
-    TestRC *equalTestB = new TestRC("equal test b");
-    Ptr equalTestBPtr = equalTestB;
-    EXPECT_TRUE(equalTestA == equalTestAPtr);
-    EXPECT_TRUE(equalTestAPtr == equalTestA);
-    EXPECT_TRUE(equalTestAPtr == equalTestAPtr2);
-    EXPECT_TRUE(equalTestA != equalTestBPtr);
-    EXPECT_TRUE(equalTestAPtr != equalTestB);
-    EXPECT_TRUE(equalTestAPtr != equalTestBPtr);
-
-    return UnitTest::printResults();
-}
