diff --git a/Biobase/Secondary.hs b/Biobase/Secondary.hs
--- a/Biobase/Secondary.hs
+++ b/Biobase/Secondary.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE FunctionalDependencies #-}
 {-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
@@ -36,6 +37,7 @@
   , Just x' <- L.lookup (toUpper x) charEdgeList
   , Just y' <- L.lookup (toUpper y) charEdgeList
   = (c',x',y')
+  | map toLower s == "bif" = (unknownCT,unknownEdge,unknownEdge)
   | otherwise = error $ "can't convert string: " ++ s
 
 -- | Each nucleotide in a pair may be paired using one of three edges:
@@ -83,7 +85,9 @@
 charCTList =
   [ ('c',cis)
   , ('t',trans)
+  , ('?',unknownCT)
   -- TODO antiCT, paraCT
+  -- TODO '?' type (??? could denote bifurcation)
   ]
 
 ctCharList = map swap charCTList
@@ -178,6 +182,28 @@
 
 
 
+-- * little helpers
+
+cWW = (cis,wc,wc)
+cWS = (cis,wc,sugar)
+cWH = (cis,wc,hoogsteen)
+cSW = (cis,sugar,wc)
+cSS = (cis,sugar,sugar)
+cSH = (cis,sugar,hoogsteen)
+cHW = (cis,hoogsteen,wc)
+cHS = (cis,hoogsteen,sugar)
+cHH = (cis,hoogsteen,hoogsteen)
+tWW = (trans,wc,wc)
+tWS = (trans,wc,sugar)
+tWH = (trans,wc,hoogsteen)
+tSW = (trans,sugar,wc)
+tSS = (trans,sugar,sugar)
+tSH = (trans,sugar,hoogsteen)
+tHW = (trans,hoogsteen,wc)
+tHS = (trans,hoogsteen,sugar)
+tHH = (trans,hoogsteen,hoogsteen)
+
+
 -- * special show instances
 
 -- | This one requires ghc head
@@ -187,3 +213,37 @@
 --instance Show (CTisomerism,Edge,Edge) where
 --  show (ct,eI,eJ) = concat [show ct, show eI, show eJ]
 
+
+
+-- * tuple-like selection
+
+-- | Selection of nucleotides and/or type classes independent of which type we
+-- are looking at.
+
+class BaseSelect a b | a -> b where
+  -- |  select first index or nucleotide
+  baseL :: a -> b
+  -- | select second index or nucleotide
+  baseR :: a -> b
+  -- | select basepair type if existing or return default cWW
+  baseT :: a -> ExtPairAnnotation
+
+-- | extended pairtype annotation given
+
+instance BaseSelect ((a,a),ExtPairAnnotation) a where
+  baseL ((a,_),_) = a
+  baseR ((_,b),_) = b
+  baseT (_,t) = t
+  {-# INLINE baseL #-}
+  {-# INLINE baseR #-}
+  {-# INLINE baseT #-}
+
+-- | simple cis/wc-wc basepairs
+
+instance BaseSelect (a,a) a where
+  baseL (a,_) = a
+  baseR (_,a) = a
+  baseT _ = cWW
+  {-# INLINE baseL #-}
+  {-# INLINE baseR #-}
+  {-# INLINE baseT #-}
diff --git a/BiobaseXNA.cabal b/BiobaseXNA.cabal
--- a/BiobaseXNA.cabal
+++ b/BiobaseXNA.cabal
@@ -1,5 +1,5 @@
 name:           BiobaseXNA
-version:        0.5.3.0
+version:        0.5.4.0
 author:         Christian Hoener zu Siederdissen
 maintainer:     choener@tbi.univie.ac.at
 homepage:       http://www.tbi.univie.ac.at/~choener/
@@ -17,6 +17,10 @@
                 efficient encodings for short sequences, as required by RNA
                 folding tools. Extended RNA secondary structures can be
                 represented as well.
+                .
+                Changes since 0.5.3.0
+                .
+                * tuple-like (selN) selection of basepairing elements (baseL,baseR,baseT)
                 .
                 Changes since 0.5.1.0
                 .
