diff --git a/app/controllers/private_messages_controller.rb b/app/controllers/private_messages_controller.rb
index 8e74aa97411874c040d6b6bf847fe352d8784dcc..4128faa1461ef4de04a356bbe87f6480109afca3 100644
--- a/app/controllers/private_messages_controller.rb
+++ b/app/controllers/private_messages_controller.rb
@@ -1,2 +1,38 @@
 class PrivateMessagesController < ApplicationController
+  before_filter :authenticate_user!
+
+  respond_to :html
+
+  def index
+    @messages = PrivateMessage.joins(:private_message_visibilities).where(
+                              :private_message_visibilities => {:person_id => current_user.person.id}).all
+  end
+
+  def create
+    person_ids = Contact.where(:id => params[:private_message][:contact_ids]).map! do |contact|
+      contact.person_id
+    end
+
+    person_ids = person_ids | [current_user.person.id]
+
+    @message = PrivateMessage.new( :author => current_user.person, :participant_ids => person_ids, :message => params[:private_message][:message] )
+
+    if @message.save
+      Rails.logger.info("event=create type=private_message chars=#{params[:private_message][:message].length}")
+    end
+
+    respond_with @message
+  end
+
+  def show
+    @message = PrivateMessage.joins(:private_message_visibilities).where(:id => params[:id],
+                              :private_message_visibilities => {:person_id => current_user.person.id}).first
+
+    if @message
+      respond_with @message
+    else
+      redirect_to private_messages_path
+    end
+  end
+
 end
diff --git a/app/controllers/status_messages_controller.rb b/app/controllers/status_messages_controller.rb
index 77a6b3e5a508e72ff9e62f8057bd3d1cd64c333d..27806867159e602cd9f0a043bf5eb121eed3bc3c 100644
--- a/app/controllers/status_messages_controller.rb
+++ b/app/controllers/status_messages_controller.rb
@@ -80,7 +80,7 @@ class StatusMessagesController < ApplicationController
 
   def show
     @status_message = current_user.find_visible_post_by_id params[:id]
-    if @status_message
+    if @status_messag
       @object_aspect_ids = @status_message.aspects.map{|a| a.id}
 
       # mark corresponding notification as read
diff --git a/app/models/private_message.rb b/app/models/private_message.rb
index bf8079fe3891510b2809686c71c0a697ede80848..899e55784f8f006bc44e5a4565bb494757f0310a 100644
--- a/app/models/private_message.rb
+++ b/app/models/private_message.rb
@@ -1,5 +1,12 @@
 class PrivateMessage < ActiveRecord::Base
+  include ROXML
+  include Diaspora::Guid
+
   belongs_to :author, :class_name => 'Person'
   has_many :private_message_visibilities
-  has_many :recipients, :class_name => 'Person', :through => :private_message_visibilities, :source => :person
+  has_many :participants, :class_name => 'Person', :through => :private_message_visibilities, :source => :person
+
+  def recipients
+    self.participants - [self.author]
+  end
 end
diff --git a/app/views/private_messages/index.haml b/app/views/private_messages/index.haml
index 7fae50376f8cb086505d05ce1546c4088d0a89be..57780c3023836c53513d8ac2f0060b96da2bb122 100644
--- a/app/views/private_messages/index.haml
+++ b/app/views/private_messages/index.haml
@@ -3,3 +3,15 @@
 -#   the COPYRIGHT file.
 
 
+= link_to 'new message', new_private_message_path
+
+%br
+%br
+%br
+
+- for message in @messages
+  %b
+    = message.author.name
+  %br
+  = link_to message.message, message
+  %hr
diff --git a/app/views/private_messages/new.haml b/app/views/private_messages/new.haml
index ae2a260f6ed82d4333b06c852a313bea734c4b9b..ccc945125b401220a3c44d02b3ca9d2e97099b9c 100644
--- a/app/views/private_messages/new.haml
+++ b/app/views/private_messages/new.haml
@@ -9,7 +9,7 @@
 = form_for PrivateMessage.new do |private_message|
   %h4
     to
-  = private_message.text_field :recipients
+  = text_field_tag "private_message[contact_ids]"
 
   %h4
     message
diff --git a/app/views/private_messages/show.haml b/app/views/private_messages/show.haml
index 7fae50376f8cb086505d05ce1546c4088d0a89be..b80ca5e12dfa3e9595f1228a8f83b56b58db259d 100644
--- a/app/views/private_messages/show.haml
+++ b/app/views/private_messages/show.haml
@@ -2,4 +2,28 @@
 -#   licensed under the Affero General Public License version 3 or later.  See
 -#   the COPYRIGHT file.
 
+= link_to 'back', private_messages_path
 
+%br
+%br
+%br
+%br
+
+%h4
+  from
+= @message.author.name
+
+%br
+%br
+
+%h4
+  to
+- for recipient in @message.recipients
+  = recipient.name
+
+%br
+%br
+
+%h4
+  message
+= @message.message
diff --git a/spec/controllers/private_messages_controller_spec.rb b/spec/controllers/private_messages_controller_spec.rb
index 26bf325218ec9f2ee0dbaa292588f4220bf0a64a..4c30bc1ad22adbe54d0299b440d1cbc9cbed1173 100644
--- a/spec/controllers/private_messages_controller_spec.rb
+++ b/spec/controllers/private_messages_controller_spec.rb
@@ -1,5 +1,70 @@
 require 'spec_helper'
 
 describe PrivateMessagesController do
+  render_views
 
+  before do
+    @user1 = alice
+    sign_in :user, @user1
+  end
+
+  describe '#new' do
+    it 'succeeds' do
+      get :new
+      response.should be_success
+    end
+  end
+
+  describe '#index' do
+    it 'succeeds' do
+      get :index
+      response.should be_success
+    end
+
+    it 'retrieves all messages for a user' do
+      @create_hash = { :participant_ids => [@user1.contacts.first.person.id, @user1.person.id],
+      :author => @user1.person, :message => "cool stuff" }
+      3.times do
+        PrivateMessage.create(@create_hash)
+      end
+
+      get :index
+      assigns[:messages].count.should == 3
+    end
+  end
+
+  describe '#create' do
+    it 'creates a private message' do
+     message_hash = {:private_message => {
+                    :contact_ids => [@user1.contacts.first.id],
+                    :message => "secret stuff"}}
+
+
+      lambda {
+        post :create, message_hash
+      }.should change(PrivateMessage, :count).by(1)
+    end
+  end
+
+  describe '#show' do
+    before do
+      @create_hash = { :participant_ids => [@user1.contacts.first.person.id, @user1.person.id],
+      :author => @user1.person, :message => "cool stuff" }
+      @message = PrivateMessage.create(@create_hash)
+    end
+
+    it 'succeeds' do
+      get :show, :id => @message.id
+      response.should be_success
+      assigns[:message].should == @message
+    end
+
+    it 'does not let you access messages where you are not a recipient' do
+      user2 = eve
+      sign_in :user, user2
+
+      get :show, :id => @message.id
+      response.code.should == '302'
+    end
+  end
 end
diff --git a/spec/models/private_message_spec.rb b/spec/models/private_message_spec.rb
index 983209daee2f456b7997c3a471bbde1ae45a45c1..b37a57fbe44d5efb4b46dbaa3d58f325b7ed8fb0 100644
--- a/spec/models/private_message_spec.rb
+++ b/spec/models/private_message_spec.rb
@@ -1,5 +1,4 @@
 require 'spec_helper'
 
 describe PrivateMessage do
-  pending "add some examples to (or delete) #{__FILE__}"
 end