diff --git a/benchmarks/blocking_channel_test.go b/benchmarks/blocking_channel_test.go
new file mode 100644
index 0000000..2223efb
--- /dev/null
+++ b/benchmarks/blocking_channel_test.go
@@ -0,0 +1,23 @@
+package benchmarks
+
+import "testing"
+
+func BenchmarkBlockingChannel(b *testing.B) {
+	iterations := int64(b.N)
+	b.ReportAllocs()
+	b.ResetTimer()
+
+	channel := make(chan int64, 1024*16)
+	go func() {
+		for i := int64(0); i < iterations; i++ {
+			channel <- i
+		}
+	}()
+
+	for i := int64(0); i < iterations; i++ {
+		msg := <-channel
+		if msg != i {
+			panic("Out of sequence")
+		}
+	}
+}
diff --git a/benchmarks/non_blocking_channel_test.go b/benchmarks/non_blocking_channel_test.go
new file mode 100644
index 0000000..0867462
--- /dev/null
+++ b/benchmarks/non_blocking_channel_test.go
@@ -0,0 +1,34 @@
+package benchmarks
+
+import "testing"
+
+func BenchmarkNonBlockingChannel(b *testing.B) {
+	iterations := int64(b.N)
+	b.ReportAllocs()
+	b.ResetTimer()
+
+	channel := make(chan int64, 1024*16)
+	go func() {
+		for i := int64(0); i < iterations; {
+			select {
+			case channel <- i:
+				i++
+			default:
+				continue
+			}
+		}
+	}()
+
+	for i := int64(0); i < iterations; {
+		select {
+		case msg := <-channel:
+			if msg != i {
+				panic("Out of sequence")
+			} else {
+				i++
+			}
+		default:
+			continue
+		}
+	}
+}
diff --git a/benchmarks/single_writer_test.go b/benchmarks/single_writer_test.go
new file mode 100644
index 0000000..eadbdbe
--- /dev/null
+++ b/benchmarks/single_writer_test.go
@@ -0,0 +1,84 @@
+package benchmarks
+
+import (
+	"fmt"
+	"runtime"
+	"testing"
+
+	"github.com/smartystreets/go-disruptor"
+)
+
+const (
+	singleWriterRingBufferSize = 1024 * 64
+	singleWriterRingBufferMask = singleWriterRingBufferSize - 1
+	reserveOne                 = 1
+	reserveMany                = 16
+	reserveManyDelta           = reserveMany - 1
+)
+
+func BenchmarkDisruptorWriterReserveSingle(b *testing.B) {
+	ringBuffer := [singleWriterRingBufferSize]int64{}
+	written, read := disruptor.NewCursor(), disruptor.NewCursor()
+	reader := disruptor.NewReader(read, written, written, singleWriterConsumer{&ringBuffer})
+	writer := disruptor.NewWriter(written, read, singleWriterRingBufferSize)
+	reader.Start()
+
+	iterations := int64(b.N)
+	b.ReportAllocs()
+	b.ResetTimer()
+
+	sequence := disruptor.InitialSequenceValue
+	for sequence < iterations {
+		sequence = writer.Reserve(reserveOne)
+		ringBuffer[sequence&singleWriterRingBufferMask] = sequence
+		writer.Commit(sequence, sequence)
+	}
+
+	reader.Stop()
+}
+func BenchmarkDisruptorWriterReserveMultiple(b *testing.B) {
+	ringBuffer := [singleWriterRingBufferSize]int64{}
+	written, read := disruptor.NewCursor(), disruptor.NewCursor()
+	reader := disruptor.NewReader(read, written, written, singleWriterConsumer{&ringBuffer})
+	writer := disruptor.NewWriter(written, read, singleWriterRingBufferSize)
+	reader.Start()
+
+	iterations := int64(b.N)
+	b.ReportAllocs()
+	b.ResetTimer()
+
+	sequence := disruptor.InitialSequenceValue
+	for sequence < iterations {
+		sequence = writer.Reserve(reserveMany)
+
+		for i := sequence - reserveManyDelta; i <= sequence; i++ {
+			ringBuffer[i&singleWriterRingBufferMask] = i
+		}
+
+		writer.Commit(sequence, sequence)
+	}
+
+	reader.Stop()
+}
+
+func benchmarkSingleWriter(b *testing.B, maxClaim int64) {
+
+}
+
+type singleWriterConsumer struct {
+	ringBuffer *[singleWriterRingBufferSize]int64
+}
+
+func (this singleWriterConsumer) Consume(lower, upper int64) {
+	for lower <= upper {
+		message := this.ringBuffer[lower&singleWriterRingBufferMask]
+		if message != lower {
+			panic(fmt.Sprintf("\nRace condition %d %d\n", lower, message))
+		}
+		lower++
+	}
+}
+
+func init() {
+	runtime.GOMAXPROCS(2)
+}
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..d4186fb
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,41 @@
+Notes
+=====
+
+Disruptor Overview
+----------------------------
+
+This is a port of the [LMAX Disruptor](https://github.com/LMAX-Exchange/disruptor) into the Go programming language. It retains the essence and spirit of the Disruptor and utilizes a lot of the same abstractions and concepts, but does not maintain the same API.
+
+On my MacBook Pro (Intel Core i7 3740QM @ 2.7 Ghz) using Go 1.2.1, I was able to push over **700 million messages per second** (yes, you read that right) from one goroutine to another goroutine. The message being transferred between the two CPU cores was simply the incrementing sequence number, but literally could be anything. Note that your mileage may vary and that different operating systems can introduce significant “jitter” into the application by taking control of the CPU. Linux and Windows have the ability to assign a given process to specific CPU cores which reduces jitter significantly.  Parenthetically, when the Disruptor code is compiled and run on a Nexus 5, it can push about 15-20 million messages per second.
+
+Once initialized and running, one of the preeminent design considerations of the Disruptor is to produce no garbage thus avoiding the need for GC altogether and to avoid locks at all costs. The current channel implementation maintains a big, fat lock around enqueue/dequeue operations and maxes out on the aforementioned hardware at about 25M messages per second for uncontended access-—more than an order of magnitude slower when compared to the Disruptor.  The same channel, when contended between OS threads (`GOMAXPROCS=2` or more) only pushes about 7 million messages per second.
+
+Benchmarks
+----------------------------
+Each of the following benchmark tests sends an incrementing sequence message from one goroutine to another. The receiving goroutine asserts that the message is received is the expected incrementing sequence value. Any failures cause a panic. All tests were run using `GOMAXPROCS=2`.
+
+Scenario | Per Operation Time
+-------- | ------------------ 
+Channel: Non-blocking | 681 ns/op
+Channel: Blocking | 86.6 ns/op|
+Disruptor: SharedWriter (single claim)	| nn.n ns/op
+Disruptor: SharedWriter (multi claim)	| nn.n ns/op
+Disruptor: Writer (single claim) | 4.3 ns/op
+Disruptor: Writer (multi claim) | 1.1 ns/op
+
+
+When In Doubt, Use Channels
+----------------------------
+Despite Go channels being significantly slower than the Disruptor, channels should still be considered the best and most desirable choice for the vast majority of all use cases. The Disruptor's target use case is ultra-low latency environments where application response times are measured in nanoseconds and where stable, consistent latency is paramount.
+
+Pre-Alpha
+---------
+This code is pre-Alpha stage and is not supported or recommended for production environments. That being said, it has been run non-stop for days without exposing any race conditions. Also, it does not yet contain any unit tests and is meant to be spike code to serve as a proof of concept that the Disruptor is, in fact possible, on the Go runtime despite some of the limits imposed by the Go memory model. The goal is to have an alpha release by mid June 2014 and a series of beta releases each month thereafter until we are satisfied. Following this, a release will be created and supported moving forward.
+
+We are very interested to receive feedback on this project and how performance can be improved using subtle techniques such as additional cache line padding, utilizing a pointer vs a struct in a given location, replacing less optimal techniques with more optimal ones, especially in the performance critical paths of `Reserve`/`Commit` in the various `Writer`s and `Receive`/`Commit` in the `Reader`
+
+Caveats
+-------
+One last caveat worth noting.  In the Java-based Disruptor implementation, a ring buffer is created,  preallocated, and prepopulated with instances of the class which serve as the message type to be transferred between threads.  Because Go lacks generics, we have opted to not interact with ring buffers at all within the library code. This has the benefit of avoiding an unnecessary type conversion ("cast") during the receipt of a given message from type `interface{}` to a concrete type.  It also means that it is the responsibility of the application developer to create and populate their particular ring buffer during application wireup. Prepopulating the ring buffer at startup should ensure contiguous memory allocation for all items in the various ring buffer slots, whereas on-the-fly creation may introduce gaps in the memory allocation and subsequent CPU cache misses.
+
+The reference to the ring buffer can easily be scoped as a package-level variable. The reason for this is that any given application should have very few Disruptor instances. The instances are designed to be created at startup and stopped during shutdown. They are not typically meant to be created adhoc and passed around. In any case, it is the responsibility of the application developer to manage references to the ring buffer instances such that the producer can push messages in and the consumers can receive messages out.
\ No newline at end of file
diff --git a/shared_writer.go b/shared_writer.go
new file mode 100644
index 0000000..aa8b4e2
--- /dev/null
+++ b/shared_writer.go
@@ -0,0 +1,49 @@
+package disruptor
+
+import "sync/atomic"
+
+type SharedWriter struct {
+	written   *Cursor
+	upstream  Barrier
+	capacity  int64
+	gate      *Cursor
+	mask      int64
+	shift     uint8
+	committed []int32
+}
+
+func NewSharedWriter(write *SharedWriterBarrier, upstream Barrier) *SharedWriter {
+	return &SharedWriter{
+		written:   write.written,
+		upstream:  upstream,
+		capacity:  write.capacity,
+		gate:      NewCursor(),
+		mask:      write.mask,
+		shift:     write.shift,
+		committed: write.committed,
+	}
+}
+
+func (this *SharedWriter) Reserve(count int64) int64 {
+	for {
+		previous := this.written.Load()
+		upper := previous + count
+
+		if previous-this.capacity > this.gate.Load() {
+			this.gate.Store(this.upstream.Read(0))
+		}
+
+		if atomic.CompareAndSwapInt64(&this.written.sequence, previous, upper) {
+			return upper
+		}
+	}
+}
+
+func (this *SharedWriter) Commit(lower, upper int64) {
+	// POTENTIAL TODO: start from upper and work toward lower
+	// this may have the effect of keeping a batch together which
+	// might otherwise be split up...
+	for shift, mask := this.shift, this.mask; lower <= upper; lower++ {
+		this.committed[lower&mask] = int32(lower >> shift)
+	}
+}
diff --git a/shared_writer_barrier.go b/shared_writer_barrier.go
new file mode 100644
index 0000000..0283e59
--- /dev/null
+++ b/shared_writer_barrier.go
@@ -0,0 +1,43 @@
+package disruptor
+
+import "math"
+
+type SharedWriterBarrier struct {
+	written   *Cursor
+	committed []int32
+	capacity  int64
+	mask      int64
+	shift     uint8
+}
+
+func NewSharedWriterBarrier(written *Cursor, capacity int64) *SharedWriterBarrier {
+	assertPowerOfTwo(capacity)
+
+	return &SharedWriterBarrier{
+		written:   written,
+		committed: prepareCommitBuffer(capacity),
+		capacity:  capacity,
+		mask:      capacity - 1,
+		shift:     uint8(math.Log2(float64(capacity))),
+	}
+}
+func prepareCommitBuffer(capacity int64) []int32 {
+	buffer := make([]int32, capacity)
+	for i := range buffer {
+		buffer[i] = int32(InitialSequenceValue)
+	}
+	return buffer
+}
+
+func (this *SharedWriterBarrier) Read(lower int64) int64 {
+	shift, mask := this.shift, this.mask
+	upper := this.written.Load()
+
+	for ; lower <= upper; lower++ {
+		if this.committed[lower&mask] != int32(lower>>shift) {
+			return lower - 1
+		}
+	}
+
+	return upper
+}
