diff --git a/namespace.cabal b/namespace.cabal
--- a/namespace.cabal
+++ b/namespace.cabal
@@ -1,5 +1,5 @@
 name:                namespace
-version:             0.1.1.0
+version:             0.1.2.0
 synopsis:            A Generic Haskell library for managing namespaces
 description:         Please see README.md
 homepage:            https://github.com/xu-hao/namespace
@@ -17,7 +17,8 @@
   hs-source-dirs:      src
   exposed-modules:     Data.Namespace.Namespace Data.Namespace.Path
   build-depends:       base >= 4.7 && < 5,
-                       containers
+                       monoid-extras >= 0.1 && < 0.5,
+                       containers >= 0.5 && < 0.6
   default-language:    Haskell2010
 
 test-suite namespace-test
diff --git a/src/Data/Namespace/Namespace.hs b/src/Data/Namespace/Namespace.hs
--- a/src/Data/Namespace/Namespace.hs
+++ b/src/Data/Namespace/Namespace.hs
@@ -9,6 +9,7 @@
 import Prelude hiding (lookup)
 import Data.Map.Strict
 import Data.Monoid
+import Data.Monoid.Action (act)
 import Data.Maybe
 import Control.Monad
 import Control.Applicative
@@ -42,10 +43,10 @@
 topLevelNamespaces (Namespace nm _) = nm
 
 concatKey :: Key k => k -> Map (ObjectPath k) a -> Map (ObjectPath k) a
-concatKey key = foldrWithKey (\key2 o m -> insert (concatNamespacePathWithObjectPath (NamespacePath [key]) key2) o m ) mempty
+concatKey key = mapKeys (act (NamespacePath [key]))
 
 pathKey :: Key k => Map k a -> Map (ObjectPath k) a
-pathKey = foldrWithKey (\key o m -> insert (ObjectPath (NamespacePath []) key) o m ) mempty
+pathKey = mapKeys (ObjectPath (NamespacePath []))
 
 allObjects :: Key k => Namespace k a -> Map (ObjectPath k) a
 allObjects ns = pathKey (topLevelObjects ns) <> mconcat (elems (mapWithKey (\key ns2 -> concatKey key (allObjects ns2)) (topLevelNamespaces ns)))
diff --git a/src/Data/Namespace/Path.hs b/src/Data/Namespace/Path.hs
--- a/src/Data/Namespace/Path.hs
+++ b/src/Data/Namespace/Path.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE RankNTypes, GADTs, StandaloneDeriving, FlexibleInstances, PatternSynonyms #-}
+{-# LANGUAGE RankNTypes, GADTs, StandaloneDeriving, FlexibleInstances, MultiParamTypeClasses #-}
 
 module Data.Namespace.Path
     ( NamespacePath(..), ObjectPath(..), extendNamespacePath, concatNamespacePathWithObjectPath, qualified, Key,
@@ -7,6 +7,7 @@
 import Prelude hiding (lookup)
 import Data.Map.Strict
 import Data.Monoid
+import Data.Monoid.Action
 
 class Ord k => Key k where
 
@@ -35,6 +36,9 @@
 
 concatNamespacePathWithObjectPath :: Key k => NamespacePath k -> ObjectPath k -> ObjectPath k
 concatNamespacePathWithObjectPath np (ObjectPath np2 k) = ObjectPath (np <> np2) k
+
+instance Key k => Action (NamespacePath k) (ObjectPath k) where
+  act = concatNamespacePathWithObjectPath
 
 qualified :: Key k => ObjectPath k -> Bool
 qualified (ObjectPath (NamespacePath []) _) = False
