diff --git a/language-vhdl.cabal b/language-vhdl.cabal
--- a/language-vhdl.cabal
+++ b/language-vhdl.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                language-vhdl
-version:             0.1.0.2
+version:             0.1.1.0
 synopsis:            VHDL AST and pretty printer in Haskell
 -- description:         
 license:             BSD3
diff --git a/src/Language/VHDL/Pretty.hs b/src/Language/VHDL/Pretty.hs
--- a/src/Language/VHDL/Pretty.hs
+++ b/src/Language/VHDL/Pretty.hs
@@ -66,12 +66,17 @@
 
 instance Pretty ArchitectureBody where
   pp (ArchitectureBody i n d s) =
-      vcat [header, indent (pp d), text "BEGIN", indent (pp s), footer]
+      vcat [ header
+           , indent (vpp d)
+           , text "BEGIN"
+           , indent (vpp s)
+           , footer
+           ]
     where
       header = text "ARCHITECTURE" <+> pp i
            <+> text "OF" <+> pp n
            <+> text "IS"
-      footer = text "END ARCITECTURE" <+> pp n <+> semi
+      footer = text "END ARCHITECTURE" <+> pp i <+> semi
 
 --instance Pretty ArchitectureDeclarativePart where pp = undefined
 
@@ -142,23 +147,23 @@
          , text "END FOR" <+> semi]
 
 instance Pretty BlockDeclarativeItem where
-  pp (BDISubprogDecl d)  = pp d
-  pp (BDISubprogBody b)  = pp b
-  pp (BDITypeDecl t)     = pp t
-  pp (BDISubtypeDecl s)  = pp s
-  pp (BDIConstantDecl c) = pp c
-  pp (BDISignalDecl s)   = pp s
-  pp (BDISharedDecl v)   = pp v
-  pp (BDIFileDecl f)     = pp f
-  pp (BDIAliasDecl a)    = pp a
-  pp (BDICompDecl c)     = pp c
-  pp (BDIAttrDecl a)     = pp a
-  pp (BDIAttrSepc a)     = pp a
-  pp (BDIConfigSepc c)   = pp c
-  pp (BDIDisconSpec d)   = pp d
-  pp (BDIUseClause u)    = pp u
-  pp (BDIGroupTemp g)    = pp g
-  pp (BDIGroupDecl g)    = pp g
+  pp (BDISubprogDecl d) = pp d
+  pp (BDISubprogBody b) = pp b
+  pp (BDIType t)        = pp t
+  pp (BDISubtype s)     = pp s
+  pp (BDIConstant c)    = pp c
+  pp (BDISignal s)      = pp s
+  pp (BDIShared v)      = pp v
+  pp (BDIFile f)        = pp f
+  pp (BDIAlias a)       = pp a
+  pp (BDIComp c)        = pp c
+  pp (BDIAttrDecl a)    = pp a
+  pp (BDIAttrSepc a)    = pp a
+  pp (BDIConfigSepc c)  = pp c
+  pp (BDIDisconSpec d)  = pp d
+  pp (BDIUseClause u)   = pp u
+  pp (BDIGroupTemp g)   = pp g
+  pp (BDIGroup g)       = pp g
 
 --instance Pretty BlockDeclarativePart where pp = undefined
 
@@ -187,7 +192,7 @@
 
 instance Pretty CaseStatement where
   pp (CaseStatement l e cs) =
-      cond id l <+> colon `hangs` vcat [header, body, footer]
+      labels l $ vcat [header, body, footer]
     where
       header = text "CASE" <+> pp e <+> text "IS"
       body   = indent $ vcat $ map pp cs
@@ -284,9 +289,9 @@
          ]
 
 instance Pretty ConfigurationDeclarativeItem where
-  pp (CDIUse u)   = pp u
-  pp (CDIAttr a)  = pp a
-  pp (CDIGroup g) = pp g
+  pp (CDIUse u)      = pp u
+  pp (CDIAttrSpec a) = pp a
+  pp (CDIGroup g)    = pp g
 
 --instance Pretty ConfigurationDeclarativePart where pp = undefined
 
@@ -299,7 +304,7 @@
 
 instance Pretty ConstantDeclaration where
   pp (ConstantDeclaration is s e) =
-    text "CONSTANT" <+> pp is <+> colon <+> pp s <+> condL (text ":=") e
+    text "CONSTANT" <+> commaSep (fmap pp is) <+> colon <+> pp s <+> condL (text ":=") e
 
 instance Pretty ConstrainedArrayDefinition where
   pp (ConstrainedArrayDefinition i s) = text "ARRAY" <+> pp i <+> text "OF" <+> pp s
@@ -396,26 +401,27 @@
            [ pp h
            , pp d
            ]
-         , cond (flip hangs (text "BEGIN")) s
+         , flip cond s $ \ss ->
+             text "BEGIN" `hangs` ss             
          , text "END ENTITY" <+> pp i <+> semi
          ]
 
 instance Pretty EntityDeclarativeItem where
   pp (EDISubprogDecl s)  = pp s
   pp (EDISubprogBody b)  = pp b
-  pp (EDITypeDecl t)     = pp t
-  pp (EDISubtypeDecl s)  = pp s
-  pp (EDIConstantDecl c) = pp c
-  pp (EDISignalDecl s)   = pp s
-  pp (EDISharedDecl s)   = pp s
-  pp (EDIFileDecl f)     = pp f
-  pp (EDIAliasDecl a)    = pp a
+  pp (EDIType t)         = pp t
+  pp (EDISubtype s)      = pp s
+  pp (EDIConstant c)     = pp c
+  pp (EDISignal s)       = pp s
+  pp (EDIShared s)       = pp s
+  pp (EDIFile f)         = pp f
+  pp (EDIAlias a)        = pp a
   pp (EDIAttrDecl a)     = pp a
   pp (EDIAttrSpec a)     = pp a
   pp (EDIDiscSpec d)     = pp d
   pp (EDIUseClause u)    = pp u
   pp (EDIGroupTemp g)    = pp g
-  pp (EDIGroupDecl g)    = pp g
+  pp (EDIGroup g)        = pp g
 
 --instance Pretty EntityDeclarativePart where pp = undefined
 
@@ -452,9 +458,7 @@
 
 instance Pretty ExitStatement where
   pp (ExitStatement l b c) =
-        condR colon l
-    <+> text "NEXT" <+> cond id b
-    <+> cond ((<+>) (text "WHEN")) c <+> semi
+    label l <+> text "NEXT" <+> cond id b <+> condL (text "WHEN") c <+> semi
 
 instance Pretty Exponent where pp = error "missing: Exponent" -- todo
 
@@ -476,7 +480,9 @@
   pp (FacNot p)     = text "NOT" <+> pp p
 
 instance Pretty FileDeclaration where
-  pp (FileDeclaration is s o) = text "FILE" <+> pp is <+> colon <+> pp s <+> cond id o <+> semi
+  pp (FileDeclaration is s o) =
+        text "FILE" <+> commaSep (fmap pp is)
+    <+> colon <+> pp s <+> cond id o <+> semi
 
 --instance Pretty FileLogicalName where pp = undefined
 
@@ -521,12 +527,12 @@
   pp (GSIf c)  = pp c
 
 instance Pretty GenericClause where
-  pp (GenericClause ls) = text "GENERIC" <+> parens (pp ls)
+  pp (GenericClause ls) = text "GENERIC" <+> parens (pp ls) <+> semi
 
 --instance Pretty GenericList where pp = undefined
 
 instance Pretty GenericMapAspect where
-  pp (GenericMapAspect as) = text "GENERIC MAP" <+> parens (pp as)
+  pp (GenericMapAspect as) = text "GENERIC MAP" <+> parens (pp as) <+> semi
 
 instance Pretty GraphicCharacter where pp = error "missing: GraphicCharacter" -- todo
 
@@ -552,13 +558,20 @@
 
 instance Pretty IfStatement where
   pp (IfStatement l (tc, ts) a e) =
