diff --git a/clay.cabal b/clay.cabal
--- a/clay.cabal
+++ b/clay.cabal
@@ -1,5 +1,5 @@
 Name:     clay
-Version:  0.2
+Version:  0.3
 Synopsis: CSS preprocessor as embedded Haskell.
 Description:
   Clay is a CSS preprocessor like LESS and Sass, but implemented as an embedded
@@ -11,13 +11,12 @@
   .
   The API documentation can be found in the top level module "Clay".
   .
-  > 0.1.1 -> 0.2
-  >   - Rotate takes only one argument.
-  >   - Added opacity property.
-  >   - Print Clay banner in CSS comments by default.
-  >   - Fixed bug in font-family rendering (Firefox only).
-  >   - Added outline related properties.
-  >   - Fixed bug in monospace font family.
+  > 0.2 -> 0.3
+  >   - Fixed value grammar of radial gradients.
+  >   - Added mask related properties.
+  >   - Allow multiple box-shadows.
+  >   - Added filter property.
+  >   - Also render value prefix when both key and value are prefixed.
 
 Author:        Sebastiaan Visser
 Maintainer:    Sebastiaan Visser <code@fvisser.nl>
@@ -47,10 +46,12 @@
     Clay.Common
     Clay.Display
     Clay.Elements
+    Clay.Filter
     Clay.Font
     Clay.Geometry
     Clay.Gradient
     Clay.Media
+    Clay.Mask
     Clay.Property
     Clay.Pseudo
     Clay.Render
diff --git a/src/Clay.hs b/src/Clay.hs
--- a/src/Clay.hs
+++ b/src/Clay.hs
@@ -87,6 +87,8 @@
 , module Clay.Text
 , module Clay.Transform
 , module Clay.Transition
+, module Clay.Mask
+, module Clay.Filter
 )
 where
 
@@ -110,14 +112,16 @@
 import Clay.Color
 import Clay.Time
 import Clay.Common
-import Clay.Display  hiding (table)
-import Clay.Font     hiding (menu, caption, small, icon)
+import Clay.Display    hiding (table)
+import Clay.Font       hiding (menu, caption, small, icon)
 import Clay.Geometry
 import Clay.Gradient
 import Clay.Size
-import Clay.Text     hiding (pre)
+import Clay.Text       hiding (pre)
 import Clay.Transform
 import Clay.Transition
+import Clay.Mask       hiding (clear)
+import Clay.Filter     hiding (url, opacity)
 
 -- $media
 --
diff --git a/src/Clay/Box.hs b/src/Clay/Box.hs
--- a/src/Clay/Box.hs
+++ b/src/Clay/Box.hs
@@ -4,6 +4,7 @@
 , paddingBox, borderBox, contentBox
 , boxSizing
 , boxShadow
+, boxShadows
 )
 where
 
@@ -35,4 +36,7 @@
 
 boxShadow :: Size a -> Size a -> Size a -> Color -> Css
 boxShadow x y w c = prefixed (browsers <> "box-shadow") (x ! y ! w ! c)
+
+boxShadows :: [(Size a, Size a, Size a, Color)] -> Css
+boxShadows = prefixed (browsers <> "box-shadow") . map (\(a, b, c, d) -> a ! b ! c ! d)
 
diff --git a/src/Clay/Filter.hs b/src/Clay/Filter.hs
new file mode 100644
--- /dev/null
+++ b/src/Clay/Filter.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving #-}
+module Clay.Filter
+(
+-- * Filter property.
+
+  Filter
+, filter
+, filters
+
+-- * Specific filter functions.
+
+, url
+, blur
+, brightness
+, contrast
+, dropShadow
+, grayscale
+, hueRotate
+, invert
+, opacity
+, saturate
+, sepia
+)
+where
+
+import Data.Monoid
+import Data.Text hiding (filter)
+import Prelude hiding (filter)
+
+import Clay.Color
+import Clay.Common
+import Clay.Property
+import Clay.Stylesheet
+import Clay.Size
+
+-------------------------------------------------------------------------------
+
+newtype Filter = Filter Value
+  deriving (Val, None, Inherit)
+
+filter :: Filter -> Css
+filter = prefixed (browsers <> "filter")
+
+filters :: [Filter] -> Css
+filters x = prefixed (browsers <> "filter") (noCommas x)
+
+-------------------------------------------------------------------------------
+
+url :: Text -> Filter
+url u = Filter ("url(" <> value u <> ")")
+
+blur :: Size Abs -> Filter
+blur i = Filter ("blur(" <> value i <> ")")
+
+brightness :: Double -> Filter
+brightness i = Filter ("brightness(" <> value i <> ")")
+
+contrast :: Size Rel -> Filter
+contrast i = Filter ("contrast(" <> value i <> ")")
+
+dropShadow :: Size Abs -> Size Abs -> Size Abs -> Color -> Filter
+dropShadow x y s c = Filter ("drop-shadow(" <> value (x ! y ! s ! c) <> ")")
+
+grayscale :: Size Rel -> Filter
+grayscale g = Filter ("grayscale(" <> value g <> ")")
+
+hueRotate :: Angle a -> Filter
+hueRotate h = Filter ("hue-rotate(" <> value h <> ")")
+
+invert :: Size Rel -> Filter
+invert i = Filter ("invert(" <> value i <> ")")
+
+opacity :: Size Rel -> Filter
+opacity i = Filter ("opacity(" <> value i <> ")")
+
+saturate :: Size Rel -> Filter
+saturate i = Filter ("saturate(" <> value i <> ")")
+
+sepia :: Size Rel -> Filter
+sepia i = Filter ("sepia(" <> value i <> ")")
+
diff --git a/src/Clay/Gradient.hs b/src/Clay/Gradient.hs
--- a/src/Clay/Gradient.hs
+++ b/src/Clay/Gradient.hs
@@ -21,6 +21,9 @@
 , circle, ellipse
 , circular, elliptical
 
