diff --git a/aos/common/queue.h b/aos/common/queue.h
index 33dc377..da2a180 100644
--- a/aos/common/queue.h
+++ b/aos/common/queue.h
@@ -3,17 +3,9 @@
 
 #include <assert.h>
 
-#if defined(__VXWORKS__) || defined(__TEST_VXWORKS__)
-#define USE_UNSAFE
-#else
-#undef USE_UNSAFE
-#endif
-
 #include "aos/common/time.h"
 #include "aos/common/macros.h"
-#ifndef USE_UNSAFE
 #include "aos/linux_code/ipc_lib/queue.h"
-#endif  // USE_UNSAFE
 #include "aos/common/time.h"
 
 namespace aos {
@@ -53,15 +45,11 @@
 template <class T> class Queue;
 template <class T> class MessageBuilder;
 template <class T> class ScopedMessagePtr;
-#ifndef USE_UNSAFE
-template <class T> class SafeMessageBuilder;
-template <class T> class SafeScopedMessagePtr;
-#endif  // USE_UNSAFE
 
 // A ScopedMessagePtr<> manages a queue message pointer.
 // It frees it properly when the ScopedMessagePtr<> goes out of scope or gets
 // sent.  By design, there is no way to get the ScopedMessagePtr to release the
-// message pointer.
+// message pointer to external code.
 template <class T>
 class ScopedMessagePtr {
  public:
@@ -116,7 +104,6 @@
     reset();
   }
 
-#ifndef SWIG
   // Implements a move constructor.  This only takes rvalue references
   // because we want to allow someone to say
   // ScopedMessagePtr<X> ptr = queue.MakeMessage();
@@ -126,14 +113,9 @@
   // clear out the source so there aren't 2 pointers to the message lying
   // around.
   ScopedMessagePtr(ScopedMessagePtr<T> &&ptr)
-    :
-#ifndef USE_UNSAFE
-    queue_(ptr.queue_),
-#endif  // USE_UNSAFE
-      msg_(ptr.msg_) {
+      : queue_(ptr.queue_), msg_(ptr.msg_) {
     ptr.msg_ = NULL;
   }
-#endif  // SWIG
 
  private:
   // Provide access to set_queue and the constructor for init.
@@ -141,27 +123,20 @@
   // Provide access to the copy constructor for MakeWithBuilder.
   friend class aos::MessageBuilder<T>;
 
-#ifndef USE_UNSAFE
-  // Only Queue should be able to build a queue.
+  // Only Queue should be able to build a message.
   ScopedMessagePtr(RawQueue *queue, T *msg)
       : queue_(queue), msg_(msg) {}
-#else
-  ScopedMessagePtr(T *msg)
-      : msg_(msg) {}
-#endif  // USE_UNSAFE
 
   // Sets the pointer to msg, freeing the old value if it was there.
   // This is private because nobody should be able to get a pointer to a message
   // that needs to be scoped without using the queue.
   void reset(T *msg = NULL);
 
-#ifndef USE_UNSAFE
   // Sets the queue that owns this message.
   void set_queue(RawQueue *queue) { queue_ = queue; }
 
   // The queue that the message is a part of.
   RawQueue *queue_;
-#endif  // USE_UNSAFE
   // The message or NULL.
   T *msg_;
 
@@ -171,8 +146,6 @@
 
 // Specializations for the Builders will be automatically generated in the .q.h
 // header files with all of the handy builder methods.
-// This builder uses an actual shm message pointer, which is more efficient and
-// more dangerous than the linux only SafeMessageBuilder.
 template <class T>
 class MessageBuilder {
  public:
@@ -182,21 +155,14 @@
 
 // TODO(aschuh): Base class
 // T must be a Message with the same format as the messages generated by
-// the q files.
+// the .q files.
 template <class T>
 class Queue {
  public:
   typedef T Message;
 
   Queue(const char *queue_name)
-      : queue_name_(queue_name),
-#ifdef USE_UNSAFE
-        queue_msg_(&msg_)
-#else
-        queue_(NULL),
-        queue_msg_(NULL, NULL)
-#endif  // USE_UNSAFE
-  {
+      : queue_name_(queue_name), queue_(NULL), queue_msg_(NULL, NULL) {
     static_assert(shm_ok<T>::value,
                   "The provided message type can't be put in shmem.");
   }
@@ -215,6 +181,9 @@
   // Returns true if there was a new message available and we successfully
   // fetched it.
   bool FetchNext();
+
+  // Fetches the next message from the queue, waiting if necessary until there
+  // is one.
   void FetchNextBlocking();
 
   // Fetches the last message from the queue.
@@ -227,16 +196,17 @@
   void FetchAnother();
 
   // Returns the age of the message.
-  const time::Time Age() { return time::Time::Now() - queue_msg_->sent_time; }
+  const time::Time Age() const { return time::Time::Now() - queue_msg_->sent_time; }
 
   // Returns true if the latest value in the queue is newer than age mseconds.
-  bool IsNewerThanMS(int age) {
+  // DEPRECATED(brians): Use IsNewerThan(const time::Time&) instead.
+  bool IsNewerThanMS(int age) const {
     // TODO(aschuh): Log very verbosely if something is _ever_ stale.
-    if (get() != NULL) {
-      return Age() < time::Time::InMS(age);
-    } else {
-      return false;
-    }
+    return IsNewerThan(time::Time::InMS(age));
+  }
+
+  bool IsNewerThan(const time::Time &age) const {
+    return get() != nullptr && Age() < age;
   }
 
   // Returns a pointer to the current message.
@@ -259,40 +229,26 @@
     return msg;
   }
 
-#ifndef USE_UNSAFE
-  // Returns a scoped_ptr containing a message.
-  // GCC will optimize away the copy constructor, so this is safe.
-  SafeScopedMessagePtr<T> SafeMakeMessage();
-
-  // Returns a message builder that contains a pre-allocated message.
-  aos::SafeMessageBuilder<T> SafeMakeWithBuilder();
-#endif  // USE_UNSAFE
-
-#ifndef SWIG
   // Returns a scoped_ptr containing a message.
   // GCC will optimize away the copy constructor, so this is safe.
   ScopedMessagePtr<T> MakeMessage();
 
   // Returns a message builder that contains a pre-allocated message.
   aos::MessageBuilder<T> MakeWithBuilder();
-#endif  // SWIG
 
   const char *name() const { return queue_name_; }
 
  private:
   const char *queue_name_;
 
-#ifdef USE_UNSAFE
-  // The unsafe queue only has 1 entry and no safety, so 1 message is fine.
-  T msg_;
-#else
   T *MakeRawMessage();
+
   // Pointer to the queue that this object fetches from.
   RawQueue *queue_;
   int index_ = 0;
-#endif
   // Scoped pointer holding the latest message or NULL.
   ScopedMessagePtr<const T> queue_msg_;
+
   DISALLOW_COPY_AND_ASSIGN(Queue<T>);
 };
 
@@ -315,11 +271,6 @@
 
 }  // namespace aos
 
-#ifdef USE_UNSAFE
-#include "aos/crio/queue-tmpl.h"
-#else
 #include "aos/linux_code/queue-tmpl.h"
-#endif
-#undef USE_UNSAFE
 
 #endif  // AOS_COMMON_QUEUE_H_