-    condR colon l `hangs` vcat
-      [ text "IF" <+> pp tc <+> text "THEN"
-      , vcat $ fmap (\(c, s) -> text "ELSEIF" <+> pp c <+> text "THEN" `hangs` pp s) a
-      , cond (hangs (text "ELSE")) e
+    labels l $ vcat
+      [ (text "IF" <+> pp tc <+> text "THEN") `hangs` vpp ts
+      , elseIf' a
+      , else'   e
       , text "END IF" <+> cond id l <+> semi
       ]
+    where
+      elseIf' :: [(Condition, SequenceOfStatements)] -> Doc
+      elseIf' = vcat . fmap (\(c, ss) -> (text "ELSEIF" <+> pp c <+> text "THEN") `hangs` (vpp ss))
 
+      else'   :: Maybe SequenceOfStatements -> Doc
+      else' (Nothing) = empty
+      else' (Just ss) = text "ELSE" `hangs` (vpp ss)
+
 instance Pretty IncompleteTypeDeclaration where
   pp (IncompleteTypeDeclaration i) = text "TYPE" <+> pp i <+> semi
 
@@ -593,7 +606,7 @@
   pp (InterfaceConstantDeclaration is s e) =
     text "CONSTANT" <+> pp is <+> colon <+> text "IN" <+> pp s <+> condL (text ":=") e
   pp (InterfaceSignalDeclaration is m s b e) =
-    text "SIGNAL" <+> pp is <+> colon <+> cond id m <+> pp s <+> when b (text "BUS") <+> condL (text ":=") e
+    {-text "SIGNAL" <+> -}pp is <+> colon <+> cond id m <+> pp s <+> when b (text "BUS") <+> condL (text ":=") e
   pp (InterfaceVariableDeclaration is m s e) =
     text "VARIABLE" <+> pp is <+> colon <+> cond id m <+> pp s <+> condL (text ":=") e
   pp (InterfaceFileDeclaration is s) =
@@ -602,7 +615,7 @@
 --instance Pretty InterfaceElement where pp = undefined
 
 instance Pretty InterfaceList where
-  pp (InterfaceList es) = semiSep $ map pp es
+  pp (InterfaceList es) = foldr ($+$) empty $ punctuate semi $ map pp es
 
 instance Pretty IterationScheme where
   pp (IterWhile c) = text "WHILE" <+> pp c
@@ -639,7 +652,7 @@
 
 instance Pretty LoopStatement where
   pp (LoopStatement l i ss) =
-    condR colon l `hangs` vcat
+    labels l $ vcat
       [ cond id i <+> text "LOOP"
       , indent $ pp ss
       , text "END LOOP" <+> cond id l <+> semi
@@ -672,10 +685,10 @@
   pp (NAttr a)   = pp a
 
 instance Pretty NextStatement where
-  pp (NextStatement l b c) = condR colon l <+> text "NEXT" <+> cond id b <+> condL (text "WHEN") c <+> semi
+  pp (NextStatement l b c) = label l <+> text "NEXT" <+> cond id b <+> condL (text "WHEN") c <+> semi
 
 instance Pretty NullStatement where
-  pp (NullStatement l) = condR colon l <+> text "NULL"
+  pp (NullStatement l) = label l <+> text "NULL"
 
 instance Pretty NumericLiteral where
   pp (NLitAbstract a) = pp a
@@ -700,17 +713,17 @@
          ]
 
 instance Pretty PackageBodyDeclarativeItem where
-  pp (PBDISubprogDecl s)  = pp s
-  pp (PBDISubprogBody b)  = pp b
-  pp (PBDITypeDecl t)     = pp t
-  pp (PBDISubtypeDecl s)  = pp s
-  pp (PBDIConstantDecl c) = pp c
-  pp (PBDISharedDecl s)   = pp s
-  pp (PBDIFileDecl f)     = pp f
-  pp (PBDIAliasDecl a)    = pp a
-  pp (PBDIUseClause u)    = pp u
-  pp (PBDIGroupTemp g)    = pp g
-  pp (PBDIGroupDecl g)    = pp g
+  pp (PBDISubprogDecl s) = pp s
+  pp (PBDISubprogBody b) = pp b
+  pp (PBDIType t)        = pp t
+  pp (PBDISubtype s)     = pp s
+  pp (PBDIConstant c)    = pp c
+  pp (PBDIShared s)      = pp s
+  pp (PBDIFile f)        = pp f
+  pp (PBDIAlias a)       = pp a
+  pp (PBDIUseClause u)   = pp u
+  pp (PBDIGroupTemp g)   = pp g
+  pp (PBDIGroup g)       = pp g
 
 --Instance Pretty PackageBodyDeclarativePart where pp = undefined
 
@@ -722,22 +735,22 @@
          ]
 
 instance Pretty PackageDeclarativeItem where
-  pp (PDISubprogDecl s)  = pp s
-  pp (PDISubprogBody b)  = pp b
-  pp (PDITypeDecl t)     = pp t
-  pp (PDISubtypeDecl s)  = pp s
-  pp (PDIConstantDecl c) = pp c
-  pp (PDISignalDecl s)   = pp s
-  pp (PDISharedDecl v)   = pp v
-  pp (PDIFileDecl f)     = pp f
-  pp (PDIAliasDecl a)    = pp a
-  pp (PDICompDecl c)     = pp c
-  pp (PDIAttrDecl a)     = pp a
-  pp (PDIAttrSpec a)     = pp a
-  pp (PDIDiscSpec d)     = pp d
-  pp (PDIUseClause u)    = pp u
-  pp (PDIGroupTemp g)    = pp g
-  pp (PDIGroupDecl g)    = pp g
+  pp (PHDISubprogDecl s) = pp s
+  pp (PHDISubprogBody b) = pp b
+  pp (PHDIType t)        = pp t
+  pp (PHDISubtype s)     = pp s
+  pp (PHDIConstant c)    = pp c
+  pp (PHDISignal s)      = pp s
+  pp (PHDIShared v)      = pp v
+  pp (PHDIFile f)        = pp f
+  pp (PHDIAlias a)       = pp a
+  pp (PHDIComp c)        = pp c
+  pp (PHDIAttrDecl a)    = pp a
+  pp (PHDIAttrSpec a)    = pp a
+  pp (PHDIDiscSpec d)    = pp d
+  pp (PHDIUseClause u)   = pp u
+  pp (PHDIGroupTemp g)   = pp g
+  pp (PHDIGroup g)       = pp g
   
 --instance Pretty PackageDeclarativePart where pp = undefined
 
@@ -759,12 +772,12 @@
       ]
 
 instance Pretty PortClause where
-  pp (PortClause ls) = text "PORT" <+> parens (pp ls)
+  pp (PortClause ls) = text "PORT" <+> parens (pp ls) <+> semi
 
 --instance Pretty PortList where pp = undefined
 
 instance Pretty PortMapAspect where
-  pp (PortMapAspect as) = text "PORT MAP" <+> parens (pp as)
+  pp (PortMapAspect as) = text "PORT MAP" <+> parens (pp as) <+> semi
 
 instance Pretty Prefix where
   pp (PName n) = pp n
@@ -786,30 +799,30 @@
   pp (ProcedureCall n ap) = pp n <+> cond parens ap
 
 instance Pretty ProcedureCallStatement where
-  pp (ProcedureCallStatement l p) = condR colon l <+> pp p <+> semi
+  pp (ProcedureCallStatement l p) = label l <+> pp p <+> semi
 
 instance Pretty ProcessDeclarativeItem where
-  pp (ProcDISubprogDecl s) = pp s
-  pp (ProcDISubprogBody b) = pp b
-  pp (ProcDIType t)        = pp t
-  pp (ProcDISubtype s)     = pp s
-  pp (ProcDIConstant c)    = pp c
-  pp (ProcDIVariable v)    = pp v
-  pp (ProcDIFile f)        = pp f
-  pp (ProcDIAlias a)       = pp a
-  pp (ProcDIAttrDecl a)    = pp a
-  pp (ProcDIAttrSpec a)    = pp a
-  pp (ProcDIUseClause u)   = pp u
+  pp (PDISubprogDecl s) = pp s
+  pp (PDISubprogBody b) = pp b
+  pp (PDIType t)        = pp t
+  pp (PDISubtype s)     = pp s
+  pp (PDIConstant c)    = pp c
+  pp (PDIVariable v)    = pp v
+  pp (PDIFile f)        = pp f
+  pp (PDIAlias a)       = pp a
+  pp (PDIAttrDecl a)    = pp a
+  pp (PDIAttrSpec a)    = pp a
+  pp (PDIUseClause u)   = pp u
 
 --instance Pretty ProcessDeclarativePart where pp = undefined
 
 instance Pretty ProcessStatement where
   pp (ProcessStatement l p ss d s) =