+, Extend (..)
+, closestSide, closestCorner, farthestSide, farthestCorner
+
 -- , Extend
 -- , closestSide, closestCorner, farthestSide, farthestCorner
 
@@ -75,19 +78,17 @@
 newtype Radial = Radial Value
   deriving (Val, Other)
 
-circle :: Radial
-circle = Radial "circle"
+circle :: Extend -> Radial
+circle ext = Radial ("circle " <> value ext)
 
-ellipse :: Radial
-ellipse = Radial "ellipse"
+ellipse :: Extend -> Radial
+ellipse ext = Radial ("ellipse " <> value ext)
 
 circular :: Size Abs -> Radial
-circular radius = Radial ("circle " <> value radius)
+circular radius = Radial (value (radius, radius))
 
 elliptical :: Size a -> Size a -> Radial
-elliptical radx rady = Radial (value ("ellipse " <> value (radx, rady)))
-
-{-
+elliptical radx rady = Radial (value (radx, rady))
 
 newtype Extend = Extend Value
   deriving (Val, Other)
@@ -99,20 +100,16 @@
 farthestSide   = Extend "farthest-side"
 farthestCorner = Extend "farthest-corner"
 
--}
-
 -------------------------------------------------------------------------------
 
 radialGradient :: Loc l => l -> Radial -> Ramp -> BackgroundImage
 radialGradient d r xs = other $ Value $
-  let Value v = "radial-gradient("
-             <> value [value d, value r, ramp xs] <> ")"
+  let Value v = "radial-gradient(" <> value [value d, value r, ramp xs] <> ")"
    in browsers <> v
 
 repeatingRadialGradient :: Loc l => l -> Radial -> Ramp -> BackgroundImage
 repeatingRadialGradient d r xs = other $ Value $
-  let Value v = "repeating-radial-gradient("
-             <> value [value d, value r, ramp xs] <> ")"
+  let Value v = "repeating-radial-gradient(" <> value [value d, value r, ramp xs] <> ")"
    in browsers <> v
 
 -------------------------------------------------------------------------------
