diff --git a/src/systemc/channel/SConscript b/src/systemc/channel/SConscript
new file mode 100644
index 0000000..3ca8801
--- /dev/null
+++ b/src/systemc/channel/SConscript
@@ -0,0 +1,39 @@
+# Copyright 2018 Google, Inc.
+#
+# 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
+
+Import('*')
+
+if env['USE_SYSTEMC']:
+    Source('sc_clock.cc')
+    Source('sc_event_queue.cc')
+    Source('sc_in_resolved.cc')
+    Source('sc_inout_resolved.cc')
+    Source('sc_out_resolved.cc')
+    Source('sc_mutex.cc')
+    Source('sc_semaphore.cc')
+    Source('sc_signal_resolved.cc')
+    Source('warn_unimpl.cc')
diff --git a/src/systemc/channel/sc_clock.cc b/src/systemc/channel/sc_clock.cc
new file mode 100644
index 0000000..ac1d336
--- /dev/null
+++ b/src/systemc/channel/sc_clock.cc
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/sc_clock.hh"
+#include "systemc/ext/core/sc_module.hh" // for sc_gen_unique_name
+
+namespace sc_core
+{
+
+sc_clock::sc_clock() :
+        sc_interface(), sc_signal<bool>(sc_gen_unique_name("clock"))
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_clock::sc_clock(const char *name) : sc_interface(), sc_signal<bool>(name)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_clock::sc_clock(const char *name, const sc_time &period,
+                   double duty_cycle, const sc_time &start_time,
+                   bool posedge_first)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_clock::sc_clock(const char *name, double period_v, sc_time_unit period_tu,
+                   double duty_cycle)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_clock::sc_clock(const char *name, double period_v, sc_time_unit period_tu,
+                   double duty_cycle, double start_time_v,
+                   sc_time_unit start_time_tu, bool posedge_first)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_clock::~sc_clock() {}
+
+void
+sc_clock::write(const bool &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+const sc_time &
+sc_clock::period() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *(const sc_time *)nullptr;
+}
+
+double
+sc_clock::duty_cycle() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0.0;
+}
+
+const sc_time &
+sc_clock::start_time() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *(const sc_time *)nullptr;
+}
+
+bool
+sc_clock::posedge_first() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return false;
+}
+
+const char *sc_clock::kind() const { return "sc_clock"; }
+
+void sc_clock::before_end_of_elaboration() {}
+
+} // namespace sc_core
diff --git a/src/systemc/channel/sc_event_queue.cc b/src/systemc/channel/sc_event_queue.cc
new file mode 100644
index 0000000..47485fd
--- /dev/null
+++ b/src/systemc/channel/sc_event_queue.cc
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/sc_event_queue.hh"
+
+namespace sc_core
+{
+
+sc_event_queue::sc_event_queue(sc_module_name name) :
+        sc_interface(), sc_event_queue_if(), sc_module(name)
+{}
+
+sc_event_queue::~sc_event_queue() {}
+
+const char *sc_event_queue::kind() const { return "sc_event_queue"; }
+
+void
+sc_event_queue::notify(double, sc_time_unit)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+void
+sc_event_queue::notify(const sc_time &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+void
+sc_event_queue::cancel_all()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+const sc_event &
+sc_event_queue::default_event() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *(const sc_event *)nullptr;
+}
+
+} // namespace sc_core
diff --git a/src/systemc/channel/sc_in_resolved.cc b/src/systemc/channel/sc_in_resolved.cc
new file mode 100644
index 0000000..b57f4cd
--- /dev/null
+++ b/src/systemc/channel/sc_in_resolved.cc
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/sc_in_resolved.hh"
+
+namespace sc_core
+{
+
+sc_in_resolved::sc_in_resolved() : sc_in<sc_dt::sc_logic>() {}
+
+sc_in_resolved::sc_in_resolved(const char *name) :
+        sc_in<sc_dt::sc_logic>(name)
+{}
+
+sc_in_resolved::~sc_in_resolved() {}
+
+void sc_in_resolved::end_of_elaboration() {}
+
+const char *sc_in_resolved::kind() const { return "sc_in_resolved"; }
+
+} // namespace sc_core
diff --git a/src/systemc/channel/sc_inout_resolved.cc b/src/systemc/channel/sc_inout_resolved.cc
new file mode 100644
index 0000000..71cece8
--- /dev/null
+++ b/src/systemc/channel/sc_inout_resolved.cc
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/sc_inout_resolved.hh"
+
+namespace sc_core
+{
+
+sc_inout_resolved::sc_inout_resolved() : sc_inout<sc_dt::sc_logic>() {}
+
+sc_inout_resolved::sc_inout_resolved(const char *name) :
+        sc_inout<sc_dt::sc_logic>(name)
+{}
+
+sc_inout_resolved::~sc_inout_resolved() {}
+
+void sc_inout_resolved::end_of_elaboration() {}
+
+sc_inout_resolved &
+sc_inout_resolved::operator = (const sc_dt::sc_logic &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_inout_resolved &
+sc_inout_resolved::operator = (const sc_signal_in_if<sc_dt::sc_logic> &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_inout_resolved &
+sc_inout_resolved::operator = (
+        const sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_inout_resolved &
+sc_inout_resolved::operator = (
+        const sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_inout_resolved &
+sc_inout_resolved::operator = (const sc_inout_resolved &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+const char *sc_inout_resolved::kind() const { return "sc_inout_resolved"; }
+
+} // namespace sc_core
diff --git a/src/systemc/channel/sc_mutex.cc b/src/systemc/channel/sc_mutex.cc
new file mode 100644
index 0000000..80d086f
--- /dev/null
+++ b/src/systemc/channel/sc_mutex.cc
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/sc_mutex.hh"
+#include "systemc/ext/core/sc_module.hh" // for sc_gen_unique_name
+
+namespace sc_core
+{
+
+sc_mutex::sc_mutex() : sc_interface(), sc_mutex_if(),
+        sc_object(sc_gen_unique_name("mutex"))
+{}
+
+sc_mutex::sc_mutex(const char *name) :
+        sc_interface(), sc_mutex_if(), sc_object(name)
+{}
+
+int
+sc_mutex::lock()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0;
+}
+
+int
+sc_mutex::trylock()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0;
+}
+
+int
+sc_mutex::unlock()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0;
+}
+
+const char *sc_mutex::kind() const { return "sc_mutex"; }
+
+} // namespace sc_core
diff --git a/src/systemc/channel/sc_out_resolved.cc b/src/systemc/channel/sc_out_resolved.cc
new file mode 100644
index 0000000..a3947f6
--- /dev/null
+++ b/src/systemc/channel/sc_out_resolved.cc
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/sc_out_resolved.hh"
+
+namespace sc_core
+{
+
+sc_out_resolved::sc_out_resolved() : sc_out<sc_dt::sc_logic>() {}
+
+sc_out_resolved::sc_out_resolved(const char *name) :
+        sc_out<sc_dt::sc_logic>(name) {}
+
+sc_out_resolved::~sc_out_resolved() {}
+
+sc_out_resolved &
+sc_out_resolved::operator = (const sc_dt::sc_logic &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_out_resolved &
+sc_out_resolved::operator = (const sc_signal_in_if<sc_dt::sc_logic> &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_out_resolved &
+sc_out_resolved::operator = (
+        const sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_out_resolved &
+sc_out_resolved::operator = (
+        const sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_out_resolved &
+sc_out_resolved::operator = (const sc_out_resolved &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+const char *sc_out_resolved::kind() const { return "sc_out_resolved"; }
+
+} // namespace sc_core
diff --git a/src/systemc/channel/sc_semaphore.cc b/src/systemc/channel/sc_semaphore.cc
new file mode 100644
index 0000000..cfae598
--- /dev/null
+++ b/src/systemc/channel/sc_semaphore.cc
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/sc_semaphore.hh"
+#include "systemc/ext/core/sc_module.hh" // for sc_gen_unique_name
+
+namespace sc_core
+{
+
+sc_semaphore::sc_semaphore(int) :
+        sc_interface(), sc_semaphore_if(),
+        sc_object(sc_gen_unique_name("semaphore"))
+{}
+
+sc_semaphore::sc_semaphore(const char *name, int) :
+        sc_interface(), sc_semaphore_if(), sc_object(name)
+{}
+
+int
+sc_semaphore::wait()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0;
+}
+
+int
+sc_semaphore::trywait()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0;
+}
+
+int
+sc_semaphore::post()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0;
+}
+
+int
+sc_semaphore::get_value() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0;
+}
+
+const char *sc_semaphore::kind() const { return "sc_semaphore"; }
+
+} // namespace sc_core
diff --git a/src/systemc/channel/sc_signal_resolved.cc b/src/systemc/channel/sc_signal_resolved.cc
new file mode 100644
index 0000000..9043184
--- /dev/null
+++ b/src/systemc/channel/sc_signal_resolved.cc
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/sc_signal_resolved.hh"
+#include "systemc/ext/core/sc_module.hh" // for sc_gen_unique_name
+
+namespace sc_core
+{
+
+sc_signal_resolved::sc_signal_resolved() : sc_interface(),
+        sc_signal<sc_dt::sc_logic, SC_MANY_WRITERS>(
+                sc_gen_unique_name("signal_resolved"))
+{}
+
+sc_signal_resolved::sc_signal_resolved(const char *name) :
+        sc_interface(), sc_signal<sc_dt::sc_logic, SC_MANY_WRITERS>(name)
+{}
+
+sc_signal_resolved::~sc_signal_resolved() {}
+
+void
+sc_signal_resolved::register_port(sc_port_base &, const char *)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+void
+sc_signal_resolved::write(const sc_dt::sc_logic &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_signal_resolved &
+sc_signal_resolved::operator = (const sc_dt::sc_logic &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+sc_signal_resolved &
+sc_signal_resolved::operator = (const sc_signal_resolved &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *this;
+}
+
+const char *sc_signal_resolved::kind() const { return "sc_signal_resolved"; }
+
+void
+sc_signal_resolved::update()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+} // namespace sc_core
diff --git a/src/systemc/channel/warn_unimpl.cc b/src/systemc/channel/warn_unimpl.cc
new file mode 100644
index 0000000..82fd836
--- /dev/null
+++ b/src/systemc/channel/warn_unimpl.cc
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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 "base/logging.hh"
+#include "systemc/ext/channel/warn_unimpl.hh"
+
+namespace sc_core
+{
+
+void
+sc_channel_warn_unimpl(const char *func)
+{
+    warn("%s not implemented.\n", func);
+}
+
+} // namespace sc_core
diff --git a/src/systemc/ext/channel/_channel.hh b/src/systemc/ext/channel/_channel.hh
new file mode 100644
index 0000000..d95cfc2
--- /dev/null
+++ b/src/systemc/ext/channel/_channel.hh
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL__CHANNEL_HH__
+#define __SYSTEMC_EXT_CHANNEL__CHANNEL_HH__
+
+#include "sc_buffer.hh"
+#include "sc_clock.hh"
+#include "sc_event_queue.hh"
+#include "sc_fifo.hh"
+#include "sc_fifo_in.hh"
+#include "sc_fifo_in_if.hh"
+#include "sc_fifo_out.hh"
+#include "sc_fifo_out_if.hh"
+#include "sc_in.hh"
+#include "sc_in_resolved.hh"
+#include "sc_in_rv.hh"
+#include "sc_inout.hh"
+#include "sc_inout_resolved.hh"
+#include "sc_inout_rv.hh"
+#include "sc_mutex.hh"
+#include "sc_mutex_if.hh"
+#include "sc_out.hh"
+#include "sc_out_resolved.hh"
+#include "sc_out_rv.hh"
+#include "sc_semaphore.hh"
+#include "sc_semaphore_if.hh"
+#include "sc_signal.hh"
+#include "sc_signal_in_if.hh"
+#include "sc_signal_inout_if.hh"
+#include "sc_signal_resolved.hh"
+#include "sc_signal_rv.hh"
+
+#endif  //__SYSTEMC_EXT_CHANNEL__CHANNEL_HH__
diff --git a/src/systemc/ext/channel/_using.hh b/src/systemc/ext/channel/_using.hh
new file mode 100644
index 0000000..58269d5
--- /dev/null
+++ b/src/systemc/ext/channel/_using.hh
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL__USING_HH__
+#define __SYSTEMC_EXT_CHANNEL__USING_HH__
+
+#include "_channel.hh"
+
+using sc_core::sc_buffer;
+
+using sc_core::sc_in_clk;
+using sc_core::sc_clock;
+
+using sc_core::sc_event_queue;
+
+using sc_core::sc_fifo;
+
+using sc_core::sc_fifo_in;
+
+using sc_core::sc_fifo_nonblocking_in_if;
+using sc_core::sc_fifo_blocking_in_if;
+using sc_core::sc_fifo_in_if;
+
+using sc_core::sc_fifo_out;
+
+using sc_core::sc_fifo_nonblocking_out_if;
+using sc_core::sc_fifo_blocking_out_if;
+using sc_core::sc_fifo_out_if;
+
+using sc_core::sc_in;
+
+using sc_core::sc_in_resolved;
+
+using sc_core::sc_in_rv;
+
+using sc_core::sc_inout;
+
+using sc_core::sc_inout_resolved;
+
+using sc_core::sc_inout_rv;
+
+using sc_core::sc_mutex;
+
+using sc_core::sc_mutex_if;
+
+using sc_core::sc_out;
+
+using sc_core::sc_out_resolved;
+
+using sc_core::sc_out_rv;
+
+using sc_core::sc_semaphore;
+
+using sc_core::sc_semaphore_if;
+
+using sc_core::sc_signal;
+
+using sc_core::sc_signal_in_if;
+
+using sc_core::SC_ONE_WRITER;
+using sc_core::SC_MANY_WRITERS;
+using sc_core::sc_signal_write_if;
+using sc_core::sc_signal_inout_if;
+
+using sc_core::sc_signal_resolved;
+
+using sc_core::sc_signal_rv;
+
+#endif  //__SYSTEMC_EXT_CHANNEL__USING_HH__
diff --git a/src/systemc/ext/channel/sc_buffer.hh b/src/systemc/ext/channel/sc_buffer.hh
new file mode 100644
index 0000000..153b60b
--- /dev/null
+++ b/src/systemc/ext/channel/sc_buffer.hh
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_BUFFER_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_BUFFER_HH__
+
+#include "../core/sc_module.hh" // for sc_gen_unique_name
+#include "sc_signal.hh"
+#include "warn_unimpl.hh" // for warn_unimpl
+
+namespace sc_core
+{
+
+template <class T, sc_writer_policy WRITER_POLICY>
+class sc_buffer : public sc_signal<T, WRITER_POLICY>
+{
+  public:
+    sc_buffer() : sc_signal<T, WRITER_POLICY>(sc_gen_unique_name("buffer")) {}
+    explicit sc_buffer(const char *name) :
+            sc_signal<T, WRITER_POLICY>(sc_gen_unique_name(name))
+    {}
+
+    virtual void
+    write(const T&)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    sc_buffer<T, WRITER_POLICY> &
+    operator = (const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_buffer<T, WRITER_POLICY> &
+    operator = (const sc_signal<T, WRITER_POLICY> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_buffer<T, WRITER_POLICY> &
+    operator = (const sc_buffer<T, WRITER_POLICY> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+
+    virtual const char *kind() const { return "sc_buffer"; }
+
+  protected:
+    virtual void
+    update()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+  private:
+    // Disabled
+    sc_buffer(const sc_buffer<T, WRITER_POLICY> &) {}
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_BUFFER_HH__
diff --git a/src/systemc/ext/channel/sc_clock.hh b/src/systemc/ext/channel/sc_clock.hh
new file mode 100644
index 0000000..9ca160c
--- /dev/null
+++ b/src/systemc/ext/channel/sc_clock.hh
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_CLOCK_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_CLOCK_HH__
+
+#include "../core/sc_time.hh"
+#include "sc_signal.hh"
+
+namespace sc_core
+{
+
+template <class T>
+class sc_in;
+
+class sc_time;
+
+class sc_clock : public sc_signal<bool>
+{
+  public:
+    sc_clock();
+    explicit sc_clock(const char *name);
+
+    sc_clock(const char *name, const sc_time &period,
+             double duty_cycle=0.5, const sc_time &start_time=SC_ZERO_TIME,
+             bool posedge_first=true);
+
+    sc_clock(const char *name, double period_v, sc_time_unit period_tu,
+             double duty_cycle=0.5);
+
+    sc_clock(const char *name, double period_v, sc_time_unit period_tu,
+             double duty_cycle, double start_time_v,
+             sc_time_unit start_time_tu, bool posedge_first=true);
+
+    virtual ~sc_clock();
+
+    virtual void write(const bool &);
+
+    const sc_time &period() const;
+    double duty_cycle() const;
+    const sc_time &start_time() const;
+    bool posedge_first() const;
+
+    virtual const char *kind() const;
+
+  protected:
+    virtual void before_end_of_elaboration();
+
+  private:
+    // Disabled
+    sc_clock(const sc_clock &) : sc_interface(), sc_signal<bool>() {}
+    sc_clock &operator = (const sc_clock &) { return *this; }
+};
+
+typedef sc_in<bool> sc_in_clk;
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_CLOCK_HH__
diff --git a/src/systemc/ext/channel/sc_event_queue.hh b/src/systemc/ext/channel/sc_event_queue.hh
new file mode 100644
index 0000000..aa2f72e
--- /dev/null
+++ b/src/systemc/ext/channel/sc_event_queue.hh
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_EVENT_QUEUE_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_EVENT_QUEUE_HH__
+
+#include "../core/sc_interface.hh"
+#include "../core/sc_module.hh" // for sc_gen_unique_name
+#include "../core/sc_module_name.hh"
+#include "../core/sc_time.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_core
+{
+
+class sc_event;
+
+class sc_event_queue_if : public virtual sc_interface
+{
+  public:
+    virtual void notify(double, sc_time_unit) = 0;
+    virtual void notify(const sc_time &) = 0;
+    virtual void cancel_all() = 0;
+};
+
+class sc_event_queue : public sc_event_queue_if, public sc_module
+{
+  public:
+    sc_event_queue(sc_module_name name=
+                   sc_module_name(sc_gen_unique_name("event_queue")));
+    ~sc_event_queue();
+
+    virtual const char *kind() const;
+
+    virtual void notify(double, sc_time_unit);
+    virtual void notify(const sc_time &);
+    virtual void cancel_all();
+
+    virtual const sc_event &default_event() const;
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_EVENT_QUEUE_HH__
diff --git a/src/systemc/ext/channel/sc_fifo.hh b/src/systemc/ext/channel/sc_fifo.hh
new file mode 100644
index 0000000..668c6b8
--- /dev/null
+++ b/src/systemc/ext/channel/sc_fifo.hh
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_FIFO_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_FIFO_HH__
+
+#include "../core/sc_module.hh" // for sc_gen_unique_name
+#include "../core/sc_prim.hh"
+#include "sc_fifo_in_if.hh"
+#include "sc_fifo_out_if.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_core
+{
+
+class sc_port_base;
+class sc_event;
+
+template <class T>
+class sc_fifo : public sc_fifo_in_if<T>,
+                public sc_fifo_out_if<T>,
+                public sc_prim_channel
+{
+  public:
+    explicit sc_fifo(int size=16) :
+            sc_fifo_in_if<T>(), sc_fifo_out_if<T>(),
+            sc_prim_channel(sc_gen_unique_name("fifo"))
+    {}
+    explicit sc_fifo(const char *name, int size=16) :
+            sc_fifo_in_if<T>(), sc_fifo_out_if<T>(),
+            sc_prim_channel(name)
+    {}
+    virtual ~sc_fifo() {}
+
+    virtual void
+    register_port(sc_port_base &, const char *)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    read(T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual T
+    read()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(T *)nullptr;
+    }
+    virtual bool
+    nb_read(T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    operator T()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(T *)nullptr;
+    }
+
+    virtual void
+    write(const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual bool
+    nb_write(const T&)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    sc_fifo<T> &
+    operator = (const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+
+    virtual const sc_event &
+    data_Written_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    virtual const sc_event &
+    data_read_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+
+    virtual int
+    num_available() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return 0;
+    }
+    virtual int
+    num_free() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return 0;
+    }
+
+    virtual void
+    print(std::ostream & =std::cout) const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual void
+    dump(std::ostream & =std::cout) const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual const char *kind() const { return "sc_fifo"; }
+
+  protected:
+    virtual void
+    update()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+  private:
+    // Disabled
+    sc_fifo(const sc_fifo<T> &) :
+            sc_fifo_in_if<T>(), sc_fifo_in_if<T>(), sc_prim_channel()
+    {}
+    sc_fifo &operator = (const sc_fifo<T> &) { return *this; }
+};
+
+template <class T>
+inline std::ostream &
+operator << (std::ostream &os, const sc_fifo<T> &)
+{
+    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    return os;
+}
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_FIFO_HH__
diff --git a/src/systemc/ext/channel/sc_fifo_in.hh b/src/systemc/ext/channel/sc_fifo_in.hh
new file mode 100644
index 0000000..7f593c1
--- /dev/null
+++ b/src/systemc/ext/channel/sc_fifo_in.hh
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_FIFO_IN_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_FIFO_IN_HH__
+
+#include "../core/sc_port.hh"
+#include "sc_fifo_in_if.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_core
+{
+
+class sc_event;
+class sc_event_finder;
+
+template <class T>
+class sc_fifo_in : public sc_port<sc_fifo_in_if<T>, 0>
+{
+  public:
+    sc_fifo_in() : sc_port<sc_fifo_in_if<T>, 0>() {}
+    explicit sc_fifo_in(const char *name) : sc_port<sc_fifo_in_if<T>, 0>(name)
+    {}
+    virtual ~sc_fifo_in() {}
+
+    void
+    read(T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    T
+    read()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(T *)nullptr;
+    }
+    bool
+    nb_read(T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    const sc_event &
+    data_written_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    sc_event_finder &
+    data_written() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    int
+    num_available() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return 0;
+    }
+    virtual const char *kind() const { return "sc_fifo_in"; }
+
+  private:
+    // Disabled
+    sc_fifo_in(const sc_fifo_in<T> &) : sc_port<sc_fifo_in_if<T>, 0>() {}
+    sc_fifo_in<T> &operator = (const sc_fifo_in<T> &) { return *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_FIFO_IN_HH__
diff --git a/src/systemc/ext/channel/sc_fifo_in_if.hh b/src/systemc/ext/channel/sc_fifo_in_if.hh
new file mode 100644
index 0000000..a6ac4f5
--- /dev/null
+++ b/src/systemc/ext/channel/sc_fifo_in_if.hh
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_FIFO_IN_IF_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_FIFO_IN_IF_HH__
+
+#include "../core/sc_interface.hh"
+
+namespace sc_core
+{
+
+class sc_event;
+
+template <class T>
+class sc_fifo_nonblocking_in_if : virtual public sc_interface
+{
+  public:
+    virtual bool ab_read(T &) = 0;
+    virtual const sc_event &data_written_event() const = 0;
+};
+
+template <class T>
+class sc_fifo_blocking_in_if : virtual public sc_interface
+{
+  public:
+    virtual void read(T &) = 0;
+    virtual T read() = 0;
+};
+
+template <class T>
+class sc_fifo_in_if : public sc_fifo_nonblocking_in_if<T>,
+                      public sc_fifo_blocking_in_if<T>
+{
+  public:
+    virtual int num_avaialble() const = 0;
+
+  protected:
+    sc_fifo_in_if() : sc_interface() {}
+
+  private:
+    // Disabled
+    sc_fifo_in_if(const sc_fifo_in_if<T> &);
+    sc_fifo_in_if<T> &operator = (const sc_fifo_in_if<T> &) { return *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_FIFO_IN_IF_HH__
diff --git a/src/systemc/ext/channel/sc_fifo_out.hh b/src/systemc/ext/channel/sc_fifo_out.hh
new file mode 100644
index 0000000..4beb15d
--- /dev/null
+++ b/src/systemc/ext/channel/sc_fifo_out.hh
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_FIFO_OUT_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_FIFO_OUT_HH__
+
+#include "../core/sc_port.hh"
+#include "sc_fifo_out_if.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_core
+{
+
+class sc_event;
+class sc_event_finder;
+
+template <class T>
+class sc_fifo_out : public sc_port<sc_fifo_out_if<T>, 0>
+{
+  public:
+    sc_fifo_out() : sc_port<sc_fifo_out_if<T>, 0>() {}
+    explicit sc_fifo_out(const char *name) :
+            sc_port<sc_fifo_out_if<T>, 0>(name)
+    {}
+    virtual ~sc_fifo_out() {}
+
+    void
+    write(const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    bool
+    nb_write(const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    const sc_event &
+    data_read_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    sc_event_finder &
+    data_read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    int
+    num_free() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return 0;
+    }
+    virtual const char *kind() const { return "sc_fifo_out"; }
+
+  private:
+    // Disabled
+    sc_fifo_out(const sc_fifo_out<T> &) : sc_port<sc_fifo_out_if<T>, 0>() {}
+    sc_fifo_out<T> &operator = (const sc_fifo_out<T> &) { return *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_FIFO_OUT_HH__
diff --git a/src/systemc/ext/channel/sc_fifo_out_if.hh b/src/systemc/ext/channel/sc_fifo_out_if.hh
new file mode 100644
index 0000000..ebc5d5c
--- /dev/null
+++ b/src/systemc/ext/channel/sc_fifo_out_if.hh
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_FIFO_OUT_IF_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_FIFO_OUT_IF_HH__
+
+#include "../core/sc_interface.hh"
+
+namespace sc_core
+{
+
+class sc_event;
+
+template <class T>
+class sc_fifo_nonblocking_out_if : virtual public sc_interface
+{
+  public:
+    virtual bool ab_write(const T &) = 0;
+    virtual const sc_event &data_read_event() const = 0;
+};
+
+template <class T>
+class sc_fifo_blocking_out_if : virtual public sc_interface
+{
+  public:
+    virtual void write(const T &) = 0;
+};
+
+template <class T>
+class sc_fifo_out_if : public sc_fifo_nonblocking_out_if<T>,
+                       public sc_fifo_blocking_out_if<T>
+{
+  public:
+    virtual int num_free() const = 0;
+
+  protected:
+    sc_fifo_out_if() : sc_interface(), sc_fifo_nonblocking_out_if<T>(),
+            sc_fifo_blocking_out_if<T>()
+    {}
+
+  private:
+    sc_fifo_out_if(const sc_fifo_out_if<T> &) : sc_interface(),
+            sc_fifo_nonblocking_out_if<T>(), sc_fifo_blocking_out_if<T>()
+    {}
+    sc_fifo_out_if<T> &operator = (const sc_fifo_out_if<T> &) { return *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_FIFO_OUT_IF_HH__
diff --git a/src/systemc/ext/channel/sc_in.hh b/src/systemc/ext/channel/sc_in.hh
new file mode 100644
index 0000000..a283d0d
--- /dev/null
+++ b/src/systemc/ext/channel/sc_in.hh
@@ -0,0 +1,433 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
+
+#include <string>
+
+#include "../core/sc_port.hh"
+#include "sc_signal_in_if.hh"
+#include "sc_signal_inout_if.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_core
+{
+
+class sc_event;
+class sc_event_finder;
+class sc_trace_file;
+
+template <class T>
+class sc_in : public sc_port<sc_signal_in_if<T>, 1>
+{
+  public:
+    sc_in() : sc_port<sc_signal_in_if<T>, 1>() {}
+    explicit sc_in(const char *name) : sc_port<sc_signal_in_if<T>, 1>(name) {}
+    virtual ~sc_in() {}
+
+    virtual void
+    bind(const sc_signal_in_if<T> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (const sc_signal_in_if<T> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    bind(sc_port<sc_signal_in_if<T>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (sc_port<sc_signal_in_if<T>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    bind(sc_port<sc_signal_inout_if<T>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (sc_port<sc_signal_inout_if<T>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    end_of_elaboration()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    const T &
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const T *)nullptr;
+    }
+    operator const T& () const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const T *)nullptr;
+    }
+
+    const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    sc_event_finder &
+    value_changed() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+
+    virtual const char *kind() const { return "sc_in"; }
+
+  private:
+    // Disabled
+    sc_in(const sc_in<T> &) : sc_port<sc_signal_in_if<T>, 1>() {}
+    sc_in<T> &operator = (const sc_in<T> &) { return *this; }
+};
+
+template <class T>
+inline void
+sc_trace(sc_trace_file *, const sc_in<T> &, const std::string &)
+{
+    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+}
+
+template <>
+class sc_in<bool> : public sc_port<sc_signal_in_if<bool>, 1>
+{
+  public:
+    sc_in() : sc_port<sc_signal_in_if<bool>, 1>() {}
+    explicit sc_in(const char *name) :
+        sc_port<sc_signal_in_if<bool>, 1>(name) {}
+    virtual ~sc_in() {}
+
+    virtual void
+    bind(const sc_signal_in_if<bool> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (const sc_signal_in_if<bool> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    bind(sc_port<sc_signal_in_if<bool>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (sc_port<sc_signal_in_if<bool>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    bind(sc_port<sc_signal_inout_if<bool>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (sc_port<sc_signal_inout_if<bool>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    end_of_elaboration()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    const bool &
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const bool *)nullptr;
+    }
+    operator const bool& () const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const bool *)nullptr;
+    }
+
+    const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    const sc_event &
+    posedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    const sc_event &
+    negedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+
+    bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    bool
+    posedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    bool
+    negedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+
+    sc_event_finder &
+    value_changed() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    sc_event_finder &
+    pos() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    sc_event_finder &
+    neg() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+
+    virtual const char *kind() const { return "sc_in"; }
+
+  private:
+    // Disabled
+    sc_in(const sc_in<bool> &) : sc_port<sc_signal_in_if<bool>, 1>() {}
+    sc_in<bool> &operator = (const sc_in<bool> &) { return *this; }
+};
+
+template <>
+inline void
+sc_trace<bool>(sc_trace_file *, const sc_in<bool> &, const std::string &)
+{
+    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+}
+
+template <>
+class sc_in<sc_dt::sc_logic> :
+    public sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>
+{
+  public:
+    sc_in() : sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>() {}
+    explicit sc_in(const char *name) :
+        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name)
+    {}
+    virtual ~sc_in() {}
+
+    virtual void
+    bind(const sc_signal_in_if<sc_dt::sc_logic> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (const sc_signal_in_if<sc_dt::sc_logic> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    bind(sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    bind(sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    operator () (sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    end_of_elaboration()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    const sc_dt::sc_logic &
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_dt::sc_logic *)nullptr;
+    }
+    operator const sc_dt::sc_logic& () const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_dt::sc_logic *)nullptr;
+    }
+
+    const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    const sc_event &
+    posedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+    const sc_event &
+    negedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_event *)nullptr;
+    }
+
+    bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    bool
+    posedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    bool
+    negedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+
+    sc_event_finder &
+    value_changed() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    sc_event_finder &
+    pos() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    sc_event_finder &
+    neg() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+
+    virtual const char *kind() const { return "sc_in"; }
+
+  private:
+    // Disabled
+    sc_in(const sc_in<sc_dt::sc_logic> &) :
+        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>()
+    {}
+    sc_in<sc_dt::sc_logic> &
+    operator = (const sc_in<sc_dt::sc_logic> &)
+    {
+        return *this;
+    }
+};
+
+template <>
+inline void
+sc_trace<sc_dt::sc_logic>(
+        sc_trace_file *, const sc_in<sc_dt::sc_logic> &, const std::string &)
+{
+    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+}
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_IN_HH__
diff --git a/src/systemc/ext/channel/sc_in_resolved.hh b/src/systemc/ext/channel/sc_in_resolved.hh
new file mode 100644
index 0000000..cfc8f47
--- /dev/null
+++ b/src/systemc/ext/channel/sc_in_resolved.hh
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_IN_RESOLVED_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_IN_RESOLVED_HH__
+
+#include "sc_in.hh"
+
+namespace
+{
+
+class sc_logic;
+
+}
+
+namespace sc_core
+{
+
+class sc_in_resolved : public sc_in<sc_dt::sc_logic>
+{
+  public:
+    sc_in_resolved();
+    explicit sc_in_resolved(const char *name);
+    virtual ~sc_in_resolved();
+
+    virtual void end_of_elaboration();
+
+    virtual const char *kind() const;
+
+  private:
+    // Disabled
+    sc_in_resolved(const sc_in_resolved &) : sc_in<sc_dt::sc_logic>() {}
+    sc_in_resolved &
+    operator = (const sc_in_resolved &)
+    {
+        return *this;
+    }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_IN_RESOLVED_HH__
diff --git a/src/systemc/ext/channel/sc_in_rv.hh b/src/systemc/ext/channel/sc_in_rv.hh
new file mode 100644
index 0000000..eca2c0c
--- /dev/null
+++ b/src/systemc/ext/channel/sc_in_rv.hh
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_IN_RV_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_IN_RV_HH__
+
+#include "sc_in.hh"
+
+namespace sc_dt
+{
+
+template <int W>
+class sc_lv;
+
+} // namespace sc_dt
+
+namespace sc_core
+{
+
+template <int W>
+class sc_in_rv : public sc_in<sc_dt::sc_lv<W>>
+{
+  public:
+    sc_in_rv() : sc_in<sc_dt::sc_lv<W>>() {}
+    explicit sc_in_rv(const char *name) : sc_in<sc_dt::sc_lv<W>>(name) {}
+    virtual ~sc_in_rv() {};
+
+    virtual void end_of_elaboration() {}
+
+    virtual const char *kind() const { return "sc_in_rv"; }
+
+  private:
+    // Disabled
+    sc_in_rv(const sc_in_rv<W> &) : sc_in<sc_dt::sc_lv<W>>() {}
+    sc_in_rv<W> &operator = (const sc_in_rv<W> &) { *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_IN_RV_HH__
diff --git a/src/systemc/ext/channel/sc_inout.hh b/src/systemc/ext/channel/sc_inout.hh
new file mode 100644
index 0000000..1802b2e
--- /dev/null
+++ b/src/systemc/ext/channel/sc_inout.hh
@@ -0,0 +1,466 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_INOUT_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_INOUT_HH__
+
+#include <string>
+
+#include "../core/sc_port.hh"
+#include "sc_signal_inout_if.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_dt
+{
+
+class sc_logic;
+
+} // namespace sc_dt
+
+namespace sc_core
+{
+
+class sc_event;
+class sc_event_finder;
+class sc_trace_file;
+
+template <class T>
+class sc_inout : public sc_port<sc_signal_inout_if<T>, 1>
+{
+  public:
+    sc_inout() : sc_port<sc_signal_inout_if<T>, 1>() {}
+    explicit sc_inout(const char *name) :
+            sc_port<sc_signal_inout_if<T>, 1>(name)
+    {}
+    virtual ~sc_inout() {}
+
+    void
+    initialize(const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    initialize(const sc_signal_in_if<T> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void end_of_elaboration() {}
+
+    const T &
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const T *)nullptr;
+    }
+    operator const T& () const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const T *)nullptr;
+    }
+
+    void
+    write(const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    sc_inout<T> &
+    operator = (const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<T> *)nullptr;
+    }
+    sc_inout<T> &
+    operator = (const sc_signal_in_if<T> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<T> *)nullptr;
+    }
+    sc_inout<T> &
+    operator = (const sc_port<sc_signal_in_if<T>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<T> *)nullptr;
+    }
+    sc_inout<T> &
+    operator = (const sc_port<sc_signal_inout_if<T>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<T> *)nullptr;
+    }
+    sc_inout<T> &
+    operator = (const sc_inout<T> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<T> *)nullptr;
+    }
+
+    const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    sc_event_finder &
+    value_changed() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+
+    virtual const char *kind() const { return "sc_inout"; }
+
+  private:
+    // Disabled
+    sc_inout(const sc_inout<T> &) : sc_port<sc_signal_inout_if<T>, 1>() {}
+};
+
+template <class T>
+inline void
+sc_trace(sc_trace_file *, const sc_inout<T> &, const std::string &)
+{
+    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+}
+
+template <>
+class sc_inout<bool> : public sc_port<sc_signal_inout_if<bool>, 1>
+{
+  public:
+    sc_inout() : sc_port<sc_signal_inout_if<bool>, 1>() {}
+    explicit sc_inout(const char *name) :
+            sc_port<sc_signal_inout_if<bool>, 1>(name)
+    {}
+    virtual ~sc_inout() {}
+
+    void
+    initialize(const bool &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    initialize(const sc_signal_in_if<bool> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void end_of_elaboration() {}
+
+    const bool &
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(bool *)nullptr;
+    }
+    operator const bool& () const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(bool *)nullptr;
+    }
+
+    void
+    write(const bool &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    sc_inout<bool> &
+    operator = (const bool &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<bool> *)nullptr;
+    }
+    sc_inout<bool> &
+    operator = (const sc_signal_in_if<bool> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<bool> *)nullptr;
+    }
+    sc_inout<bool> &
+    operator = (const sc_port<sc_signal_in_if<bool>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<bool> *)nullptr;
+    }
+    sc_inout<bool> &
+    operator = (const sc_port<sc_signal_inout_if<bool>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<bool> *)nullptr;
+    }
+    sc_inout<bool> &
+    operator = (const sc_inout<bool> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<bool> *)nullptr;
+    }
+
+    const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    const sc_event &
+    posedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    const sc_event &
+    negedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+
+    bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    bool
+    posedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    bool
+    negedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+
+    sc_event_finder &
+    value_changed() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    sc_event_finder &
+    pos() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    sc_event_finder &
+    neg() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+
+    virtual const char *kind() const { return "sc_inout"; }
+
+  private:
+    // Disabled
+    sc_inout(const sc_inout<bool> &) :
+            sc_port<sc_signal_inout_if<bool>, 1>() {}
+};
+
+template <>
+inline void sc_trace<bool>(
+        sc_trace_file *, const sc_inout<bool> &, const std::string &)
+{
+    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+}
+
+template <>
+class sc_inout<sc_dt::sc_logic> :
+        public sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1>
+{
+  public:
+    sc_inout() : sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1>() {}
+    explicit sc_inout(const char *name) :
+            sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1>(name)
+    {}
+    virtual ~sc_inout() {}
+
+    void
+    initialize(const sc_dt::sc_logic &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    void
+    initialize(const sc_signal_in_if<sc_dt::sc_logic> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void end_of_elaboration() {}
+
+    const sc_dt::sc_logic &
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_dt::sc_logic *)nullptr;
+    }
+    operator const sc_dt::sc_logic& () const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_dt::sc_logic *)nullptr;
+    }
+
+    void
+    write(const sc_dt::sc_logic &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    sc_inout<sc_dt::sc_logic> &
+    operator = (const sc_dt::sc_logic &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<sc_dt::sc_logic> *)nullptr;
+    }
+    sc_inout<sc_dt::sc_logic> &
+    operator = (const sc_signal_in_if<sc_dt::sc_logic> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<sc_dt::sc_logic> *)nullptr;
+    }
+    sc_inout<sc_dt::sc_logic> &
+    operator = (const sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<sc_dt::sc_logic> *)nullptr;
+    }
+    sc_inout<sc_dt::sc_logic> &
+    operator = (const sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<sc_dt::sc_logic> *)nullptr;
+    }
+    sc_inout<sc_dt::sc_logic> &
+    operator = (const sc_inout<sc_dt::sc_logic> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_inout<sc_dt::sc_logic> *)nullptr;
+    }
+
+    const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    const sc_event &
+    posedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    const sc_event &
+    negedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+
+    bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    bool
+    posedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    bool
+    negedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+
+    sc_event_finder &
+    value_changed() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    sc_event_finder &
+    pos() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+    sc_event_finder &
+    neg() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event_finder *)nullptr;
+    }
+
+    virtual const char *kind() const { return "sc_inout"; }
+
+  private:
+    // Disabled
+    sc_inout(const sc_inout<sc_dt::sc_logic> &) :
+            sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1>()
+    {}
+};
+
+template <>
+inline void
+sc_trace<sc_dt::sc_logic>(sc_trace_file *, const sc_inout<sc_dt::sc_logic> &,
+                          const std::string &)
+{
+    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+}
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_INOUT_HH__
diff --git a/src/systemc/ext/channel/sc_inout_resolved.hh b/src/systemc/ext/channel/sc_inout_resolved.hh
new file mode 100644
index 0000000..3fea32f
--- /dev/null
+++ b/src/systemc/ext/channel/sc_inout_resolved.hh
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_INOUT_RESOLVED_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_INOUT_RESOLVED_HH__
+
+#include "sc_inout.hh"
+#include "sc_signal_in_if.hh"
+#include "sc_signal_inout_if.hh"
+#include "warn_unimpl.hh"
+
+namespace
+{
+
+class sc_logic;
+
+}
+
+namespace sc_core
+{
+
+class sc_inout_resolved : public sc_inout<sc_dt::sc_logic>
+{
+  public:
+    sc_inout_resolved();
+    explicit sc_inout_resolved(const char *name);
+    virtual ~sc_inout_resolved();
+
+    virtual void end_of_elaboration();
+
+    sc_inout_resolved &operator = (const sc_dt::sc_logic &);
+    sc_inout_resolved &operator = (const sc_signal_in_if<sc_dt::sc_logic> &);
+    sc_inout_resolved &operator = (
+            const sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &);
+    sc_inout_resolved &operator = (
+            const sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &);
+    sc_inout_resolved &operator = (const sc_inout_resolved &);
+
+    virtual const char *kind() const;
+
+  private:
+    // Disabled
+    sc_inout_resolved(const sc_inout_resolved &) :
+            sc_inout<sc_dt::sc_logic>() {}
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_INOUT_RESOLVED_HH__
diff --git a/src/systemc/ext/channel/sc_inout_rv.hh b/src/systemc/ext/channel/sc_inout_rv.hh
new file mode 100644
index 0000000..f231d93
--- /dev/null
+++ b/src/systemc/ext/channel/sc_inout_rv.hh
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_INOUT_RV_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_INOUT_RV_HH__
+
+#include "../core/sc_port.hh"
+#include "sc_signal_in_if.hh"
+#include "sc_signal_inout_if.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_dt
+{
+
+template <int W>
+class sc_lv;
+
+} // namespace sc_dt
+
+namespace sc_core
+{
+
+template <int W>
+class sc_inout_rv : public sc_inout<sc_dt::sc_lv<W>>
+{
+  public:
+    sc_inout_rv() : sc_inout<sc_dt::sc_lv<W>>() {}
+    explicit sc_inout_rv(const char *name) : sc_inout<sc_dt::sc_lv<W>>(name) {}
+    virtual ~sc_inout_rv() {}
+
+    sc_inout_rv<W> &
+    operator = (const sc_dt::sc_lv<W> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_inout_rv<W> &
+    operator = (const sc_signal_in_if<sc_dt::sc_lv<W>> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_inout_rv<W> &
+    operator = (const sc_port<sc_signal_in_if<sc_dt::sc_lv<W>>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_inout_rv<W> &
+    operator = (const sc_port<sc_signal_inout_if<sc_dt::sc_lv<W>>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_inout_rv<W> &
+    operator = (const sc_inout_rv<W> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+
+    virtual void end_of_elaboration() {};
+
+    virtual const char *kind() const { return "sc_inout_rv"; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_INOUT_RV_HH__
diff --git a/src/systemc/ext/channel/sc_mutex.hh b/src/systemc/ext/channel/sc_mutex.hh
new file mode 100644
index 0000000..af35bdd
--- /dev/null
+++ b/src/systemc/ext/channel/sc_mutex.hh
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_MUTEX_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_MUTEX_HH__
+
+#include "../core/sc_object.hh"
+#include "sc_mutex_if.hh"
+
+namespace sc_core
+{
+
+class sc_mutex : public sc_mutex_if, public sc_object
+{
+  public:
+    sc_mutex();
+    explicit sc_mutex(const char *name);
+
+    virtual int lock();
+    virtual int trylock();
+    virtual int unlock();
+
+    virtual const char *kind() const;
+
+  private:
+    // Disabled
+    sc_mutex(const sc_mutex &) : sc_interface(), sc_mutex_if(), sc_object() {}
+    sc_mutex &operator = (const sc_mutex &) { return *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_MUTEX_HH__
diff --git a/src/systemc/ext/channel/sc_mutex_if.hh b/src/systemc/ext/channel/sc_mutex_if.hh
new file mode 100644
index 0000000..97044ed
--- /dev/null
+++ b/src/systemc/ext/channel/sc_mutex_if.hh
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_MUTEX_IF_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_MUTEX_IF_HH__
+
+#include "../core/sc_interface.hh"
+
+namespace sc_core
+{
+
+class sc_mutex_if : virtual public sc_interface
+{
+  public:
+    virtual int lock() = 0;
+    virtual int trylock() = 0;
+    virtual int unlock() = 0;
+
+  protected:
+    sc_mutex_if() : sc_interface() {}
+
+  private:
+    // Disabled
+    sc_mutex_if(const sc_mutex_if &) : sc_interface() {}
+    sc_mutex_if &operator = (const sc_mutex_if &) { return *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_MUTEX_IF_HH__
diff --git a/src/systemc/ext/channel/sc_out.hh b/src/systemc/ext/channel/sc_out.hh
new file mode 100644
index 0000000..e55a821
--- /dev/null
+++ b/src/systemc/ext/channel/sc_out.hh
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_OUT_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_OUT_HH__
+
+#include "../core/sc_port.hh"
+#include "sc_inout.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_core
+{
+
+template <class T>
+class sc_out : public sc_inout<T>
+{
+  public:
+    sc_out() : sc_inout<T>() {}
+    explicit sc_out(const char *name) : sc_inout<T>(name) {}
+    virtual ~sc_out() {}
+
+    sc_out<T> &
+    operator = (const T &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_out<T> *)nullptr;
+    }
+    sc_out<T> &
+    operator = (const sc_signal_in_if<T> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_out<T> *)nullptr;
+    }
+    sc_out<T> &
+    operator = (const sc_port<sc_signal_in_if<T>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_out<T> *)nullptr;
+    }
+    sc_out<T> &
+    operator = (const sc_port<sc_signal_inout_if<T>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_out<T> *)nullptr;
+    }
+    sc_out<T> &
+    operator = (const sc_out<T> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_out<T> *)nullptr;
+    }
+
+    virtual const char *kind() const { return "sc_out"; }
+
+  private:
+    // Disabled
+    sc_out(const sc_out<T> &) : sc_inout<T>() {}
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_OUT_HH__
diff --git a/src/systemc/ext/channel/sc_out_resolved.hh b/src/systemc/ext/channel/sc_out_resolved.hh
new file mode 100644
index 0000000..8f4aa52
--- /dev/null
+++ b/src/systemc/ext/channel/sc_out_resolved.hh
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_OUT_RESOLVED_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_OUT_RESOLVED_HH__
+
+#include "sc_out.hh"
+#include "sc_signal_in_if.hh"
+#include "sc_signal_inout_if.hh"
+#include "warn_unimpl.hh"
+
+namespace
+{
+
+class sc_logic;
+
+}
+
+namespace sc_core
+{
+
+class sc_out_resolved : public sc_out<sc_dt::sc_logic>
+{
+  public:
+    sc_out_resolved();
+    explicit sc_out_resolved(const char *name);
+    virtual ~sc_out_resolved();
+
+    sc_out_resolved &operator = (const sc_dt::sc_logic &);
+    sc_out_resolved &operator = (const sc_signal_in_if<sc_dt::sc_logic> &);
+    sc_out_resolved &operator = (
+            const sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &);
+    sc_out_resolved &operator = (
+            const sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &);
+    sc_out_resolved &operator = (const sc_out_resolved &);
+
+    virtual const char *kind() const;
+
+  private:
+    // Disabled
+    sc_out_resolved(const sc_out_resolved &) : sc_out<sc_dt::sc_logic>() {}
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_OUT_RESOLVED_HH__
diff --git a/src/systemc/ext/channel/sc_out_rv.hh b/src/systemc/ext/channel/sc_out_rv.hh
new file mode 100644
index 0000000..af5b055
--- /dev/null
+++ b/src/systemc/ext/channel/sc_out_rv.hh
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_OUT_RV_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_OUT_RV_HH__
+
+#include "../core/sc_port.hh"
+#include "sc_inout_rv.hh"
+#include "sc_signal_in_if.hh"
+#include "sc_signal_inout_if.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_dt
+{
+
+template <int W>
+class sc_lv;
+
+} // namespace sc_dt
+
+namespace sc_core
+{
+
+template <int W>
+class sc_out_rv : public sc_inout_rv<W>
+{
+  public:
+    sc_out_rv() : sc_inout_rv<W>() {}
+    explicit sc_out_rv(const char *name) : sc_inout_rv<W>(name) {}
+    virtual ~sc_out_rv() {};
+
+    sc_out_rv<W> &
+    operator = (const sc_dt::sc_lv<W> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_out_rv<W> &
+    operator = (const sc_signal_in_if<sc_dt::sc_lv<W>> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_out_rv<W> &
+    operator = (const sc_port<sc_signal_in_if<sc_dt::sc_lv<W>>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_out_rv<W> &
+    operator = (const sc_port<sc_signal_inout_if<sc_dt::sc_lv<W>>, 1> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_out_rv<W> &
+    operator = (const sc_out_rv<W> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+
+    virtual const char *kind() const { return "sc_out_rv"; }
+
+  private:
+    // Disabled
+    sc_out_rv(const sc_out_rv<W> &) : sc_inout_rv<W>() {}
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_OUT_RV_HH__
diff --git a/src/systemc/ext/channel/sc_semaphore.hh b/src/systemc/ext/channel/sc_semaphore.hh
new file mode 100644
index 0000000..fb1e825
--- /dev/null
+++ b/src/systemc/ext/channel/sc_semaphore.hh
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_HH__
+
+#include "../core/sc_object.hh"
+#include "sc_semaphore_if.hh"
+
+namespace sc_core
+{
+
+class sc_semaphore : public sc_semaphore_if, public sc_object
+{
+  public:
+    explicit sc_semaphore(int);
+    sc_semaphore(const char *name, int);
+
+    virtual int wait();
+    virtual int trywait();
+    virtual int post();
+    virtual int get_value() const;
+
+    virtual const char *kind() const;
+
+  private:
+    // Disabled
+    sc_semaphore(const sc_semaphore &) :
+            sc_interface(), sc_semaphore_if(), sc_object()
+    {}
+
+    sc_semaphore &operator = (const sc_semaphore &) { return *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_HH__
diff --git a/src/systemc/ext/channel/sc_semaphore_if.hh b/src/systemc/ext/channel/sc_semaphore_if.hh
new file mode 100644
index 0000000..2beb9b7
--- /dev/null
+++ b/src/systemc/ext/channel/sc_semaphore_if.hh
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_IF_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_IF_HH__
+
+#include "../core/sc_interface.hh"
+
+namespace sc_core
+{
+
+class sc_semaphore_if : virtual public sc_interface
+{
+  public:
+    virtual int wait() = 0;
+    virtual int trywait() = 0;
+    virtual int post() = 0;
+    virtual int get_value() const = 0;
+
+  protected:
+    sc_semaphore_if() : sc_interface() {}
+
+  private:
+    // Disabled
+    sc_semaphore_if(const sc_semaphore_if &) : sc_interface() {}
+    sc_semaphore_if &operator = (const sc_semaphore_if &) { return *this; }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_IF_HH__
diff --git a/src/systemc/ext/channel/sc_signal.hh b/src/systemc/ext/channel/sc_signal.hh
new file mode 100644
index 0000000..e1ed619
--- /dev/null
+++ b/src/systemc/ext/channel/sc_signal.hh
@@ -0,0 +1,414 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__
+
+#include <iostream>
+
+#include "../core/sc_module.hh" // for sc_gen_unique_name
+#include "../core/sc_prim.hh"
+#include "sc_signal_inout_if.hh"
+#include "warn_unimpl.hh" // for warn_unimpl
+
+namespace sc_core
+{
+
+class sc_port_base;
+
+template <class T, sc_writer_policy WRITER_POLICY=SC_ONE_WRITER>
+class sc_signal : public sc_signal_inout_if<T>,
+                  public sc_prim_channel
+{
+  public:
+    sc_signal() : sc_signal_inout_if<T>(),
+                  sc_prim_channel(sc_gen_unique_name("signal"))
+    {}
+    explicit sc_signal(const char *name) : sc_signal_inout_if<T>(),
+                                           sc_prim_channel(name)
+    {}
+    virtual ~sc_signal() {}
+
+    virtual void
+    register_port(sc_port_base &, const char *)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual const T&
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const T *)nullptr;
+    }
+    operator const T&() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const T *)nullptr;
+    }
+
+    virtual sc_writer_policy
+    get_writer_policy() const
+    {
+        return WRITER_POLICY;
+    }
+    virtual void
+    write(const T&)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    sc_signal<T, WRITER_POLICY> &
+    operator = (const T&)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_signal<T, WRITER_POLICY> &
+    operator = (const sc_signal<T, WRITER_POLICY> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+
+    virtual const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    virtual const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    virtual bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+
+    virtual void
+    print(std::ostream & =std::cout) const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual void
+    dump(std::ostream & =std::cout) const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual const char *kind() const { return "sc_signal"; }
+
+  protected:
+    virtual void
+    update()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+  private:
+    // Disabled
+    sc_signal(const sc_signal<T, WRITER_POLICY> &) :
+            sc_signal_inout_if<T>(), sc_prim_channel("")
+    {}
+};
+
+template <class T, sc_writer_policy WRITER_POLICY>
+inline std::ostream &
+operator << (std::ostream &os, const sc_signal<T, WRITER_POLICY> &)
+{
+    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    return os;
+}
+
+template <sc_writer_policy WRITER_POLICY>
+class sc_signal<bool, WRITER_POLICY> :
+    public sc_signal_inout_if<bool>, public sc_prim_channel
+{
+  public:
+    sc_signal()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    explicit sc_signal(const char *)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual ~sc_signal()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    register_port(sc_port_base &, const char *)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual const bool &
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const bool *)nullptr;
+    }
+    operator const bool &() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const bool *)nullptr;
+    }
+
+    virtual sc_writer_policy
+    get_writer_policy() const
+    {
+        return WRITER_POLICY;
+    }
+    virtual void
+    write(const bool &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    sc_signal<bool, WRITER_POLICY> &
+    operator = (const bool &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_signal<bool, WRITER_POLICY> &
+    operator = (const sc_signal<bool, WRITER_POLICY> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+
+    virtual const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+
+    virtual const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    virtual const sc_event &
+    posedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    virtual const sc_event &
+    negedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+
+    virtual bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    virtual bool
+    posedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    virtual bool
+    negedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+
+    virtual void
+    print(std::ostream & =std::cout) const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual void
+    dump(std::ostream & =std::cout) const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual const char *kind() const { return "sc_signal"; }
+
+  protected:
+    virtual void
+    update()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+  private:
+    // Disabled
+    sc_signal(const sc_signal<bool, WRITER_POLICY> &) :
+            sc_signal_inout_if<bool>(), sc_prim_channel("")
+    {}
+};
+
+template <sc_writer_policy WRITER_POLICY>
+class sc_signal<sc_dt::sc_logic, WRITER_POLICY> :
+    public sc_signal_inout_if<sc_dt::sc_logic>, public sc_prim_channel
+{
+  public:
+    sc_signal()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    explicit sc_signal(const char *)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual ~sc_signal()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    register_port(sc_port_base &, const char *)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual const sc_dt::sc_logic &
+    read() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_dt::sc_logic *)nullptr;
+    }
+    operator const sc_dt::sc_logic &() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(const sc_dt::sc_logic *)nullptr;
+    }
+
+    virtual sc_writer_policy
+    get_writer_policy() const
+    {
+        return WRITER_POLICY;
+    }
+    virtual void
+    write(const sc_dt::sc_logic &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    sc_signal<sc_dt::sc_logic, WRITER_POLICY> &
+    operator = (const sc_dt::sc_logic &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_signal<sc_dt::sc_logic, WRITER_POLICY> &
+    operator = (const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+
+    virtual const sc_event &
+    default_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+
+    virtual const sc_event &
+    value_changed_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    virtual const sc_event &
+    posedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+    virtual const sc_event &
+    negedge_event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *(sc_event *)nullptr;
+    }
+
+    virtual bool
+    event() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    virtual bool
+    posedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+    virtual bool
+    negedge() const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return false;
+    }
+
+    virtual void
+    print(std::ostream & =std::cout) const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual void
+    dump(std::ostream & =std::cout) const
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    virtual const char *kind() const { return "sc_signal"; }
+
+  protected:
+    virtual void
+    update()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+  private:
+    // Disabled
+    sc_signal(const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &) :
+            sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel("")
+    {}
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__
diff --git a/src/systemc/ext/channel/sc_signal_in_if.hh b/src/systemc/ext/channel/sc_signal_in_if.hh
new file mode 100644
index 0000000..6fac358
--- /dev/null
+++ b/src/systemc/ext/channel/sc_signal_in_if.hh
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_IN_IF_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_IN_IF_HH__
+
+#include "../core/sc_interface.hh"
+
+namespace sc_dt
+{
+
+class sc_logic;
+
+};
+
+namespace sc_core
+{
+
+class sc_event;
+
+template <class T>
+class sc_signal_in_if : virtual public sc_interface
+{
+  public:
+    virtual const T &read() const = 0;
+    virtual const sc_event &value_changed_event() const = 0;
+    virtual bool event() const = 0;
+
+  protected:
+    sc_signal_in_if() : sc_interface() {}
+
+  private:
+    // Disabled
+    sc_signal_in_if(const sc_signal_in_if<T> &) : sc_interface() {}
+    sc_signal_in_if<T> &
+    operator = (const sc_signal_in_if<T> &)
+    {
+        return *this;
+    }
+};
+
+template <>
+class sc_signal_in_if<bool> : virtual public sc_interface
+{
+  public:
+    virtual const bool &read() const = 0;
+
+    virtual const sc_event &value_changed_event() const = 0;
+    virtual const sc_event &posedge_event() const = 0;
+    virtual const sc_event &negedge_event() const = 0;
+
+    virtual bool event() const = 0;
+    virtual bool posedge() const = 0;
+    virtual bool negedge() const = 0;
+
+  protected:
+    sc_signal_in_if() : sc_interface() {}
+
+  private:
+    // Disabled
+    sc_signal_in_if(const sc_signal_in_if<bool> &) : sc_interface() {}
+    sc_signal_in_if<bool> &
+    operator = (const sc_signal_in_if<bool> &)
+    {
+        return *this;
+    }
+};
+
+template <>
+class sc_signal_in_if<sc_dt::sc_logic> : virtual public sc_interface
+{
+  public:
+    virtual const sc_dt::sc_logic &read() const = 0;
+
+    virtual const sc_event &value_changed_event() const = 0;
+    virtual const sc_event &posedge_event() const = 0;
+    virtual const sc_event &negedge_event() const = 0;
+
+    virtual bool event() const = 0;
+    virtual bool posedge() const = 0;
+    virtual bool negedge() const = 0;
+
+  protected:
+    sc_signal_in_if() : sc_interface() {}
+
+  private:
+    // Disabled
+    sc_signal_in_if(const sc_signal_in_if<sc_dt::sc_logic> &) :
+            sc_interface()
+    {}
+    sc_signal_in_if<sc_dt::sc_logic> &
+    operator = (const sc_signal_in_if<sc_dt::sc_logic> &)
+    {
+        return *this;
+    }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_IN_IF_HH__
diff --git a/src/systemc/ext/channel/sc_signal_inout_if.hh b/src/systemc/ext/channel/sc_signal_inout_if.hh
new file mode 100644
index 0000000..c39c4a5
--- /dev/null
+++ b/src/systemc/ext/channel/sc_signal_inout_if.hh
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_INOUT_IF_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_INOUT_IF_HH__
+
+#include "../core/sc_interface.hh"
+#include "sc_signal_in_if.hh"
+
+namespace sc_core
+{
+
+enum sc_writer_policy
+{
+    SC_ONE_WRITER,
+    SC_MANY_WRITERS
+};
+
+template <class T>
+class sc_signal_write_if : virtual public sc_interface
+{
+  public:
+    virtual sc_writer_policy
+    get_writer_policy() const
+    {
+        return SC_ONE_WRITER;
+    }
+    virtual void write(const T &) = 0;
+
+  protected:
+    sc_signal_write_if() : sc_interface() {}
+
+  private:
+    // Disabled
+    sc_signal_write_if(const sc_signal_write_if<T> &) : sc_interface() {}
+    sc_signal_write_if<T> &
+    operator = (const sc_signal_write_if<T> &)
+    {
+        return *this;
+    }
+};
+
+template <class T>
+class sc_signal_inout_if : public sc_signal_in_if<T>,
+                           public sc_signal_write_if<T>
+{
+  protected:
+    sc_signal_inout_if() : sc_signal_in_if<T>(), sc_signal_write_if<T>() {}
+
+  private:
+    // Disabled
+    sc_signal_inout_if(const sc_signal_inout_if<T> &) :
+        sc_signal_in_if<T>(), sc_signal_write_if<T>()
+    {}
+    sc_signal_inout_if<T> &
+    operator = (const sc_signal_inout_if<T> &)
+    {
+        return *this;
+    }
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_INOUT_IF_HH__
diff --git a/src/systemc/ext/channel/sc_signal_resolved.hh b/src/systemc/ext/channel/sc_signal_resolved.hh
new file mode 100644
index 0000000..f04fa36
--- /dev/null
+++ b/src/systemc/ext/channel/sc_signal_resolved.hh
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RESOLVED_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RESOLVED_HH__
+
+#include "sc_signal.hh"
+#include "sc_signal_inout_if.hh"
+
+namespace sc_dt
+{
+
+class sc_logic;
+
+};
+
+namespace sc_core
+{
+
+class sc_port_base;
+
+class sc_signal_resolved : public sc_signal<sc_dt::sc_logic, SC_MANY_WRITERS>
+{
+  public:
+    sc_signal_resolved();
+    explicit sc_signal_resolved(const char *name);
+    virtual ~sc_signal_resolved();
+
+    virtual void register_port(sc_port_base &, const char *);
+
+    virtual void write(const sc_dt::sc_logic &);
+    sc_signal_resolved &operator = (const sc_dt::sc_logic &);
+    sc_signal_resolved &operator = (const sc_signal_resolved &);
+
+    virtual const char *kind() const;
+
+  protected:
+    virtual void update();
+
+  private:
+    // Disabled
+    sc_signal_resolved(const sc_signal_resolved &) :
+            sc_interface(), sc_signal<sc_dt::sc_logic, SC_MANY_WRITERS>()
+    {}
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RESOLVED_HH__
diff --git a/src/systemc/ext/channel/sc_signal_rv.hh b/src/systemc/ext/channel/sc_signal_rv.hh
new file mode 100644
index 0000000..723c2b4
--- /dev/null
+++ b/src/systemc/ext/channel/sc_signal_rv.hh
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RV_HH__
+#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RV_HH__
+
+#include "../core/sc_module.hh" // for sc_gen_unique_name
+#include "sc_signal.hh"
+#include "warn_unimpl.hh"
+
+namespace sc_dt
+{
+
+template <int W>
+class sc_lv;
+
+};
+
+namespace sc_core
+{
+
+class sc_port_base;
+
+template <int W>
+class sc_signal_rv : public sc_signal<sc_dt::sc_lv<W>, SC_MANY_WRITERS>
+{
+  public:
+    sc_signal_rv() : sc_signal<sc_dt::sc_lv<W>, SC_MANY_WRITERS>(
+            sc_gen_unique_name("signal_rv"))
+    {}
+    sc_signal_rv(const char *name) :
+            sc_signal<sc_dt::sc_lv<W>, SC_MANY_WRITERS>(name)
+    {}
+    virtual ~sc_signal_rv() {}
+
+    virtual void
+    register_port(sc_port_base &, const char *)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+    virtual void
+    write(const sc_dt::sc_lv<W> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+    sc_signal_rv<W> &
+    operator = (const sc_dt::sc_lv<W> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+    sc_signal_rv<W> &
+    operator = (const sc_signal_rv<W> &)
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+        return *this;
+    }
+
+    virtual const char *kind() const { return "sc_signal_rv"; }
+
+  protected:
+    virtual void
+    update()
+    {
+        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
+    }
+
+  private:
+    // Disabled
+    sc_signal_rv(const sc_signal_rv<W> &) :
+            sc_signal<sc_dt::sc_lv<W>, SC_MANY_WRITERS>()
+    {}
+};
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RV_HH__
diff --git a/src/systemc/ext/channel/warn_unimpl.hh b/src/systemc/ext/channel/warn_unimpl.hh
new file mode 100644
index 0000000..8262ae2
--- /dev/null
+++ b/src/systemc/ext/channel/warn_unimpl.hh
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * 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
+ */
+
+#ifndef __SYSTEMC_EXT_CHANNEL_WARN_UNIMPL_HH__
+#define __SYSTEMC_EXT_CHANNEL_WARN_UNIMPL_HH__
+
+namespace sc_core
+{
+
+void sc_channel_warn_unimpl(const char *func);
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_EXT_CHANNEL_WARN_UNIMPL_HH__
diff --git a/src/systemc/ext/systemc b/src/systemc/ext/systemc
index f16a92e..633b84e 100644
--- a/src/systemc/ext/systemc
+++ b/src/systemc/ext/systemc
@@ -30,6 +30,7 @@
 #ifndef __SYSTEMC_EXT_SYSTEMC__
 #define __SYSTEMC_EXT_SYSTEMC__
 
+#include "channel/_channel.hh"
 #include "core/_core.hh"
 #include "dt/_dt.hh"
 
diff --git a/src/systemc/ext/systemc.h b/src/systemc/ext/systemc.h
index 77230d0..4b49272 100644
--- a/src/systemc/ext/systemc.h
+++ b/src/systemc/ext/systemc.h
@@ -33,6 +33,7 @@
 #include "systemc"
 
 // Collect "using" declarations for the various namespaces.
+#include "channel/_using.hh"
 #include "core/_using.hh"
 #include "dt/_using.hh"
 