-    condR colon l `hangs` vcat
-      [ post <+> cond parens ss <+> text "IS"
-        `hangs` pp d
+    labels l $ vcat
+      [ (post <+> cond parens ss <+> text "IS")
+        `hangs` vpp d
       , text "BEGIN"
-        `hangs` pp s
+        `hangs` vpp s
       , text "END" <+> post <+> cond id l <+> semi
       ]
     where
@@ -849,10 +862,10 @@
 
 instance Pretty ReportStatement where
   pp (ReportStatement l e s) =
-    condR colon l `hangs` (text "REPORT" <+> pp e `hangs` condL (text "SEVERITY") s)
+    labels l $ (text "REPORT" <+> pp e `hangs` condL (text "SEVERITY") s)
 
 instance Pretty ReturnStatement where
-  pp (ReturnStatement l e) = condR colon l <+> text "RETURN" <+> condR semi e
+  pp (ReturnStatement l e) = label l <+> text "RETURN" <+> condR semi e
 
 instance Pretty ScalarTypeDefinition where
   pp (ScalarEnum e)  = pp e
@@ -922,13 +935,15 @@
 
 instance Pretty SignalAssignmentStatement where
   pp (SignalAssignmentStatement l t d w) =
-        condR colon l <+> pp t <+> text "<="
+        label l <+> pp t <+> text "<="
     <+> cond  id    d <+> pp w <+> semi
 
 instance Pretty SignalDeclaration where
   pp (SignalDeclaration is s k e) =
-        text "SIGNAL" <+> pp is <+> colon <+> pp s
-    <+> cond id k <+> condL (text ":=") e <+> semi
+        text "SIGNAL"
+    <+> commaSep (fmap pp is)
+    <+> colon <+> pp s <+> cond id k
+    <+> condL (text ":=") e <+> semi
 
 instance Pretty SignalKind where
   pp Register = text "REGISTER"
@@ -956,7 +971,7 @@
   pp (SliceName p r) = pp p <+> parens (pp r)
 
 instance Pretty StringLiteral where
-  pp (SLit s) = text s
+  pp (SLit s) = char '\"' <> text s <> char '\"'
 
 instance Pretty SubprogramBody where
   pp (SubprogramBody s d st k de) =
@@ -970,19 +985,19 @@
 --instance Pretty SubprogramDeclaration where pp = undefined
 
 instance Pretty SubprogramDeclarativeItem where
-  pp (SDISubprogDecl d)  = pp d
-  pp (SDISubprogBody b)  = pp b
-  pp (SDITypeDecl t)     = pp t
-  pp (SDISubtypeDecl s)  = pp s
-  pp (SDIConstantDecl c) = pp c
-  pp (SDIVariableDecl v) = pp v
-  pp (SDIFileDecl f)     = pp f
-  pp (SDIAliasDecl a)    = pp a
-  pp (SDIAttrDecl a)     = pp a
-  pp (SDIAttrSepc a)     = pp a
-  pp (SDIUseClause u)    = pp u
-  pp (SDIGroupTemp g)    = pp g
-  pp (SDIGroupDecl g)    = pp g
+  pp (SDISubprogDecl d) = pp d
+  pp (SDISubprogBody b) = pp b
+  pp (SDIType t)        = pp t
+  pp (SDISubtype s)     = pp s
+  pp (SDIConstant c)    = pp c
+  pp (SDIVariable v)    = pp v
+  pp (SDIFile f)        = pp f
+  pp (SDIAlias a)       = pp a
+  pp (SDIAttrDecl a)    = pp a
+  pp (SDIAttrSepc a)    = pp a
+  pp (SDIUseClause u)   = pp u
+  pp (SDIGroupTemp g)   = pp g
+  pp (SDIGroup g)       = pp g
 
 --instance Pretty SubprogramDeclarativePart where pp = undefined
 
@@ -1054,15 +1069,17 @@
   pp (UseClause ns) = text "USE" <+> commaSep (map pp ns) <+> semi
 
 instance Pretty VariableAssignmentStatement where
-  pp (VariableAssignmentStatement l t e) = condR colon l <+> pp t <+> text ":=" <+> pp e <+> semi
+  pp (VariableAssignmentStatement l t e) = label l <+> pp t <+> text ":=" <+> pp e <+> semi
 
 instance Pretty VariableDeclaration where
   pp (VariableDeclaration s is sub e) =
-    when s (text "SHARED") <+> text "VARIABLE" <+> pp is <+> colon <+> pp sub <+> condL (text ":=") e <+> semi
+    when s (text "SHARED") <+> text "VARIABLE"
+    <+> commaSep (fmap pp is)
+    <+> colon <+> pp sub <+> condL (text ":=") e <+> semi
 
 instance Pretty WaitStatement where
   pp (WaitStatement l sc cc tc) =
-    condR colon l <+> text "WAIT" <+> pp' sc <+> pp' cc <+> pp' tc <+> semi
+    label l <+> text "WAIT" <+> pp' sc <+> pp' cc <+> pp' tc <+> semi
 
 instance Pretty Waveform where
   pp (WaveElem es)    = commaSep $ map pp es
@@ -1075,6 +1092,9 @@
 -- * Some helpers
 --------------------------------------------------------------------------------
 
+--------------------------------------------------------------------------------
+-- text sep.
+  
 commaSep  :: [Doc] -> Doc
 commaSep  = hsep . punctuate comma
 
@@ -1088,29 +1108,32 @@
 textSep s = hsep . punctuate (space <> text s)
 
 --------------------------------------------------------------------------------
+-- indentation
 
-when :: Bool -> Doc -> Doc
-when b a = if b then a else empty
+indent :: Doc -> Doc
+indent = nest 4
 
+hangs  :: Doc -> Doc -> Doc
+hangs d1 d2 = d1 $+$ indent d2
+
+labels  :: Pretty a => Maybe a -> Doc -> Doc
+labels (Nothing) doc = doc
+labels (Just a)  doc = (pp a <+> colon) `hangs` doc
+
+--------------------------------------------------------------------------------
+-- conditional print
+
 cond :: Pretty a => (Doc -> Doc) -> Maybe a -> Doc
 cond f = maybe empty (f . pp)
 
 condR :: Pretty a => Doc -> Maybe a -> Doc
-condR s m = cond (flip (<+>) s) m
+condR s = cond (<+> s)
 
 condL :: Pretty a => Doc -> Maybe a -> Doc
-condL s m = cond ((<+>) s) m
+condL s = cond (s <+>)
 
 label :: Pretty a => Maybe a -> Doc
-label = cond (flip (<+>) colon)
-
-indent :: Doc -> Doc
-indent = nest 4
-
-hangs  :: Doc -> Doc -> Doc
-hangs  = flip hang 4
-
---------------------------------------------------------------------------------
+label = cond (<+> colon)
 
 pp' :: Pretty a => Maybe a -> Doc
 pp' = cond id
@@ -1118,9 +1141,16 @@
 parens' :: Pretty a => Maybe a -> Doc
 parens' = cond parens
 
+when :: Bool -> Doc -> Doc
+when b a = if b then a else empty
+
 --------------------------------------------------------------------------------
+-- some common things
 
-postponed :: Pretty a =>  Maybe Label -> Bool -> a -> Doc
-postponed l b a = condR colon l <+> when b (text "POSTPONED") <+> pp a
+vpp :: Pretty a => [a] -> Doc
+vpp = foldr ($+$) empty . map pp
+
+postponed :: Pretty a => Maybe Label -> Bool -> a -> Doc
+postponed l b a = label l <+> when b (text "POSTPONED") <+> pp a
 
 --------------------------------------------------------------------------------
diff --git a/src/Language/VHDL/Syntax.hs b/src/Language/VHDL/Syntax.hs
--- a/src/Language/VHDL/Syntax.hs
+++ b/src/Language/VHDL/Syntax.hs
@@ -27,6 +27,7 @@
   , entity_declarative_part   :: EntityDeclarativePart
   , entity_statement_part     :: Maybe EntityStatementPart
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 1.1.1 Entity haeder
@@ -43,9 +44,13 @@
     formal_generic_clause     :: Maybe GenericClause
   , formal_port_clause        :: Maybe PortClause
   }
