diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2015 Andrew Martin
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/bootstrap-types.cabal b/bootstrap-types.cabal
new file mode 100644
--- /dev/null
+++ b/bootstrap-types.cabal
@@ -0,0 +1,19 @@
+name:                bootstrap-types
+version:             0.3
+synopsis:            Bootstrap CSS Framework type-safe interface
+license:             MIT
+license-file:        LICENSE
+author:              Andrew Martin
+maintainer:          andrew.thaddeus@gmail.com
+category:            Web
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  exposed-modules:
+    Bootstrap.V3
+  build-depends:
+      base >=4.7 && <5.0
+    , text
+  hs-source-dirs:      src
+  default-language:    Haskell2010
diff --git a/src/Bootstrap/V3.hs b/src/Bootstrap/V3.hs
new file mode 100644
--- /dev/null
+++ b/src/Bootstrap/V3.hs
@@ -0,0 +1,136 @@
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+{-# OPTIONS_GHC -Wall #-}
+
+module Bootstrap.V3
+  ( Context(..)
+  , Size(..)
+  , Column(..)
+  , Flow(..)
+  , Panel(..)
+  , NavbarTheme(..)
+  , NavbarPosition(..)
+  , NavbarItem(..)
+  , NavbarDropdownItem(..)
+  , contextClass
+  , sizeClass
+  , columnClass
+  , buttonClass
+  , navbarThemeClass
+  , navbarPositionClass
+  , emptyColumn
+  , singletonColumn
+  ) where
+
+import Data.Text (Text)
+import Data.Monoid
+import qualified Data.Text as Text
+
+data NavbarTheme
+  = NavbarThemeDefault
+  | NavbarThemeInverse
+  | NavbarThemeOther Text
+
+data NavbarPosition
+  = NavbarPositionStandard
+  | NavbarPositionStatic
+  | NavbarPositionFixed
+
+data NavbarItem r c
+  = NavbarItemLink r c
+  | NavbarItemDropdown c [NavbarDropdownItem r c]
+
+data NavbarDropdownItem r c
+  = NavbarDropdownItemLink r c
+  | NavbarDropdownItemHeader c
+  | NavbarDropdownItemSeparator
+
+data Context
+  = Success
+  | Info
+  | Warning
+  | Danger
+  | Default
+  | Primary
+  | Link
+  | Error
+
+data Size = ExtraSmall | Small | Medium | Large
+  deriving (Eq,Ord)
+
+data Column = Column
+  { columnsExtraSmall :: !Int
+  , columnsSmall :: !Int
+  , columnsMedium :: !Int
+  , columnsLarge :: !Int
+  }
+
+data Flow = Block | Inline
+
+data Panel c = Panel
+  { panelTitle :: !c
+  , panelBody :: !c
+  , panelContext :: !Context
+  }
+
+contextClass :: Context -> Text
+contextClass x = case x of
+  Success -> "success"
+  Info -> "info"
+  Warning -> "warning"
+  Default -> "default"
+  Primary -> "primary"
+  Link -> "link"
+  Error -> "error"
+  Danger -> "danger"
+
+sizeClass :: Size -> Text
+sizeClass x = case x of
+  ExtraSmall -> "xs"
+  Small -> "sm"
+  Medium -> "md"
+  Large -> "lg"
+
+columnClass :: Column -> Text
+columnClass (Column xs sm md lg) = Text.concat
+  [ "col-xs-",Text.pack (show xs)
+  , " col-sm-",Text.pack (show sm)
+  , " col-md-",Text.pack (show md)
+  , " col-lg-",Text.pack (show lg)
+  ]
+
+emptyColumn :: Column
+emptyColumn = Column 12 12 12 12
+
+singletonColumn :: Size -> Int -> Column
+singletonColumn sz i = Column
+  (if sz >= ExtraSmall then i else 12)
+  (if sz >= Small then i else 12)
+  (if sz >= Medium then i else 12)
+  (if sz >= Large then i else 12)
+
+buttonClass :: Context -> Size -> Text
+buttonClass ctx size = Text.concat
+  [ "btn btn-"
+  , contextClass ctx
+  , " btn-"
+  , sizeClass size
+  ]
+
+navbarThemeClass :: NavbarTheme -> Text
+navbarThemeClass x = case x of
+  NavbarThemeDefault -> "navbar-default"
+  NavbarThemeInverse -> "navbar-inverse"
+  NavbarThemeOther t -> "navbar-" <> t
+
+navbarPositionClass :: NavbarPosition -> Text
+navbarPositionClass x = case x of
+  NavbarPositionStandard -> ""
+  NavbarPositionStatic -> "navbar-static-top"
+  NavbarPositionFixed -> "navbar-fixed-top"
+
+-- setColumns :: Size -> Int -> Column -> Column
+-- setColumns sz i (Column xs sm md lg) = Column
+
+