diff --git a/src/Clay/Mask.hs b/src/Clay/Mask.hs
new file mode 100644
--- /dev/null
+++ b/src/Clay/Mask.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE
+    OverloadedStrings
+  , FlexibleInstances
+  , GeneralizedNewtypeDeriving
+  #-}
+module Clay.Mask
+(
+-- * Generic mask property.
+
+  Mask (mask)
+
+-- * The mask-composite.
+
+, MaskComposite
+, clear, copy
+, sourceOver, sourceIn, sourceOut, sourceAtop
+, destinationOver, destinationIn, destinationOut, destinationAtop
+, xor
+, maskComposite
+, maskComposites
+
+-- * The mask-position.
+
+, maskPosition
+, maskPositions
+
+-- * The mask-size.
+
+, maskSize
+, maskSizes
+
+-- * The mask-repeat.
+
+, maskRepeat
+, maskRepeats
+
+-- * The mask-origin.
+
+, maskOrigin
+, maskOrigins
+
+-- * The mask-clip.
+
+, maskClip
+, maskClips
+
+-- * The mask-attachment.
+
+, maskAttachment
+, maskAttachments
+
+-- * The mask-image.
+
+, maskImage
+, maskImages
+
+)
+where
+
+import Data.Monoid
+
+import Clay.Background
+import Clay.Common
+import Clay.Property
+import Clay.Stylesheet
+
+pkey :: Val a => Prefixed -> a -> Css
+pkey k = prefixed (browsers <> k)
+
+-------------------------------------------------------------------------------
+
+-- | We implement the generic mask property as a type class that accepts
+-- multiple value types. This allows us to combine different mask aspects into
+-- a shorthand syntax.
+
+class Val a => Mask a where
+  mask :: a -> Css
+  mask = pkey "mask"
+
+instance Mask a => Mask [a]
+instance (Mask a, Mask b) => Mask (a, b)
+
+instance Mask MaskComposite
+instance Mask BackgroundPosition
+instance Mask BackgroundSize
+instance Mask BackgroundRepeat
+instance Mask BackgroundOrigin
+instance Mask BackgroundClip
+instance Mask BackgroundAttachment
+instance Mask BackgroundImage
+
+-------------------------------------------------------------------------------
+
+newtype MaskComposite = MaskComposite Value
+  deriving (Val, Other, Inherit, None)
+
+clear, copy
+  , sourceOver, sourceIn, sourceOut, sourceAtop
+  , destinationOver, destinationIn, destinationOut, destinationAtop
+  , xor :: MaskComposite
+
+clear                = other "clear"
+copy                 = other "copy"
+sourceOver           = other "source-over"
+sourceIn             = other "source-in"
+sourceOut            = other "source-out"
+sourceAtop           = other "source-atop"
+destinationOver      = other "destination-over"
+destinationIn        = other "destination-in"
+destinationOut       = other "destination-out"
+destinationAtop      = other "destination-atop"
+xor                  = other "xor"
+
+maskComposite :: MaskComposite -> Css
+maskComposite = pkey "mask-composite"
+
+maskComposites :: [MaskComposite] -> Css
+maskComposites = pkey "mask-composite"
+
+-------------------------------------------------------------------------------
+
+maskPosition :: BackgroundPosition -> Css
+maskPosition = pkey "mask-position"
+
+maskPositions :: [BackgroundPosition] -> Css
+maskPositions = pkey "mask-position"
+
+-------------------------------------------------------------------------------
+
+maskSize :: BackgroundSize -> Css
+maskSize = pkey "mask-size"
+
+maskSizes :: [BackgroundSize] -> Css
+maskSizes = pkey "mask-size"
+
+-------------------------------------------------------------------------------
+
+maskRepeat :: BackgroundRepeat -> Css
+maskRepeat = pkey "mask-repeat"
+
+maskRepeats :: [BackgroundRepeat] -> Css
+maskRepeats = pkey "mask-repeat"
+
+-------------------------------------------------------------------------------
+
+maskImage :: BackgroundImage -> Css
+maskImage = pkey "mask-image"
+
+maskImages :: [BackgroundImage] -> Css
+maskImages = pkey "mask-image"
+
+-------------------------------------------------------------------------------
+
+maskOrigin :: BackgroundOrigin -> Css
+maskOrigin = pkey "mask-origin"
+
+maskOrigins :: [BackgroundOrigin] -> Css
+maskOrigins = pkey "mask-origin"
+
+-------------------------------------------------------------------------------
+
+maskClip :: BackgroundClip -> Css
+maskClip = pkey "mask-clip"
+
+maskClips :: [BackgroundClip] -> Css
+maskClips = pkey "mask-clip"
+
+-------------------------------------------------------------------------------
+
+maskAttachment :: BackgroundAttachment -> Css
+maskAttachment = pkey "mask-attachment"
+
+maskAttachments :: [BackgroundAttachment] -> Css
+maskAttachments = pkey "mask-attachment"
+
diff --git a/src/Clay/Render.hs b/src/Clay/Render.hs
--- a/src/Clay/Render.hs
+++ b/src/Clay/Render.hs
@@ -160,7 +160,7 @@
     ( Plain    k  , Plain    v  ) -> [prop k v]
     ( Prefixed ks , Plain    v  ) -> flip map ks $ \(p, k) -> prop (p <> k) v
     ( Plain    k  , Prefixed vs ) -> flip map vs $ \(p, v) -> prop k (p <> v)
-    ( Prefixed ks , Prefixed vs ) -> flip map ks $ \(p, k) -> (Left (p <> k) `maybe` prop (p <> k)) (lookup p vs)
+    ( Prefixed ks , Prefixed vs ) -> flip map ks $ \(p, k) -> (Left (p <> k) `maybe` (prop (p <> k) . mappend p)) (lookup p vs)
   where prop k v = Right (k, v)
 
 properties :: Config -> [Either Text (Text, Text)] -> Builder