+  deriving (Eq, Show)
 
 data GenericClause = GenericClause GenericList
+  deriving (Eq, Show)
+
 data PortClause    = PortClause    PortList
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 1.1.1.1 Generics
@@ -92,19 +97,20 @@
 data EntityDeclarativeItem =
     EDISubprogDecl  SubprogramDeclaration
   | EDISubprogBody  SubprogramBody
-  | EDITypeDecl     TypeDeclaration
-  | EDISubtypeDecl  SubtypeDeclaration
-  | EDIConstantDecl ConstantDeclaration
-  | EDISignalDecl   SignalDeclaration
-  | EDISharedDecl   VariableDeclaration
-  | EDIFileDecl     FileDeclaration
-  | EDIAliasDecl    AliasDeclaration
+  | EDIType         TypeDeclaration
+  | EDISubtype      SubtypeDeclaration
+  | EDIConstant     ConstantDeclaration
+  | EDISignal       SignalDeclaration
+  | EDIShared       VariableDeclaration
+  | EDIFile         FileDeclaration
+  | EDIAlias        AliasDeclaration
   | EDIAttrDecl     AttributeDeclaration
   | EDIAttrSpec     AttributeSpecification
   | EDIDiscSpec     DisconnectionSpecification
   | EDIUseClause    UseClause
   | EDIGroupTemp    GroupTemplateDeclaration
-  | EDIGroupDecl    GroupDeclaration
+  | EDIGroup        GroupDeclaration
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 1.1.3 Entity statement part
@@ -124,6 +130,7 @@
     ESConcAssert   ConcurrentAssertionStatement
   | ESPassiveConc  ConcurrentProcedureCallStatement
   | ESPassiveProc  ProcessStatement
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 1.2 Arcitecture bodies
@@ -143,6 +150,7 @@
   , archi_declarative_part :: ArchitectureDeclarativePart
   , archi_statement_part   :: ArchitectureStatementPart
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 1.2.1 Architecture declarative part
@@ -175,21 +183,22 @@
 data BlockDeclarativeItem =
     BDISubprogDecl  SubprogramDeclaration
   | BDISubprogBody  SubprogramBody
-  | BDITypeDecl     TypeDeclaration
-  | BDISubtypeDecl  SubtypeDeclaration
-  | BDIConstantDecl ConstantDeclaration
-  | BDISignalDecl   SignalDeclaration
-  | BDISharedDecl   VariableDeclaration
-  | BDIFileDecl     FileDeclaration
-  | BDIAliasDecl    AliasDeclaration
-  | BDICompDecl     ComponentDeclaration
+  | BDIType         TypeDeclaration
+  | BDISubtype      SubtypeDeclaration
+  | BDIConstant     ConstantDeclaration
+  | BDISignal       SignalDeclaration
+  | BDIShared       VariableDeclaration
+  | BDIFile         FileDeclaration
+  | BDIAlias        AliasDeclaration
+  | BDIComp         ComponentDeclaration
   | BDIAttrDecl     AttributeDeclaration
   | BDIAttrSepc     AttributeSpecification
   | BDIConfigSepc   ConfigurationSpecification
   | BDIDisconSpec   DisconnectionSpecification
   | BDIUseClause    UseClause
   | BDIGroupTemp    GroupTemplateDeclaration
-  | BDIGroupDecl    GroupDeclaration
+  | BDIGroup        GroupDeclaration
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 1.2.2 Architecture statement part
@@ -225,13 +234,15 @@
   , config_declarative_part    :: ConfigurationDeclarativePart
   , config_block_configuration :: BlockConfiguration
   }
+  deriving (Eq, Show)
 
 type ConfigurationDeclarativePart = [ConfigurationDeclarativeItem]
 
 data ConfigurationDeclarativeItem =
-    CDIUse   UseClause
-  | CDIAttr  AttributeSpecification
-  | CDIGroup GroupDeclaration
+    CDIUse       UseClause
+  | CDIAttrSpec  AttributeSpecification
+  | CDIGroup     GroupDeclaration
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 1.3.1 Block configuration
@@ -261,19 +272,23 @@
   , block_use_clause         :: [UseClause]
   , block_configuration_item :: [ConfigurationItem]
   }
+  deriving (Eq, Show)
 
 data BlockSpecification =
     BSArch  Name
   | BSBlock Label
   | BSGen   Label
+  deriving (Eq, Show)
 
 data IndexSpecification =
     ISRange DiscreteRange
   | ISExp   Expression
+  deriving (Eq, Show)
 
 data ConfigurationItem  =
     CIBlock BlockConfiguration
   | CIComp  ComponentConfiguration
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 1.3.2 Component configuration
@@ -291,6 +306,7 @@
   , comp_binding_indication  :: Maybe BindingIndication
   , comp_block_configuration :: Maybe BlockConfiguration
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 --
@@ -330,10 +346,12 @@
     , subfun_formal_parameter_list  :: Maybe FormalParameterList
     , subfun_type_mark              :: TypeMark
     }
+  deriving (Eq, Show)
 
 data Designator =
     DId Identifier
   | DOp OperatorSymbol
+  deriving (Eq, Show)
 
 type OperatorSymbol = StringLiteral
 
@@ -403,27 +421,30 @@
   , subprog_kind             :: Maybe SubprogramKind
   , subprog_designator       :: Maybe Designator
   }
+  deriving (Eq, Show)
 
 type SubprogramDeclarativePart = [SubprogramDeclarativeItem]
 
 data SubprogramDeclarativeItem =
     SDISubprogDecl  SubprogramDeclaration
   | SDISubprogBody  SubprogramBody
-  | SDITypeDecl     TypeDeclaration
-  | SDISubtypeDecl  SubtypeDeclaration
-  | SDIConstantDecl ConstantDeclaration
-  | SDIVariableDecl VariableDeclaration
-  | SDIFileDecl     FileDeclaration
-  | SDIAliasDecl    AliasDeclaration
+  | SDIType         TypeDeclaration
+  | SDISubtype      SubtypeDeclaration
+  | SDIConstant     ConstantDeclaration
+  | SDIVariable     VariableDeclaration
+  | SDIFile         FileDeclaration
+  | SDIAlias        AliasDeclaration
   | SDIAttrDecl     AttributeDeclaration
   | SDIAttrSepc     AttributeSpecification
   | SDIUseClause    UseClause
   | SDIGroupTemp    GroupTemplateDeclaration
-  | SDIGroupDecl    GroupDeclaration
+  | SDIGroup        GroupDeclaration
+  deriving (Eq, Show)
     
 type SubprogramStatementPart   = [SequentialStatement]
 
 data SubprogramKind            = Procedure | Function
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 2.3 Subprogram overloading
@@ -442,6 +463,7 @@
 -}
 
 data Signature = Signature (Maybe (Maybe [TypeMark], Maybe TypeMark))
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 2.4 Resolution functions
@@ -481,26 +503,28 @@
     packd_identifier       :: Identifier
   , packd_declarative_part :: PackageDeclarativePart
   }
+  deriving (Eq, Show)
 
 type PackageDeclarativePart = [PackageDeclarativeItem]
 
 data PackageDeclarativeItem =
