diff --git a/Biobase/Vienna.hs b/Biobase/Vienna.hs
--- a/Biobase/Vienna.hs
+++ b/Biobase/Vienna.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE TypeOperators #-}
 
 -- | The Vienna 2004 model is a mirror of the Turner data structure. The
 -- difference is that The ViennaRNA package uses an explicit annotation for RNA
@@ -8,6 +9,8 @@
 
 module Biobase.Vienna where
 
+import Data.Array.Repa.Index
+import Data.Array.Repa.Shape
 import Data.ByteString (ByteString)
 import Data.Map (Map)
 
@@ -15,26 +18,34 @@
 import Biobase.Primary
 import Biobase.Secondary.Vienna
 
+type P = Z:.ViennaPair
+type PN = P:.Nuc
+type PNN = PN:.Nuc
+type PP = Z:.ViennaPair:.ViennaPair
+type PPNN = PP:.Nuc:.Nuc
+type PPNNN = PPNN:.Nuc
+type PPNNNN = PPNNN:.Nuc
+
 data Vienna2004 = Vienna2004
-  { stack :: PrimArray (ViennaPair,ViennaPair) Int
+  { stack :: PrimArray PP Int
   , dangle3 :: PrimArray PN Int
   , dangle5 :: PrimArray PN Int
-  , hairpinL :: PrimArray Int Int
+  , hairpinL :: PrimArray DIM1 Int
   , hairpinMM :: PrimArray PNN Int
   , hairpinLookup :: Map [Nuc] Int
   , hairpinGGG :: Int
   , hairpinCslope :: Int
   , hairpinCintercept :: Int
   , hairpinC3 :: Int
-  , bulgeL :: PrimArray Int Int
+  , bulgeL :: PrimArray DIM1 Int
   , bulgeSingleC :: Int
-  , iloop1x1 :: PrimArray (ViennaPair,ViennaPair,(Nuc,Nuc)) Int
-  , iloop2x1 :: PrimArray (ViennaPair,ViennaPair,(Nuc,Nuc,Nuc)) Int
-  , iloop2x2 :: PrimArray (ViennaPair,ViennaPair,(Nuc,Nuc,Nuc,Nuc)) Int
+  , iloop1x1 :: PrimArray PPNN  Int
+  , iloop2x1 :: PrimArray PPNNN Int
+  , iloop2x2 :: PrimArray PPNNNN Int
   , iloopMM :: PrimArray PNN Int
   , iloop2x3MM :: PrimArray PNN Int
   , iloop1xnMM :: PrimArray PNN Int
-  , iloopL :: PrimArray Int Int
+  , iloopL :: PrimArray DIM1 Int
   , multiMM :: PrimArray PNN Int
   , ninio :: Int
   , maxNinio :: Int
@@ -44,7 +55,7 @@
   , multiAsym :: Int
   , multiStrain :: Int
   , extMM :: PrimArray PNN Int
-  , coaxial :: PrimArray (ViennaPair,ViennaPair) Int -- no intervening unpaired nucleotides
+  , coaxial :: PrimArray PP Int -- no intervening unpaired nucleotides
   , coaxStack :: PrimArray PNN Int
   , tStackCoax :: PrimArray PNN Int
   , largeLoop :: Int
@@ -52,5 +63,3 @@
   , intermolecularInit :: Int
   } -- deriving (Read,Show)
 
-type PNN = (ViennaPair,Nuc,Nuc)
-type PN  = (ViennaPair,Nuc)
diff --git a/Biobase/Vienna/Export.hs b/Biobase/Vienna/Export.hs
--- a/Biobase/Vienna/Export.hs
+++ b/Biobase/Vienna/Export.hs
@@ -3,6 +3,8 @@
 module Biobase.Vienna.Export where
 
 import Control.Arrow
+import Data.Array.Repa.Index
+import Data.Array.Repa.Shape
 import Data.List (intersperse)
 import Data.List.Split
 import qualified Data.Map as M
@@ -11,7 +13,7 @@
 import Biobase.Primary
 import Biobase.Secondary.Vienna
 import Data.PrimitiveArray
-import Data.PrimitiveArray.Ix
+import Data.PrimitiveArray.Unboxed
 
 import Biobase.Vienna
 
@@ -87,12 +89,12 @@
 
 type LKey = ([ViennaPair],[Nuc])
 
-pb2lkey (p1,b1) = ([p1],[b1])
-pbb2lkey (p1,b1,b2) = ([p1],[b1,b2])
-pp2lkey (k1,k2) = ([k1,k2],[])
-ppbb2lkey (p1,p2,(b1,b2)) = ([p1,p2],[b1,b2])
-ppbbb2lkey (p1,p2,(b1,b2,b3)) = ([p1,p2],[b1,b2,b3])
-ppbbbb2lkey (p1,p2,(b1,b2,b3,b4)) = ([p1,p2],[b1,b2,b3,b4])
+pb2lkey (Z:.p1:.b1) = ([p1],[b1])
+pbb2lkey (Z:.p1:.b1:.b2) = ([p1],[b1,b2])
+pp2lkey (Z:.k1:.k2) = ([k1,k2],[])
+ppbb2lkey (Z:.p1:.p2:.b1:.b2) = ([p1,p2],[b1,b2])
+ppbbb2lkey (Z:.p1:.p2:.b1:.b2:.b3) = ([p1,p2],[b1,b2,b3])
+ppbbbb2lkey (Z:.p1:.p2:.b1:.b2:.b3:.b4) = ([p1,p2],[b1,b2,b3,b4])
 
 -- | Print a block.
 
diff --git a/Biobase/Vienna/Import.hs b/Biobase/Vienna/Import.hs
--- a/Biobase/Vienna/Import.hs
+++ b/Biobase/Vienna/Import.hs
@@ -11,8 +11,10 @@
 module Biobase.Vienna.Import where
 
 import Control.Arrow
-import qualified Data.Map as M
+import Data.Array.Repa.Index
+import Data.Array.Repa.Shape
 import qualified Data.ByteString.Char8 as BS
+import qualified Data.Map as M
 
 import Biobase.Primary
 import Biobase.Secondary
@@ -33,14 +35,14 @@
   { stack = convert minPP maxPP $ T.stack turner
   , dangle3 = convert minPB maxPB $ T.dangle3 turner
   , dangle5 = convert minPB maxPB $ T.dangle5 turner
-  , hairpinL = convert 0 30 $ T.hairpinL turner
+  , hairpinL = convert (Z:.0) (Z:.30) $ T.hairpinL turner
   , hairpinMM = convert minPBB maxPBB $ T.hairpinMM turner
   , hairpinLookup = M.mapKeys (read . BS.unpack) . M.map deka $ T.hairpinLookup turner
   , hairpinGGG = deka $ T.hairpinGGG turner
   , hairpinCslope = deka $ T.hairpinCslope turner
   , hairpinCintercept = deka $ T.hairpinCintercept turner
   , hairpinC3 = deka $ T.hairpinC3 turner
-  , bulgeL = convert 0 30 $ T.bulgeL turner
+  , bulgeL = convert (Z:.0) (Z:.30) $ T.bulgeL turner
   , bulgeSingleC = deka $ T.bulgeSingleC turner
   , iloop1x1 = convert minPPBB maxPPBB $ T.iloop1x1 turner
   , iloop2x1 = convert minPPBBB maxPPBBB $ T.iloop2x1 turner
@@ -48,7 +50,7 @@
   , iloopMM = convert minPBB maxPBB $ T.iloopMM turner
   , iloop2x3MM = convert minPBB maxPBB $ T.iloop2x3MM turner
   , iloop1xnMM = convert minPBB maxPBB $ T.iloop1xnMM turner
-  , iloopL = convert 0 30 $ T.iloopL turner
+  , iloopL = convert (Z:.0) (Z:.30) $ T.iloopL turner
   , multiMM = convert minPBB maxPBB $ T.multiMM turner
   , ninio = deka $ T.ninio turner
   , maxNinio = deka $ T.maxNinio turner
@@ -73,42 +75,47 @@
 class IdxConvert a b where
   idxConvert :: a -> b
 
-instance IdxConvert Pair ViennaPair where
-  idxConvert = mkViennaPair
-
-instance IdxConvert Nuc Nuc where
+instance IdxConvert DIM1 DIM1 where
   idxConvert = id
 
-instance IdxConvert Int Int where
-  idxConvert = id
+instance IdxConvert T.PNN PNN where
+  idxConvert (Z:.p1:.p2:.n1:.n2) = Z:. mkViennaPair (p1,p2) :.n1:.n2
 
-instance (IdxConvert a c, IdxConvert b d) => IdxConvert (a,b) (c,d) where
-  idxConvert = idxConvert *** idxConvert
+instance IdxConvert T.PN PN where
+  idxConvert (Z:.p1:.p2:.n1) = Z:. mkViennaPair (p1,p2) :.n1
 
-instance (IdxConvert a d, IdxConvert b e, IdxConvert c f) => IdxConvert (a,b,c) (d,e,f) where
-  idxConvert (a,b,c) = (idxConvert a, idxConvert b, idxConvert c)
+instance IdxConvert T.PPNNNN PPNNNN where
+  idxConvert (Z:.p11:.p12:.p21:.p22:.n1:.n2:.n3:.n4) = Z:. mkViennaPair (p11,p12) :. mkViennaPair (p21,p22) :.n1:.n2:.n3:.n4
 
-instance (IdxConvert al ar, IdxConvert bl br, IdxConvert cl cr, IdxConvert dl dr) => IdxConvert (al,bl,cl,dl) (ar,br,cr,dr) where
-  idxConvert (a,b,c,d) = (idxConvert a, idxConvert b, idxConvert c, idxConvert d)
+instance IdxConvert T.PPNNN PPNNN where
+  idxConvert (Z:.p11:.p12:.p21:.p22:.n1:.n2:.n3) = Z:. mkViennaPair (p11,p12) :. mkViennaPair (p21,p22) :.n1:.n2:.n3
 
+instance IdxConvert T.PPNN PPNN where
+  idxConvert (Z:.p11:.p12:.p21:.p22:.n1:.n2) = Z:. mkViennaPair (p11,p12) :. mkViennaPair (p21,p22) :.n1:.n2
+
+instance IdxConvert T.PP PP where
+  idxConvert (Z:.p11:.p12:.p21:.p22) = Z:. mkViennaPair (p11,p12) :. mkViennaPair (p21,p22)
+
+
+
 -- | Transform energies to the vienna Int-based variant
 --
 -- (which is round (e*100)).
 
 deka = round . (*100)
 
-minP = minBound
-maxP = maxBound
-minPB = (minP,nN)
-maxPB = (maxP,nU)
-minPP = (minP,minP)
-maxPP = (maxP,maxP)
-minPBB = (minP,nN,nN)
-maxPBB = (maxP,nU,nU)
-minPPBB = (minP,minP,(nN,nN))
-maxPPBB = (maxP,maxP,(nU,nU))
-minPPBBB = (minP,minP,(nN,nN,nN))
-maxPPBBB = (maxP,maxP,(nU,nU,nU))
-minPPBBBB = (minP,minP,(nN,nN,nN,nN))
-maxPPBBBB = (maxP,maxP,(nU,nU,nU,nU))
+minP = Z:.vpNP -- minBound
+maxP = Z:.vpNS -- maxBound
+minPB = minP:.nN -- (minP,nN)
+maxPB = maxP:.nU -- (maxP,nU)
+minPP = minP:.vpNP -- (minP,minP)
+maxPP = maxP:.vpNS -- (maxP,maxP)
+minPBB = minP:.nN:.nN -- (minP,nN,nN)
+maxPBB = maxP:.nU:.nU -- (maxP,nU,nU)
+minPPBB = minPP:.nN:.nN -- (minP,minP,(nN,nN))
+maxPPBB = maxPP:.nU:.nU -- (maxP,maxP,(nU,nU))
+minPPBBB = minPPBB:.nN -- (minP,minP,(nN,nN,nN))
+maxPPBBB = maxPPBB:.nU -- (maxP,maxP,(nU,nU,nU))
+minPPBBBB = minPPBBB:.nN -- (minP,minP,(nN,nN,nN,nN))
+maxPPBBBB = maxPPBBB:.nU -- (maxP,maxP,(nU,nU,nU,nU))
 
diff --git a/BiobaseVienna.cabal b/BiobaseVienna.cabal
--- a/BiobaseVienna.cabal
+++ b/BiobaseVienna.cabal
@@ -1,9 +1,9 @@
 name:           BiobaseVienna
-version:        0.1.0.0
+version:        0.2.0.0
 author:         Christian Hoener zu Siederdissen
 maintainer:     choener@tbi.univie.ac.at
 homepage:       http://www.tbi.univie.ac.at/~choener/
-copyright:      Christian Hoener zu Siederdissen, 2010,2011
+copyright:      Christian Hoener zu Siederdissen, 2010-2012
 category:       Bioinformatics
 synopsis:       Import Vienna energy parameters
 license:        GPL-3
@@ -27,20 +27,28 @@
     filepath,
     iteratee,
     split,
-    BiobaseTurner >= 0.1.1,
-    BiobaseXNA >= 0.5.1,
-    PrimitiveArray
+    BiobaseTurner >= 0.2,
+    BiobaseXNA >= 0.6,
+    vector >= 0.9,
+    repa >= 2.0,
+    PrimitiveArray >= 0.1.1.2
   exposed-modules:
     Biobase.Vienna
     Biobase.Vienna.Export
     Biobase.Vienna.Import
   ghc-options:
-    -O2
+    -Odph -funbox-strict-fields -fspec-constr
 
 executable ViennaConverter
   build-depends:
-    cmdargs == 0.8.*
+    cmdargs == 0.9.*
   main-is:
     ViennaConverter.hs
   ghc-options:
     -O2
+
+source-repository head
+  type: git
+  location: git://github.com/choener/BiobaseVienna
+
+
diff --git a/ViennaConverter.hs b/ViennaConverter.hs
--- a/ViennaConverter.hs
+++ b/ViennaConverter.hs
@@ -13,15 +13,6 @@
 import Biobase.Vienna.Export
 import Biobase.Vienna.Import
 
-{-
-import Biobase.Primary
-import Biobase.Secondary
-import Biobase.Secondary.Vienna
-import Data.PrimitiveArray
-import Data.PrimitiveArray.Ix
-import Biobase.Vienna
--}
-
 
 
 data Options = Options
