diff --git a/spec/factories/ban.rb b/spec/factories/ban.rb
new file mode 100644
index 0000000..81a5c7b
--- /dev/null
+++ b/spec/factories/ban.rb
@@ -0,0 +1,23 @@
+FactoryGirl.define do
+	factory :ban do
+		ban_type Ban::TYPE_SITE
+		expiry Date.today + 1
+		# Hack because of the awkward way bans are created (requires user_name)
+		before(:create) do |ban|
+			if ban.user.nil?
+				user = create :user
+				ban.user_name = user.username
+			else 
+				ban.user_name = ban.user.username
+			end
+		end
+	end
+
+	trait :mute do
+		ban_type Ban::TYPE_MUTE
+	end
+
+	trait :expired do
+		expiry Date.yesterday - 1
+	end
+end
\ No newline at end of file
diff --git a/spec/factories/message.rb b/spec/factories/message.rb
new file mode 100644
index 0000000..1f44662
--- /dev/null
+++ b/spec/factories/message.rb
@@ -0,0 +1,9 @@
+FactoryGirl.define do
+	factory :message do
+		association :sender, factory: :user
+		association :recipient, factory: :user
+		sequence(:text)    { |n| "text-#{n}" }
+		sequence(:title)    { |n| "title-#{n}" }
+		sequence(:text_parsed)    { |n| "text-#{n}" }
+	end
+end
\ No newline at end of file
diff --git a/spec/models/message_spec.rb b/spec/models/message_spec.rb
new file mode 100644
index 0000000..b0aa6ef
--- /dev/null
+++ b/spec/models/message_spec.rb
@@ -0,0 +1,57 @@
+# == Schema Information
+#
+# Table name: messages
+#
+#  id             :integer          not null, primary key
+#  sender_type    :string(255)
+#  sender_id      :integer
+#  recipient_type :string(255)
+#  recipient_id   :integer
+#  title          :string(255)
+#  text           :text
+#  created_at     :datetime
+#  updated_at     :datetime
+#  text_parsed    :text
+#
+
+require 'spec_helper'
+
+describe Message do
+	let!(:user) { create :user }
+
+	describe 'create' do
+		let(:message) { build :message }
+		it 'creates a new message' do
+			expect(message.valid?).to be_true
+			expect do
+				message.save!
+			end.to change(Message, :count).by(1)
+		end
+	end
+
+	describe 'Permissions' do
+		let(:message) { Message.new }
+		describe 'can_create?' do
+			it 'returns true for user' do
+				expect(message.can_create?(user)).to be_true
+			end
+			it 'returns false if user is banned' do
+				create :ban, :mute, user: user
+				expect(message.can_create?(user)).to be_false
+			end
+		end
+
+		describe 'can_show?' do
+			let!(:message) { create :message }
+			it 'returns true if sender' do
+				expect(message.can_show?(message.sender)).to be_true
+			end
+			it 'returns true if receiver' do
+				expect(message.can_show?(message.recipient)).to be_true
+			end
+			it 'returns false if neither sender nor receiver' do
+				expect(message.can_show?(user)).to be_false
+			end
+		end
+	end
+end
\ No newline at end of file