-    PDISubprogDecl  SubprogramDeclaration
-  | PDISubprogBody  SubprogramBody
-  | PDITypeDecl     TypeDeclaration
-  | PDISubtypeDecl  SubtypeDeclaration
-  | PDIConstantDecl ConstantDeclaration
-  | PDISignalDecl   SignalDeclaration
-  | PDISharedDecl   VariableDeclaration
-  | PDIFileDecl     FileDeclaration
-  | PDIAliasDecl    AliasDeclaration
-  | PDICompDecl     ComponentDeclaration
-  | PDIAttrDecl     AttributeDeclaration
-  | PDIAttrSpec     AttributeSpecification
-  | PDIDiscSpec     DisconnectionSpecification
-  | PDIUseClause    UseClause
-  | PDIGroupTemp    GroupTemplateDeclaration
-  | PDIGroupDecl    GroupDeclaration
+    PHDISubprogDecl  SubprogramDeclaration
+  | PHDISubprogBody  SubprogramBody
+  | PHDIType         TypeDeclaration
+  | PHDISubtype      SubtypeDeclaration
+  | PHDIConstant     ConstantDeclaration
+  | PHDISignal       SignalDeclaration
+  | PHDIShared       VariableDeclaration
+  | PHDIFile         FileDeclaration
+  | PHDIAlias        AliasDeclaration
+  | PHDIComp         ComponentDeclaration
+  | PHDIAttrDecl     AttributeDeclaration
+  | PHDIAttrSpec     AttributeSpecification
+  | PHDIDiscSpec     DisconnectionSpecification
+  | PHDIUseClause    UseClause
+  | PHDIGroupTemp    GroupTemplateDeclaration
+  | PHDIGroup        GroupDeclaration
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 2.6 Package bodies
@@ -531,21 +555,23 @@
     packb_simple_name           :: SimpleName
   , packb_body_declarative_part :: PackageBodyDeclarativePart
   }
+  deriving (Eq, Show)
 
 type PackageBodyDeclarativePart = [PackageBodyDeclarativeItem]
 
 data PackageBodyDeclarativeItem = 
     PBDISubprogDecl  SubprogramDeclaration
   | PBDISubprogBody  SubprogramBody
-  | PBDITypeDecl     TypeDeclaration
-  | PBDISubtypeDecl  SubtypeDeclaration
-  | PBDIConstantDecl ConstantDeclaration
-  | PBDISharedDecl   VariableDeclaration
-  | PBDIFileDecl     FileDeclaration
-  | PBDIAliasDecl    AliasDeclaration
+  | PBDIType         TypeDeclaration
+  | PBDISubtype      SubtypeDeclaration
+  | PBDIConstant     ConstantDeclaration
+  | PBDIShared       VariableDeclaration
+  | PBDIFile         FileDeclaration
+  | PBDIAlias        AliasDeclaration
   | PBDIUseClause    UseClause
   | PBDIGroupTemp    GroupTemplateDeclaration
-  | PBDIGroupDecl    GroupDeclaration
+  | PBDIGroup        GroupDeclaration
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 2.7 Conformance rules
@@ -584,8 +610,10 @@
   | ScalarInt   IntegerTypeDefinition
   | ScalarFloat FloatingTypeDefinition
   | ScalarPhys  PhysicalTypeDefinition
+  deriving (Eq, Show)
 
 data RangeConstraint = RangeConstraint Range
+  deriving (Eq, Show)
 
 data Range =
     RAttr   AttributeName
@@ -594,8 +622,10 @@
     , range_dir   :: Direction
     , range_upper :: SimpleExpression
     }
+  deriving (Eq, Show)
 
 data Direction = To | DownTo
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 3.1.1 Enumeration types
@@ -607,10 +637,12 @@
 -}
 
 data EnumerationTypeDefinition = EnumerationTypeDefinition [EnumerationLiteral]
+  deriving (Eq, Show)
 
 data EnumerationLiteral =
     EId   Identifier
   | EChar CharacterLiteral
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 3.1.1.1 Predefined enumeration types
@@ -653,15 +685,18 @@
   , physd_secondary_unit_declaration :: [SecondaryUnitDeclaration]
   , physd_simple_name                :: Maybe SimpleName
   }
+  deriving (Eq, Show)
 
 type PrimaryUnitDeclaration   = Identifier
 
 data SecondaryUnitDeclaration = SecondaryUnitDeclaration Identifier PhysicalLiteral
+  deriving (Eq, Show)
 
 data PhysicalLiteral = PhysicalLiteral {
     physl_abstract_literal :: Maybe Literal
   , physl_unit_name        :: Name
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 3.1.3.1 Predefined physical types
@@ -692,6 +727,7 @@
 data CompositeTypeDefinition =
     CTDArray  ArrayTypeDefinition
   | CTDRecord RecordTypeDefinition
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 3.2.1 Array types
@@ -717,24 +753,30 @@
 data ArrayTypeDefinition =
     ArrU UnconstrainedArrayDefinition
   | ArrC ConstrainedArrayDefinition
+  deriving (Eq, Show)
 
 data UnconstrainedArrayDefinition = UnconstrainedArrayDefinition {
     arru_index_subtype_definition   :: [IndexSubtypeDefinition]
   , arru_element_subtype_indication :: (SubtypeIndication)
   }
+  deriving (Eq, Show)
 
 data ConstrainedArrayDefinition = ConstrainedArrayDefinition {
     arrc_index_constraint   :: IndexConstraint
   , arrc_subtype_indication :: SubtypeIndication
   }
+  deriving (Eq, Show)
 
 data IndexSubtypeDefinition = IndexSubtypeDefinition TypeMark
+  deriving (Eq, Show)
 
 data IndexConstraint = IndexConstraint [DiscreteRange]
+  deriving (Eq, Show)
 
 data DiscreteRange =
     DRSub   SubtypeIndication
   | DRRange Range
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 3.2.1.1 Index constraints and discrete ranges
@@ -767,11 +809,13 @@
     rectd_element_declaration :: [ElementDeclaration]
   , rectd_type_simple_name    :: Maybe SimpleName
   }
+  deriving (Eq, Show)
 
 data ElementDeclaration = ElementDeclaration {
     elemd_identifier_list    :: IdentifierList
   , elemd_subtype_definition :: ElementSubtypeDefinition
   }
+  deriving (Eq, Show)
 
 type IdentifierList           = [Identifier]
 
@@ -784,6 +828,7 @@
 -}
 
 data AccessTypeDefinition = AccessTypeDefinition SubtypeIndication
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 3.3.1 Incomplete type declarations
@@ -792,6 +837,7 @@
 -}
 
 data IncompleteTypeDeclaration = IncompleteTypeDeclaration Identifier
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 3.3.2 Allocation and deallocation of objects
@@ -805,6 +851,7 @@
 -}
 
 data FileTypeDefinition = FileTypeDefinition TypeMark
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 3.4.1 File operations
@@ -853,6 +900,7 @@
   | DConfiguration ConfigurationDeclaration
   | DSubprogram    SubprogramDeclaration
   | DPackage       PackageDeclaration
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 4.1 Type declarations
@@ -873,11 +921,13 @@
 -}
 
 data TypeDeclaration = TDFull FullTypeDeclaration | TDPartial IncompleteTypeDeclaration
+  deriving (Eq, Show)
 
 data FullTypeDeclaration = FullTypeDeclaration {
     ftd_identifier      :: Identifier
   , ftd_type_definition :: TypeDefinition
   }
+  deriving (Eq, Show)
 
 data TypeDefinition =
     TDScalar       ScalarTypeDefinition
@@ -885,6 +935,7 @@
   | TDAccess       AccessTypeDefinition
   | TDFile           FileTypeDefinition
 --  | TDProt      ProtectedTypeDefinition
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 4.2 Subtype declarations
@@ -908,16 +959,20 @@
     sd_identifier               :: Identifier
   , sd_indication               :: SubtypeIndication
   }
+  deriving (Eq, Show)
 
 data SubtypeIndication = SubtypeIndication {
     si_resolution_function_name :: Maybe Name
   , si_type_mark                :: TypeMark
   , si_constraint               :: Maybe Constraint
   }
+  deriving (Eq, Show)
 
 data TypeMark   = TMType Name | TMSubtype Name
