diff --git a/radius.cabal b/radius.cabal
--- a/radius.cabal
+++ b/radius.cabal
@@ -1,13 +1,13 @@
 name:                radius
-version:             0.5.0.2
+version:             0.6.0.0
 synopsis:            Remote Authentication Dial In User Service (RADIUS)
 description:         This module provides types and on the wire de/coding of RADIUS packets as per RFC2865
-homepage:            https://gitlab.com/codemonkeylabs/radius#readme
+homepage:            https://github.com/erickg/radius#readme
 license:             BSD3
 license-file:        LICENSE
 author:              Erick Gonzalez
 maintainer:          erick@codemonkeylabs.de
-copyright:           2018 Erick Gonzalez
+copyright:           2017 Erick Gonzalez
 category:            Network
 build-type:          Simple
 extra-source-files:  README.md
@@ -29,4 +29,4 @@
 
 source-repository head
   type:     git
-  location: https://gitlab.com/codemonkeylabs/radius
+  location: https://github.com/erickg/radius
diff --git a/src/Network/RADIUS/Encoding.hs b/src/Network/RADIUS/Encoding.hs
--- a/src/Network/RADIUS/Encoding.hs
+++ b/src/Network/RADIUS/Encoding.hs
@@ -197,6 +197,7 @@
       putWord8 attrLen
       putWord8 identity
       putLazyByteString str
+    put (UnknownAttribute attributeType value) = putAttribute attributeType value
 
     get = do
       code <- getWord8
@@ -300,7 +301,7 @@
   identity <- getWord8
   attrData <- getLazyByteString 16 -- CHAP response is always 16 octets
   return $ CHAPPassword identity attrData
-getAttribute n  = fail $ "Unknown RADIUS attribute type " ++ show n
+getAttribute n  = getAttributeStr >>= return . UnknownAttribute n
 
 -- | For internal use.
 getAttributeStr :: Get ByteString
diff --git a/src/Network/RADIUS/Types.hs b/src/Network/RADIUS/Types.hs
--- a/src/Network/RADIUS/Types.hs
+++ b/src/Network/RADIUS/Types.hs
@@ -41,18 +41,19 @@
                 | AccessChallenge
                 | StatusServer
                 | StatusClient
+                | UnknownPacketType Int
                   deriving (Show, Eq)
 
-
 instance Enum PacketType where
-    fromEnum AccessRequest      = 1
-    fromEnum AccessAccept       = 2
-    fromEnum AccessReject       = 3
-    fromEnum AccountingRequest  = 4
-    fromEnum AccountingResponse = 5
-    fromEnum AccessChallenge    = 11
-    fromEnum StatusServer       = 12
-    fromEnum StatusClient       = 13
+    fromEnum AccessRequest         = 1
+    fromEnum AccessAccept          = 2
+    fromEnum AccessReject          = 3
+    fromEnum AccountingRequest     = 4
+    fromEnum AccountingResponse    = 5
+    fromEnum AccessChallenge       = 11
+    fromEnum StatusServer          = 12
+    fromEnum StatusClient          = 13
+    fromEnum (UnknownPacketType x) = x
     toEnum 1  = AccessRequest
     toEnum 2  = AccessAccept
     toEnum 3  = AccessReject
@@ -61,7 +62,7 @@
     toEnum 11 = AccessChallenge
     toEnum 12 = StatusServer
     toEnum 13 = StatusClient
-    toEnum x  = error $ "Invalid RADIUS packet type " ++ show x
+    toEnum x  = UnknownPacketType x
 
 data PacketAttribute =
     UserNameAttribute               { getUserNameAttribute               :: ByteString        }
@@ -132,9 +133,10 @@
   | AcctInterimIntervalAttribute    { getAcctInterimIntervalAttribute    :: Word32            }
   | NASPortIdAttribute              { getNASPortIdAttribute              :: ByteString        }
   | FramedPoolAttribute             { getFramedPoolAttribute             :: ByteString        }
+  | UnknownAttribute                { getUnknownType                     :: Word8,
+                                      getUnknownAttribute                :: ByteString        }
   deriving (Show, Eq, Data)
 
-
 data ServiceType = LoginService
                  | FramedService
                  | CallbackLoginService
@@ -146,6 +148,7 @@
                  | CallbackNASPrompt
                  | CallCheckService
                  | CallbackAdministrativeService
+                 | UnknownServiceType Int
                    deriving (Show, Eq, Data)
 
 instance Enum ServiceType where
@@ -160,6 +163,7 @@
     fromEnum CallbackNASPrompt             = 9
     fromEnum CallCheckService              = 10
     fromEnum CallbackAdministrativeService = 11
