diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,4 @@
+#!/usr/bin/env runghc
+
+import Distribution.Simple
+main = defaultMain
diff --git a/frame-markdown.cabal b/frame-markdown.cabal
new file mode 100644
--- /dev/null
+++ b/frame-markdown.cabal
@@ -0,0 +1,22 @@
+Name: frame-markdown
+Version: 0.1
+Cabal-version: >= 1.2
+Build-type: Simple
+Copyright: Adam Dunkley
+Maintainer: "Adam Dunkley" <acd07u@cs.nott.ac.uk>
+Stability: experimental
+Author: Adam Dunkley
+License: BSD3
+License-file: LICENSE
+Category: Web
+Synopsis: A markdown to Frame GUI writer for Pandoc
+Description: A markdown to Frame GUI writer for Pandoc
+
+Library
+  Build-Depends:
+    base >= 2 && < 4,
+    frame,
+    pandoc
+  Exposed-Modules:
+        Frame.View.Markdown
+  Hs-source-dirs: src
diff --git a/src/Frame/View/Markdown.hs b/src/Frame/View/Markdown.hs
new file mode 100644
--- /dev/null
+++ b/src/Frame/View/Markdown.hs
@@ -0,0 +1,45 @@
+module Frame.View.Markdown where
+
+import Frame.View
+import Text.Pandoc hiding (Block (Header), Inline (Code, Strong, Image, Link))
+import qualified Text.Pandoc as P (Block (Header), Inline (Code, Strong, Image, Link)) 
+
+markdownToViewPart :: String -> Data
+markdownToViewPart m = pandocToViewPart $ readMarkdown defaultParserState $ filter (/='\r') m
+
+pandocToViewPart :: Pandoc -> Data
+pandocToViewPart (Pandoc _ bs) = ViewPart $ toContainers bs
+
+toContainers :: [P.Block] -> [Container]
+toContainers = map blockToContainer
+
+blockToContainer :: P.Block -> Container
+blockToContainer (Plain is)               = Paragraph (inlinesToElement is) []
+blockToContainer (Para is)                = Paragraph (inlinesToElement is) [] 
+blockToContainer (CodeBlock _ s)          = Code s
+blockToContainer (RawHtml s)              = Code s
+blockToContainer (BlockQuote bs)          = Quote $ toContainers bs
+blockToContainer (OrderedList _ bss)      = NumList (map toContainers bss) [] 
+blockToContainer (BulletList bss)         = List (map toContainers bss) []
+blockToContainer (P.Header i is)          = Header i $ inlinesToElement is
+blockToContainer HorizontalRule           = Line
+blockToContainer _                        = Empty
+
+inlinesToElement :: [P.Inline] -> [Element]
+inlinesToElement = map inlineToElement
+
+inlineToElement :: P.Inline -> Element
+inlineToElement (P.Link is t) = Link (fst t) $ Text $ concatMap inlineToString is
+inlineToElement (P.Image a t) = Element $ Image (fst t) $ concatMap inlineToString a
+inlineToElement (P.Strong is) = Strong (map inlineToElement is)
+inlineToElement (Emph is)     = Emphasis (map inlineToElement is)
+inlineToElement LineBreak     = Break
+inlineToElement i             = Element $ Text $ inlineToString i
+
+inlineToString :: P.Inline -> String
+inlineToString Space      = " "
+inlineToString (P.Code s) = s
+inlineToString Apostrophe = "'"
+inlineToString (Str s)    = s
+inlineToString Ellipses   = "..."
+inlineToString _          = ""