+  deriving (Eq, Show)
 
 data Constraint = CRange RangeConstraint | CIndex IndexConstraint
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 4.3 Objects
@@ -937,6 +992,7 @@
   | ObjSig     SignalDeclaration
   | ObjVar   VariableDeclaration
   | ObjFile      FileDeclaration
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 4.3.1.1 Constant declarations
@@ -950,6 +1006,7 @@
   , const_subtype_indication :: SubtypeIndication
   , const_expression         :: Maybe Expression
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 4.3.1.2 Signal declarations
@@ -966,8 +1023,10 @@
   , signal_kind               :: Maybe SignalKind
   , signal_expression         :: Maybe Expression
   }
+  deriving (Eq, Show)
 
 data SignalKind = Register | Bus
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 4.3.1.3 Variable declarations
@@ -982,6 +1041,7 @@
   , var_subtype_indication :: SubtypeIndication
   , var_expression         :: Maybe Expression
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 4.3.1.4 File declarations
@@ -1000,11 +1060,13 @@
   , fd_subtype_indication   :: SubtypeIndication
   , fd_open_information     :: Maybe FileOpenInformation
   }
+  deriving (Eq, Show)
 
 data FileOpenInformation = FileOpenInformation {
     foi_open_kind_expression :: Maybe Expression
   , foi_logical_name         :: FileLogicalName
   }
+  deriving (Eq, Show)
 
 type FileLogicalName = Expression
 
@@ -1055,8 +1117,10 @@
         idecl_identifier_list     :: IdentifierList
       , ifile_subtype_indication  :: SubtypeIndication
     }
+  deriving (Eq, Show)
 
 data Mode = In | Out | InOut | Buffer | Linkage
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 4.3.2.1 Interface lists
@@ -1067,6 +1131,7 @@
 -}
 
 data InterfaceList    = InterfaceList [InterfaceElement]
+  deriving (Eq, Show)
 
 type InterfaceElement = InterfaceDeclaration
 
@@ -1106,18 +1171,22 @@
     assoc_formal_part :: Maybe FormalPart
   , assoc_actual_part :: ActualPart
   }
+  deriving (Eq, Show)
 
 data AssociationList = AssociationList [AssociationElement]
+  deriving (Eq, Show)
 
 data FormalDesignator =
     FDGeneric   Name
   | FDPort      Name
   | FDParameter Name
+  deriving (Eq, Show)
 
 data FormalPart =
     FPDesignator          FormalDesignator
   | FPFunction   Name     FormalDesignator
   | FPType       TypeMark FormalDesignator
+  deriving (Eq, Show)
 
 data ActualDesignator =
     ADExpression  Expression
@@ -1125,11 +1194,13 @@
   | ADVariable    Name
   | ADFile        Name
   | ADOpen
+  deriving (Eq, Show)
 
 data ActualPart =
     APDesignator          ActualDesignator
   | APFunction   Name     ActualDesignator
   | APType       TypeMark ActualDesignator
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 4.3.3 Alias declarations
@@ -1146,11 +1217,13 @@
   , alias_name               :: Name
   , alias_signature          :: Maybe Signature
   }
+  deriving (Eq, Show)
 
 data AliasDesignator =
     ADIdentifier Identifier
   | ADCharacter  CharacterLiteral
   | ADOperator   OperatorSymbol
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 4.3.3.1 Object aliases
@@ -1169,6 +1242,7 @@
     attr_identifier :: Identifier
   , attr_type_marke :: TypeMark
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 4.5 Component declarations
@@ -1186,6 +1260,7 @@
   , comp_local_port_clause    :: Maybe PortClause
   , comp_simple_name          :: Maybe SimpleName
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 4.6 Group template declarations
@@ -1203,6 +1278,7 @@
     gtd_identifier              :: Identifier
   , gtd_entity_class_entry_list :: EntityClassEntryList
   }
+  deriving (Eq, Show)
 
 type EntityClassEntryList = [EntityClassEntry]
 
@@ -1210,6 +1286,7 @@
     entc_entity_class :: EntityClass
   , entc_multiple     :: Bool
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 4.7 Group declarations
@@ -1227,12 +1304,14 @@
   , group_template_name    :: Name
   , group_constituent_list :: GroupConstituentList
   }
+  deriving (Eq, Show)
 
 type GroupConstituentList = [GroupConstituent]
 
 data GroupConstituent =
     GCName Name
   | GCChar CharacterLiteral
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 --
@@ -1274,11 +1353,13 @@
   , as_entity_specification :: EntitySpecification
   , as_expression           :: Expression
   }
+  deriving (Eq, Show)
 
 data EntitySpecification = EntitySpecification {
     es_entity_name_list     :: EntityNameList
   , es_entity_class         :: EntityClass
   }
+  deriving (Eq, Show)
 
 data EntityClass =
     ENTITY     | ARCHITECTURE  | CONFIGURATION
@@ -1287,21 +1368,25 @@
   | SIGNAL     | VARIABLE      | COMPONENT
   | LABEL      | LITERAL       | UNITS
   | GROUP      | FILE
+  deriving (Eq, Show)
 
 data EntityNameList =
     ENLDesignators [EntityDesignator]
   | ENLOthers
   | ENLAll
+  deriving (Eq, Show)
 
 data EntityDesignator = EntityDesignator {
     ed_entity_tag :: EntityTag
   , ed_signature  :: Maybe Signature
   }
+  deriving (Eq, Show)
 
 data EntityTag =
     ETName SimpleName
   | ETChar CharacterLiteral
   | ETOp   OperatorSymbol
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 5.2 Configuration specification
@@ -1323,16 +1408,19 @@
     cs_component_specification :: ComponentSpecification
   , cs_binding_indication      :: BindingIndication
   }
+  deriving (Eq, Show)
 
 data ComponentSpecification = ComponentSpecification {
     cs_instantiation_list      :: InstantiationList
   , cs_component_name          :: Name
   }
+  deriving (Eq, Show)
 
 data InstantiationList =
     ILLabels [Label]
   | ILOthers
   | ILAll
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 5.2.1 Binding indication
@@ -1348,6 +1436,7 @@
   , bi_generic_map_aspect :: Maybe GenericMapAspect
   , bi_port_map_aspect    :: Maybe PortMapAspect
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 5.2.1.1 Entity aspect
@@ -1362,6 +1451,7 @@
     EAEntity Name (Maybe Identifier)
   | EAConfig Name
   | EAOpen
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 5.2.1.2 Generic map and port map aspects
@@ -1374,8 +1464,10 @@
 -}
 
 data GenericMapAspect = GenericMapAspect AssociationList
+  deriving (Eq, Show)
 
 data PortMapAspect    = PortMapAspect    AssociationList
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 5.2.2 Default binding indication
@@ -1401,16 +1493,19 @@
     ds_guarded_signal_specification :: GuardedSignalSpecification
   , ds_time_expression              :: Expression
   }
+  deriving (Eq, Show)
 
 data GuardedSignalSpecification = GuardedSignalSpecification {
     gs_guarded_signal_list          :: SignalList
   , gs_type_mark                    :: TypeMark
   }
+  deriving (Eq, Show)
 
 data SignalList =
     SLName   [Name]
   | SLOthers
   | SLAll
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 --
@@ -1443,10 +1538,12 @@
   | NIndex  IndexedName
   | NSlice  SliceName
   | NAttr   AttributeName
+  deriving (Eq, Show)
 
 data Prefix =
     PName Name
   | PFun  FunctionCall
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 6.2 Simple names
@@ -1472,12 +1569,14 @@
     sname_prefix :: Prefix
   , sname_suffix :: Suffix
   }
+  deriving (Eq, Show)
 
 data Suffix =
     SSimple SimpleName
   | SChar   CharacterLiteral
   | SOp     OperatorSymbol
   | SAll
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 6.4 Indexed names
@@ -1489,6 +1588,7 @@
     iname_prefix     :: Prefix
   , iname_expression :: [Expression]
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 6.5 Slice names
@@ -1500,6 +1600,7 @@
     slice_prefix         :: Prefix
   , slice_discrete_range :: DiscreteRange
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 6.6 Attribute names
@@ -1516,6 +1617,7 @@
   , aname_attribute_designator :: AttributeDesignator
   , aname_expression           :: Maybe Expression
   }