+    fromEnum (UnknownServiceType x)        = x
     toEnum 1  = LoginService
     toEnum 2  = FramedService
     toEnum 3  = CallbackLoginService
@@ -171,7 +175,7 @@
     toEnum 9  = CallbackNASPrompt
     toEnum 10 = CallCheckService
     toEnum 11 = CallbackAdministrativeService
-    toEnum x  = error $ "Invalid RADIUS service type " ++ show x
+    toEnum x  = UnknownServiceType x
 
 data FramedProtocol = PPPFramedProtocol
                     | SLIPFramedProtocol
@@ -179,35 +183,63 @@
                     | GandalfFramedProtocol
                     | XylogicsFramedProtocol
                     | X75FramedProtocol
+                    | UnknownFramedProtocol Int
                       deriving (Show, Eq, Data)
 
 instance Enum FramedProtocol where
-    fromEnum PPPFramedProtocol      = 1
-    fromEnum SLIPFramedProtocol     = 2
-    fromEnum ARAPFramedProtocol     = 3
-    fromEnum GandalfFramedProtocol  = 4
-    fromEnum XylogicsFramedProtocol = 5
-    fromEnum X75FramedProtocol      = 6
+    fromEnum PPPFramedProtocol         = 1
+    fromEnum SLIPFramedProtocol        = 2
+    fromEnum ARAPFramedProtocol        = 3
+    fromEnum GandalfFramedProtocol     = 4
+    fromEnum XylogicsFramedProtocol    = 5
+    fromEnum X75FramedProtocol         = 6
+    fromEnum (UnknownFramedProtocol x) = x
     toEnum 1 = PPPFramedProtocol
     toEnum 2 = SLIPFramedProtocol
     toEnum 3 = ARAPFramedProtocol
     toEnum 4 = GandalfFramedProtocol
     toEnum 5 = XylogicsFramedProtocol
     toEnum 6 = X75FramedProtocol
-    toEnum x = error $ "Invalid framed protocol " ++ show x
+    toEnum x = UnknownFramedProtocol x
 
 data FramedRouting = NoneFramedRouting
                    | SendFramedRouting
                    | ListenFramedRouting
                    | SendAndListenFramedRouting
-                     deriving (Show, Eq, Enum, Data)
+                   | UnknownFramedRouting Int
+                     deriving (Show, Eq, Data)
 
+instance Enum FramedRouting where
+  fromEnum NoneFramedRouting          = 1
+  fromEnum SendFramedRouting          = 2
+  fromEnum ListenFramedRouting        = 3
+  fromEnum SendAndListenFramedRouting = 4
+  fromEnum (UnknownFramedRouting x)   = x
+  toEnum 1 = NoneFramedRouting
+  toEnum 2 = SendFramedRouting
+  toEnum 3 = ListenFramedRouting
+  toEnum 4 = SendAndListenFramedRouting
+  toEnum x = UnknownFramedRouting x
+
 data FramedCompression = NoCompression
                        | VJTCPIPHeaderCompression
                        | IPXHeaderCompression
                        | StacLZSCompression
-                         deriving (Show, Eq, Enum, Data)
+                       | UnknownFramedCompression Int
+                         deriving (Show, Eq, Data)
 
+instance Enum FramedCompression where
+  fromEnum NoCompression                = 1
+  fromEnum VJTCPIPHeaderCompression     = 2
+  fromEnum IPXHeaderCompression         = 3
+  fromEnum StacLZSCompression           = 4
+  fromEnum (UnknownFramedCompression x) = x
+  toEnum 1 = NoCompression
+  toEnum 2 = VJTCPIPHeaderCompression
+  toEnum 3 = IPXHeaderCompression
+  toEnum 4 = StacLZSCompression
+  toEnum x = UnknownFramedCompression x
+
 data LoginService = TelnetService
                   | RloginService
                   | TCPClearService
@@ -217,11 +249,44 @@
                   | X25T3POSService
                   | UnusedService
                   | TCPClearQuietService
-                    deriving (Show, Eq, Enum, Data)
+                  | UnknownLoginService Int
+                    deriving (Show, Eq, Data)
 
-data TerminationAction = DefaultTerminationAction | RADIUSRequestTerminationAction
-                       deriving (Show, Eq, Enum, Data)
+instance Enum LoginService where
+  fromEnum TelnetService           = 1
+  fromEnum RloginService           = 2
+  fromEnum TCPClearService         = 3
+  fromEnum PortMasterService       = 4
+  fromEnum LATService              = 5
+  fromEnum X25PADService           = 6
+  fromEnum X25T3POSService         = 7
+  fromEnum UnusedService           = 8
+  fromEnum TCPClearQuietService    = 9
+  fromEnum (UnknownLoginService x) = x
+  toEnum 1 = TelnetService
+  toEnum 2 = RloginService
+  toEnum 3 = TCPClearService
+  toEnum 4 = PortMasterService
+  toEnum 5 = LATService
+  toEnum 6 = X25PADService
+  toEnum 7 = X25T3POSService
+  toEnum 8 = UnusedService
+  toEnum 9 = TCPClearQuietService
+  toEnum x = UnknownLoginService x
 
