diff --git a/crdt.cabal b/crdt.cabal
--- a/crdt.cabal
+++ b/crdt.cabal
@@ -1,9 +1,9 @@
--- This file has been generated from package.yaml by hpack version 0.17.0.
+-- This file has been generated from package.yaml by hpack version 0.17.1.
 --
 -- see: https://github.com/sol/hpack
 
 name:           crdt
-version:        0.2
+version:        0.3
 synopsis:       Conflict-free replicated data types
 description:    Definitions of CmRDT and CvRDT. Implementations for some classic CRDTs.
 category:       Distributed Systems
@@ -24,7 +24,7 @@
       lib
   build-depends:
       base >= 4.9 && < 4.10
-    , vector
+    , containers
   exposed-modules:
       CRDT.Cm
       CRDT.Cv
@@ -45,7 +45,7 @@
       test
   build-depends:
       base >= 4.9 && < 4.10
-    , vector
+    , containers
     , QuickCheck
     , tasty
     , tasty-quickcheck
diff --git a/lib/CRDT/GCounter/Cv.hs b/lib/CRDT/GCounter/Cv.hs
--- a/lib/CRDT/GCounter/Cv.hs
+++ b/lib/CRDT/GCounter/Cv.hs
@@ -6,11 +6,9 @@
     , increment
     ) where
 
-import           Data.Monoid         ((<>))
-import qualified Data.Vector         as Vector
-import qualified Data.Vector.Mutable as VectorM
+import qualified Data.IntMap.Strict as IntMap
 
-import CRDT.GCounter.Cv.Internal
+import           CRDT.GCounter.Cv.Internal
 
 -- | Increment counter
 increment
@@ -18,21 +16,16 @@
     => Word -- ^ replica id
     -> GCounter a
     -> GCounter a
-increment replicaId (GCounter vec) = let
+increment replicaId (GCounter imap) = GCounter (IntMap.insertWith (+) i 1 imap)
+  where
     i = fromIntegral replicaId
-    vecResized =
-        if i + 1 > length vec then
-            vec <> Vector.replicate (i + 1 - length vec) 0
-        else
-            vec
-    vecUpdated = Vector.modify (\vm -> VectorM.modify vm (+1) i) vecResized
-    in
-    GCounter vecUpdated
 
 -- | Initial state
 initial :: GCounter a
-initial = GCounter Vector.empty
+initial = GCounter IntMap.empty
 
 -- | Get value from the state
 query :: Num a => GCounter a -> a
-query (GCounter v) = sum v
+query (GCounter v) = mapSum v
+  where
+    mapSum = IntMap.foldr (+) 0
diff --git a/lib/CRDT/GCounter/Cv/Internal.hs b/lib/CRDT/GCounter/Cv/Internal.hs
--- a/lib/CRDT/GCounter/Cv/Internal.hs
+++ b/lib/CRDT/GCounter/Cv/Internal.hs
@@ -1,16 +1,16 @@
 module CRDT.GCounter.Cv.Internal where
 
 import           Data.Semigroup (Semigroup ((<>)))
-import           Data.Vector    (Vector)
-import qualified Data.Vector    as Vector
+import           Data.IntMap.Strict (IntMap)
+import qualified Data.IntMap.Strict as IntMap
 
 import CRDT.Cv (CvRDT)
 
 -- | Grow-only counter.
-newtype GCounter a = GCounter (Vector a)
+newtype GCounter a = GCounter (IntMap a)
     deriving (Eq, Show)
 
 instance Ord a => Semigroup (GCounter a) where
-    GCounter x <> GCounter y = GCounter $ Vector.zipWith max x y
+    GCounter x <> GCounter y = GCounter $ IntMap.unionWith max x y
 
 instance Ord a => CvRDT (GCounter a)
diff --git a/test/Instances/Cv.hs b/test/Instances/Cv.hs
--- a/test/Instances/Cv.hs
+++ b/test/Instances/Cv.hs
@@ -5,15 +5,10 @@
 
 module Instances.Cv () where
 
-import           Data.Vector     (Vector)
-import qualified Data.Vector     as Vector
 import           Test.QuickCheck (Arbitrary, arbitrary)
 
-import CRDT.GCounter.Cv.Internal  (GCounter (..))
-import CRDT.PNCounter.Cv.Internal (PNCounter (..))
-
-instance Arbitrary a => Arbitrary (Vector a) where
-    arbitrary = Vector.fromList <$> arbitrary
+import           CRDT.GCounter.Cv.Internal (GCounter (..))
+import           CRDT.PNCounter.Cv.Internal (PNCounter (..))
 
 deriving instance Arbitrary a => Arbitrary (GCounter a)
 
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,21 +1,21 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
-import Data.Proxy            (Proxy (..))
-import Data.Semilattice      (Semilattice, (<>))
-import Test.QuickCheck       (Arbitrary, Small (..))
-import Test.Tasty            (TestTree, defaultMain, testGroup)
-import Test.Tasty.QuickCheck (testProperty)
+import           Data.Proxy (Proxy (..))
+import           Data.Semilattice (Semilattice, (<>))
+import           Test.QuickCheck (Arbitrary, Small (..))
+import           Test.Tasty (TestTree, defaultMain, testGroup)
+import           Test.Tasty.QuickCheck (testProperty)
 
-import           CRDT.Cm           (CmRDT, State)
-import qualified CRDT.Cm           as Cm
-import           CRDT.Cv           (CvRDT)
-import qualified CRDT.GCounter.Cv  as GcCv
-import           CRDT.LWW          (LWW)
+import           CRDT.Cm (CmRDT, State)
+import qualified CRDT.Cm as Cm
+import           CRDT.Cv (CvRDT)
+import qualified CRDT.GCounter.Cv as GcCv
+import           CRDT.LWW (LWW)
 import qualified CRDT.PNCounter.Cm as PncCm
 import qualified CRDT.PNCounter.Cv as PncCv
 
-import Instances ()
+import           Instances ()
 
 main :: IO ()
 main = defaultMain $ testGroup "" [gCounter, pnCounter, lww]