+  deriving (Eq, Show)
 
 type AttributeDesignator = SimpleName
 
@@ -1573,32 +1675,38 @@
   | ENand (Relation) (Maybe Relation)
   | ENor  (Relation) (Maybe Relation)
   | EXnor [Relation]
+  deriving (Eq, Show)
 
 data Relation         = Relation {
     relation_shift_expression :: ShiftExpression
   , relation_operator         :: Maybe (RelationalOperator, ShiftExpression)
   }
+  deriving (Eq, Show)
 
 data ShiftExpression  = ShiftExpression {
     shifte_simple_expression  :: SimpleExpression
   , shifte_shift_operator     :: Maybe (ShiftOperator, SimpleExpression)
   }
+  deriving (Eq, Show)
 
 data SimpleExpression = SimpleExpression {
     sexp_sign                 :: Maybe Sign
   , sexp_term                 :: Term
   , sexp_adding               :: [(AddingOperator, Term)]
   }
+  deriving (Eq, Show)
 
 data Term = Term {
     term_factor               :: Factor
   , term_multiplying          :: [(MultiplyingOperator, Factor)]
   }
+  deriving (Eq, Show)
 
 data Factor =
     FacPrim Primary (Maybe Primary)
   | FacAbs  Primary
   | FacNot  Primary
+  deriving (Eq, Show)
 
 data Primary =
     PrimName  Name
@@ -1609,6 +1717,7 @@
   | PrimTCon  TypeConversion
   | PrimAlloc Allocator
   | PrimExp   Expression
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 7.2 Operators
@@ -1629,18 +1738,25 @@
 -}
 
 data LogicalOperator  = And | Or | Nand | Nor | Xor | Xnor
+  deriving (Eq, Show)
 
 data RelationalOperator = Eq | Neq | Lt | Lte | Gt | Gte
+  deriving (Eq, Show)
 
 data ShiftOperator    = Sll | Srl | Sla | Sra | Rol | Ror
+  deriving (Eq, Show)
 
 data AddingOperator   = Plus | Minus | Concat
+  deriving (Eq, Show)
 
 data Sign             = Identity | Negation
+  deriving (Eq, Show)
 
 data MultiplyingOperator = Times | Div | Mod | Rem
+  deriving (Eq, Show)
 
 data MiscellaneousOperator = Exp | Abs | Not
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 7.2.1 Logical operators
@@ -1701,10 +1817,12 @@
   | LitString    StringLiteral
   | LitBitString BitStringLiteral
   | LitNull 
+  deriving (Eq, Show)
 
 data NumericLiteral =
     NLitAbstract AbstractLiteral
   | NLitPhysical PhysicalLiteral
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 7.3.2 Aggregates
@@ -1728,19 +1846,23 @@
 data Aggregate = Aggregate {
     agg_element_association :: [ElementAssociation]
   }
+  deriving (Eq, Show)
 
 data ElementAssociation = ElementAssociation {
     eassoc_choices'   :: Maybe Choices
   , eassoc_expression :: Expression
   }
+  deriving (Eq, Show)
 
 data Choices = Choices [Choice]
+  deriving (Eq, Show)
 
 data Choice =
     ChoiceSimple SimpleExpression
   | ChoiceRange  DiscreteRange
   | ChoiceName   SimpleName
   | ChoiceOthers
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- *** 7.3.2.1 Record aggregates
@@ -1765,6 +1887,7 @@
     fc_function_name         :: Name
   , fc_actual_parameter_part :: Maybe ActualParameterPart
   }
+  deriving (Eq, Show)
 
 type ActualParameterPart = AssociationList
 
@@ -1779,6 +1902,7 @@
 data QualifiedExpression =
     QualExp TypeMark Expression
   | QualAgg TypeMark Aggregate
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 7.3.5 Type conversions
@@ -1790,6 +1914,7 @@
     type_mark  :: TypeMark
   , expression :: Expression
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 7.3.6 Allocators
@@ -1802,6 +1927,7 @@
 data Allocator =
     AllocSub  SubtypeIndication
   | AllocQual QualifiedExpression
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 7.4 Static expressions
@@ -1864,6 +1990,7 @@
   | SExit      ExitStatement
   | SReturn    ReturnStatement
   | SNull      NullStatement
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.1 Wait statement
@@ -1884,16 +2011,21 @@
 
 data WaitStatement = WaitStatement
     (Maybe Label) (Maybe SensitivityClause) (Maybe ConditionClause) (Maybe TimeoutClause)
+  deriving (Eq, Show)
 
 data SensitivityClause = SensitivityClause SensitivityList
+  deriving (Eq, Show)
 
 data SensitivityList = SensitivityList [Name]
+  deriving (Eq, Show)
 
 data ConditionClause = ConditionClause Condition
+  deriving (Eq, Show)
 
 type Condition = Expression
 
 data TimeoutClause = TimeoutClause Expression
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.2 Assertion statement
@@ -1908,9 +2040,11 @@
 
 data AssertionStatement = AssertionStatement
       (Maybe Label) Assertion
+  deriving (Eq, Show)
 
 data Assertion = Assertion
       Condition (Maybe Expression) (Maybe Expression)
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.3 Report statement
@@ -1923,6 +2057,7 @@
 
 data ReportStatement = ReportStatement
       (Maybe Label) Expression (Maybe Expression)
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.4 Signal assignment statement
@@ -1945,18 +2080,22 @@
 
 data SignalAssignmentStatement = SignalAssignmentStatement
       (Maybe Label) Target (Maybe DelayMechanism) Waveform
+  deriving (Eq, Show)
 
 data DelayMechanism =
     DMechTransport
   | DMechInertial  (Maybe Expression)
+  deriving (Eq, Show)
 
 data Target = 
     TargetName Name
   | TargetAgg  Aggregate
+  deriving (Eq, Show)
 
 data Waveform =
     WaveElem [WaveformElement]
   | WaveUnaffected
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 8.4.1 Updating a projected output waveform
@@ -1969,6 +2108,7 @@
 data WaveformElement =
     WaveEExp  Expression (Maybe Expression)
   | WaveENull            (Maybe Expression)
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.5 Variable assignment statement
@@ -1979,6 +2119,7 @@
 
 data VariableAssignmentStatement = VariableAssignmentStatement
       (Maybe Label) Target Expression
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 8.5.1 Array variable assignments
@@ -1995,9 +2136,11 @@
 
 data ProcedureCallStatement = ProcedureCallStatement
       (Maybe Label) ProcedureCall
+  deriving (Eq, Show)
 
 data ProcedureCall = ProcedureCall
       Name (Maybe ActualParameterPart)
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.7 If statement
@@ -2019,6 +2162,7 @@
   , if_also      :: [(Condition, SequenceOfStatements)]
   , if_else      :: Maybe SequenceOfStatements
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.8 Case statement
@@ -2040,8 +2184,10 @@
   , case_expression   :: Expression
   , case_alternatives :: [CaseStatementAlternative]
   }
+  deriving (Eq, Show)
 
 data CaseStatementAlternative = CaseStatementAlternative Choices SequenceOfStatements
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.9 Loop statement
@@ -2065,15 +2211,18 @@
   , loop_iteration_scheme :: Maybe IterationScheme
   , loop_statements       :: SequenceOfStatements
   }
+  deriving (Eq, Show)
 
 data IterationScheme =
     IterWhile Condition
   | IterFor   ParameterSpecification