+data TerminationAction = DefaultTerminationAction
+                       | RADIUSRequestTerminationAction
+                       | UnknownTerminationAction Int
+                       deriving (Show, Eq, Data)
+
+instance Enum TerminationAction where
+  fromEnum DefaultTerminationAction       = 1
+  fromEnum RADIUSRequestTerminationAction = 2
+  fromEnum (UnknownTerminationAction x)   = x
+  toEnum 1 = DefaultTerminationAction
+  toEnum 2 = RADIUSRequestTerminationAction
+  toEnum x = UnknownTerminationAction x
+
 data NASPortType = AsyncNASPort
                  | SyncNASPort
                  | ISDNSyncPort
@@ -242,18 +307,65 @@
                  | CableNASPort
                  | WirelessOtherNASPort
                  | WirelessIEEE80211NASPort
-                   deriving (Show, Eq, Enum, Data)
+                 | UnknownNASPortType Int
+                   deriving (Show, Eq, Data)
 
+instance Enum NASPortType where
+  fromEnum AsyncNASPort             = 1
+  fromEnum SyncNASPort              = 2
+  fromEnum ISDNSyncPort             = 3
+  fromEnum ISDNAsyncV120Port        = 4
+  fromEnum ISDNAsyncV110Port        = 5
+  fromEnum VirtualNASPort           = 6
+  fromEnum PIAFSNASPort             = 7
+  fromEnum HDLCClearChannelNASPort  = 8
+  fromEnum X25NASPort               = 9
+  fromEnum X75NASPort               = 10
+  fromEnum G3FaxNASPort             = 11
+  fromEnum SDSLNASPort              = 12
+  fromEnum ADSLCAPNASPort           = 13
+  fromEnum ADSLDMTNASPort           = 14
+  fromEnum IDSLNASPort              = 15
+  fromEnum EthernetNASPort          = 16
+  fromEnum XDSLNASPort              = 17
+  fromEnum CableNASPort             = 18
+  fromEnum WirelessOtherNASPort     = 19
+  fromEnum WirelessIEEE80211NASPort = 20
+  fromEnum (UnknownNASPortType x)   = x
+  toEnum 1  = AsyncNASPort
+  toEnum 2  = SyncNASPort
+  toEnum 3  = ISDNSyncPort
+  toEnum 4  = ISDNAsyncV120Port
+  toEnum 5  = ISDNAsyncV110Port
+  toEnum 6  = VirtualNASPort
+  toEnum 7  = PIAFSNASPort
+  toEnum 8  = HDLCClearChannelNASPort
+  toEnum 9  = X25NASPort
+  toEnum 10 = X75NASPort
+  toEnum 11 = G3FaxNASPort
+  toEnum 12 = SDSLNASPort
+  toEnum 13 = ADSLCAPNASPort
+  toEnum 14 = ADSLDMTNASPort
+  toEnum 15 = IDSLNASPort
+  toEnum 16 = EthernetNASPort
+  toEnum 17 = XDSLNASPort
+  toEnum 18 = CableNASPort
+  toEnum 19 = WirelessOtherNASPort
+  toEnum 20 = WirelessIEEE80211NASPort
+  toEnum x  = UnknownNASPortType x
+
 data ARAPZoneAccess = DefaultZoneOnlyARAPAccess
                     | UseZoneFilterInclusivelyARAPAccess
                     | UseZoneFilterExclusivelyARAPAccess
+                    | UnknownARAPZoneAccess Int
                     deriving (Show, Eq, Data)
 
 instance Enum ARAPZoneAccess where
     toEnum 1 = DefaultZoneOnlyARAPAccess
     toEnum 2 = UseZoneFilterInclusivelyARAPAccess
     toEnum 4 = UseZoneFilterExclusivelyARAPAccess
-    toEnum n = error $ "Invalid RADIUS ARAP Zone Access " ++ show n
-    fromEnum DefaultZoneOnlyARAPAccess = 1
+    toEnum x = UnknownARAPZoneAccess x
+    fromEnum DefaultZoneOnlyARAPAccess          = 1
     fromEnum UseZoneFilterInclusivelyARAPAccess = 2
     fromEnum UseZoneFilterExclusivelyARAPAccess = 4
+    fromEnum (UnknownARAPZoneAccess x)          = x