+  deriving (Eq, Show)
 
 data ParameterSpecification = ParameterSpecification {
     paramspec_identifier     :: Identifier
   , paramspec_discrete_range :: DiscreteRange
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.10 Next statement
@@ -2087,6 +2236,7 @@
   , next_loop  :: Maybe Label
   , next_when  :: Maybe Condition
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.11 Exit statement
@@ -2100,6 +2250,7 @@
   , exit_loop  :: Maybe Label
   , exit_when  :: Maybe Condition
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.12 Return statement
@@ -2112,6 +2263,7 @@
     return_label      :: Maybe Label
   , return_expression :: Maybe Expression
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 8.13 Null statement
@@ -2123,6 +2275,7 @@
 data NullStatement = NullStatement {
     null_label :: Maybe Label
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 --
@@ -2151,6 +2304,7 @@
   | ConSignalAss ConcurrentSignalAssignmentStatement
   | ConComponent ComponentInstantiationStatement
   | ConGenerate  GenerateStatement
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 9.1 Block statement
@@ -2184,11 +2338,13 @@
   , blocks_declarative_part :: BlockDeclarativePart
   , blocks_statment_part    :: BlockStatementPart
   }
+  deriving (Eq, Show)
 
 data BlockHeader = BlockHeader {
     blockh_generic_clause   :: Maybe (GenericClause, Maybe GenericMapAspect)
   , blockh_port_clause      :: Maybe (PortClause,    Maybe PortMapAspect)
   }
+  deriving (Eq, Show)
 
 type BlockDeclarativePart = [BlockDeclarativeItem]
 
@@ -2221,6 +2377,9 @@
       | attribute_specification
       | use_clause
       | group_type_declaration
+
+    process_statement_part ::=
+      { sequential_statement }
 -}
 
 data ProcessStatement = ProcessStatement {
@@ -2228,25 +2387,29 @@
   , procs_postponed        :: Bool
   , procs_sensitivity_list :: Maybe SensitivityList
   , procs_declarative_part :: ProcessDeclarativePart
-  , procs_statement_part   :: ProcessStatement
+  , procs_statement_part   :: ProcessStatementPart
   }
+  deriving (Eq, Show)
 
 type ProcessDeclarativePart = [ProcessDeclarativeItem]
 
 data ProcessDeclarativeItem =
-    ProcDISubprogDecl SubprogramDeclaration
-  | ProcDISubprogBody SubprogramBody
-  | ProcDIType        TypeDeclaration
-  | ProcDISubtype     SubtypeDeclaration
-  | ProcDIConstant    ConstantDeclaration
-  | ProcDIVariable    VariableDeclaration
-  | ProcDIFile        FileDeclaration
-  | ProcDIAlias       AliasDeclaration
-  | ProcDIAttrDecl    AttributeDeclaration
-  | ProcDIAttrSpec    AttributeSpecification
-  | ProcDIUseClause   UseClause
+    PDISubprogDecl SubprogramDeclaration
+  | PDISubprogBody SubprogramBody
+  | PDIType        TypeDeclaration
+  | PDISubtype     SubtypeDeclaration
+  | PDIConstant    ConstantDeclaration
+  | PDIVariable    VariableDeclaration
+  | PDIFile        FileDeclaration
+  | PDIAlias       AliasDeclaration
+  | PDIAttrDecl    AttributeDeclaration
+  | PDIAttrSpec    AttributeSpecification
+  | PDIUseClause   UseClause
 --  | ProcDIGroupType   ()
+  deriving (Eq, Show)
 
+type ProcessStatementPart = [SequentialStatement]
+
 --------------------------------------------------------------------------------
 -- * 9.3 Concurrent procedure call statements
 {-
@@ -2259,6 +2422,7 @@
   , cpcs_postponed      :: Bool
   , cpcs_procedure_call :: ProcedureCall
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 9.4 Concurrent assertion statements
@@ -2272,6 +2436,7 @@
   , cas_postponed      :: Bool
   , cas_assertion      :: Assertion
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 9.5 Concurrent signal assignment statements
@@ -2294,11 +2459,13 @@
     , csas_select_postponed         :: Bool
     , csas_select_signal_assignment :: SelectedSignalAssignment
     }
+  deriving (Eq, Show)
 
 data Options = Options {
     options_guarded         :: Bool
   , options_delay_mechanism :: Maybe DelayMechanism
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 9.5.1 Conditional signal assignments
@@ -2316,11 +2483,13 @@
   , csa_options               :: Options
   , csa_conditional_waveforms :: ConditionalWaveforms
   }
+  deriving (Eq, Show)
 
 data ConditionalWaveforms = ConditionalWaveforms {
     cw_optional              :: [(Waveform, Condition)]
   , cw_wave                  :: (Waveform, Maybe Condition)
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 9.5.2 Selected signal assignments
@@ -2340,11 +2509,13 @@
   , ssa_options            :: Options
   , ssa_selected_waveforms :: SelectedWaveforms
   }
+  deriving (Eq, Show)
 
 data SelectedWaveforms = SelectedWaveforms {
     sw_optional :: Maybe [(Waveform, Choices)]
   , sw_last     :: (Waveform, Choices)
   }
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- * 9.6 Component instantiation statements
@@ -2367,11 +2538,13 @@
   , cis_generic_map_aspect  :: Maybe GenericMapAspect
   , cis_port_map_aspect     :: Maybe PortMapAspect
   }
+  deriving (Eq, Show)
 
 data InstantiatedUnit =
     IUComponent Name
   | IUEntity    Name (Maybe Identifier)
   | IUConfig    Name
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 -- ** 9.6.1 Instantiation of a component
@@ -2403,10 +2576,12 @@
   , gens_block_declarative_item :: Maybe (BlockDeclarativeItem)
   , gens_concurrent_statement   :: [ConcurrentStatement]
   }
+  deriving (Eq, Show)
 
 data GenerationScheme =
     GSFor ParameterSpecification
   | GSIf Condition
+  deriving (Eq, Show)
 
 type Label = Identifier
 
@@ -2414,12 +2589,16 @@
 -- ?
 
 data UseClause        = UseClause [SelectedName]
+  deriving (Eq, Show)
 
 data Identifier       = Ident String
+  deriving (Eq, Show)
 
 data CharacterLiteral = CLit Char
+  deriving (Eq, Show)
 
 data StringLiteral    = SLit String
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 --
@@ -2428,61 +2607,87 @@
 --------------------------------------------------------------------------------
 
 data AbstractLiteral  = AbstractLiteral
+  deriving (Eq, Show)
 
 data Base = Base
+  deriving (Eq, Show)
 
 data BaseSpecifier = BaseSpecifier
+  deriving (Eq, Show)
 
 data BaseUnitDeclaration = BaseUnitDeclaration
+  deriving (Eq, Show)
 
 data BasedInteger = BasedInteger
+  deriving (Eq, Show)
 
 data BasedLiteral = BasedLiteral
+  deriving (Eq, Show)
 
 data BasicCharacter = BasicCharacter
+  deriving (Eq, Show)
 
 data BasicGraphicCharacter = BasicGraphicCharacter
+  deriving (Eq, Show)
 
 data BasicIdentifier = BasicIdentifier
+  deriving (Eq, Show)
 
 data BitStringLiteral = BitStringLiteral
+  deriving (Eq, Show)
 
 data BitValue = BitValue
+  deriving (Eq, Show)
 
 data ContextClause = ContextClause
+  deriving (Eq, Show)
 
 data ContextItem = ContextItem
+  deriving (Eq, Show)
 
 data DecimalLiteral = DecimalLiteral
+  deriving (Eq, Show)
 
 data DesignFile = DesignFile
+  deriving (Eq, Show)
 
 data DesignUnit = DesignUnit
+  deriving (Eq, Show)
 
 data Exponent = Exponent
+  deriving (Eq, Show)
 
 data ExtendedDigit = ExtendedDigit
+  deriving (Eq, Show)
 
 data ExtendedIdentifier = ExtendedIdentifier
+  deriving (Eq, Show)
 
 data GraphicCharacter = GraphicCharacter
+  deriving (Eq, Show)
 
 data Letter = Letter
+  deriving (Eq, Show)
 
 data LetterOrDigit = LetterOrDigit
+  deriving (Eq, Show)
 
 data LibraryClause = LibraryClause
+  deriving (Eq, Show)
 
 data LibraryUnit = LibraryUnit
+  deriving (Eq, Show)
 
 data LogicalName = LogicalName
+  deriving (Eq, Show)
 
 data LogicalNameList = LogicalNameList
+  deriving (Eq, Show)
 
 data PrimaryUnit = PrimaryUnit
-
-data ProcessStatementPart = ProcessStatementPart
+  deriving (Eq, Show)
 
 data SecondaryUnit = SecondaryUnit
+  deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
