diff --git a/function_test/OER_EncDec/EtsiTs103097Module.asn b/function_test/OER_EncDec/EtsiTs103097Module.asn
new file mode 100644
index 0000000000000000000000000000000000000000..d2d8d5879875de99c7d89ba2440e0cbbab324b67
--- /dev/null
+++ b/function_test/OER_EncDec/EtsiTs103097Module.asn
@@ -0,0 +1,102 @@
+EtsiTs103097Module
+{ itu-t(0) identified-organization(4) etsi(0) itsDomain(5) wg5(5) ts(103097) v1(0) }
+
+DEFINITIONS AUTOMATIC TAGS ::= BEGIN
+
+IMPORTS
+
+Ieee1609Dot2Data, ExplicitCertificate
+
+FROM
+
+IEEE1609dot2 {iso(1) identified-organization(3) ieee(111)
+standards-association-numbered-series-standards(2) wave-stds(1609)
+dot2(2) base (1) schema (1) major-version-2(2)};
+
+EtsiTs103097Certificate::= ExplicitCertificate (WITH COMPONENTS{...,
+	toBeSigned (WITH COMPONENTS{...,
+		id (WITH COMPONENTS{...,
+			linkageData ABSENT,
+			binaryId ABSENT
+		}),
+		certRequestPermissions ABSENT,
+		canRequestRollover ABSENT
+	})
+})
+
+SingleEtsiTs103097Certificate ::= SEQUENCE {
+	only EtsiTs103097Certificate
+}
+
+EtsiTs103097Data::=Ieee1609Dot2Data (WITH COMPONENTS {...,
+	content (WITH COMPONENTS {...,			-- 'Ieee1609Dot2Content'
+		signedData (WITH COMPONENTS {..., -- constraints on signed data headers  'SignedData'
+			tbsData (WITH COMPONENTS {	-- 'ToBeSignedData'
+				headerInfo (WITH COMPONENTS {...,	-- 'HeaderInfo'
+					generationTime PRESENT,
+					p2pcdLearningRequest ABSENT,
+					missingCrlIdentifier ABSENT
+				})
+			}),
+			signer (WITH COMPONENTS {..., --constraints on the certificate
+--				certificate (WITH COMPONENT (SingleEtsiTs103097Certificate))
+				certificate (WITH COMPONENT (EtsiTs103097Certificate))
+			})
+		}),
+		encryptedData (WITH COMPONENTS {..., -- constraints on encrypted data headers
+			recipients (WITH COMPONENT (
+				(WITH COMPONENTS {...,
+					symmRecipInfo ABSENT,
+					rekRecipInfo ABSENT
+				})
+			))
+		}),
+		signedCertificateRequest ABSENT
+	})
+})
+
+EtsiTs103097Data-Signed {ToBeSignedDataContent} ::= EtsiTs103097Data (WITH COMPONENTS {...,
+	content (WITH COMPONENTS {
+		signedData (WITH COMPONENTS {...,
+			tbsData (WITH COMPONENTS {
+				payload (WITH COMPONENTS {
+					data (WITH COMPONENTS {...,
+						content (WITH COMPONENTS {
+							unsecuredData (CONTAINING ToBeSignedDataContent)
+						})
+					}) PRESENT
+				})
+			})
+		})
+	})
+})
+
+EtsiTs103097Data-SignedExternalPayload ::= EtsiTs103097Data (WITH COMPONENTS {...,
+	content (WITH COMPONENTS {
+		signedData (WITH COMPONENTS {...,
+			tbsData (WITH COMPONENTS {
+				payload (WITH COMPONENTS {
+					extDataHash (WITH COMPONENTS {
+						sha256HashedData PRESENT
+					}) PRESENT
+				})
+			})
+		})
+	})
+})
+
+EtsiTs103097Data-Encrypted {ToBeEncryptedDataContent} ::= EtsiTs103097Data (WITH COMPONENTS {...,
+	content (WITH COMPONENTS {
+		encryptedData (WITH COMPONENTS {...,
+			ciphertext (WITH COMPONENTS {...,
+				aes128ccm (WITH COMPONENTS {...,
+					ccmCiphertext (CONSTRAINED BY {-- ccm encryption of -- ToBeEncryptedDataContent})
+				})
+			})
+		})
+	})
+})
+
+EtsiTs103097Data-SignedAndEncrypted {ToBesignedAndEncryptedDataContent} ::= EtsiTs103097DataEncrypted {EtsiTs103097Data-Signed {ToBesignedAndEncryptedDataContent}}
+
+END
diff --git a/function_test/OER_EncDec/IEEE1609dot2.asn b/function_test/OER_EncDec/IEEE1609dot2.asn
new file mode 100644
index 0000000000000000000000000000000000000000..f1cf301bcc1428a3d36e3562afc788fc2318001b
--- /dev/null
+++ b/function_test/OER_EncDec/IEEE1609dot2.asn
@@ -0,0 +1,313 @@
+IEEE1609dot2 {iso(1) identified-organization(3) ieee(111) 
+standards-association-numbered-series-standards(2) wave-stds(1609)  
+dot2(2) base(1) schema(1) major-version-2(2)}
+
+-- Minor version: 1
+
+--******************************************************************************
+-- 
+-- IEEE P1609.2 Data Types 
+-- 
+--******************************************************************************
+
+DEFINITIONS AUTOMATIC TAGS ::= BEGIN 
+ 
+EXPORTS ALL;
+
+IMPORTS 
+  CrlSeries,
+  EccP256CurvePoint,
+  EciesP256EncryptedKey,
+  EncryptionKey,
+  GeographicRegion,
+  GroupLinkageValue,
+  HashAlgorithm,
+  HashedId3,
+  HashedId8,
+  Hostname,
+  IValue,
+  LinkageValue,
+  Opaque,
+  Psid,
+  PsidSsp,
+  PsidSspRange,
+  PublicEncryptionKey,
+  PublicVerificationKey,
+  SequenceOfHashedId3,
+  SequenceOfPsidSsp,
+  SequenceOfPsidSspRange,
+  ServiceSpecificPermissions,
+  Signature,
+  SubjectAssurance,
+  SymmetricEncryptionKey,
+  ThreeDLocation,
+  Time64,
+  Uint3,
+  Uint8,
+  Uint16, 
+  Uint32,
+  ValidityPeriod
+FROM IEEE1609dot2BaseTypes {iso(1) identified-organization(3) ieee(111) 
+    standards-association-numbered-series-standards(2) wave-stds(1609)  
+    dot2(2) base(1) base-types(2) major-version-2 (2)}
+
+;
+
+-- 
+--********************************************************************* 
+-- 
+--  Structures for describing secured data
+-- 
+--*********************************************************************  
+
+-- Necessary to get certain tools to generate sample PDUs
+-- TestIeee1609Dot2Data ::= Ieee1609Dot2Data
+-- TestCertificate ::= Certificate
+
+-- this structure belongs later in the file but putting it here avoids
+-- compiler errors with certain tools
+SignedDataPayload ::= SEQUENCE  { 
+    data              Ieee1609Dot2Data OPTIONAL,
+    extDataHash       HashedData OPTIONAL,
+    ...
+}
+    (WITH COMPONENTS {..., data PRESENT} |
+     WITH COMPONENTS {..., extDataHash PRESENT})
+
+Ieee1609Dot2Data ::= SEQUENCE  {
+    protocolVersion    Uint8(3),
+    content            Ieee1609Dot2Content
+}
+
+Ieee1609Dot2Content ::=  CHOICE  { 
+    unsecuredData            Opaque, 
+    signedData               SignedData,
+    encryptedData            EncryptedData,
+    signedCertificateRequest Opaque,
+    ...
+}
+
+SignedData ::= SEQUENCE  { 
+    hashId          HashAlgorithm,
+    tbsData         ToBeSignedData,
+    signer          SignerIdentifier,
+    signature       Signature
+}
+
+SignerIdentifier ::= CHOICE  { 
+    digest          HashedId8,
+    certificate     SequenceOfCertificate,
+    self            NULL,
+    ...
+}
+
+ToBeSignedData ::= SEQUENCE  { 
+    payload         SignedDataPayload,
+    headerInfo      HeaderInfo
+}
+
+HashedData::= CHOICE  { 
+    sha256HashedData  OCTET STRING (SIZE(32)),
+    ...
+}
+
+HeaderInfo ::= SEQUENCE  { 
+    psid                   Psid,
+    generationTime         Time64 OPTIONAL,
+    expiryTime             Time64  OPTIONAL,
+    generationLocation     ThreeDLocation OPTIONAL,
+    p2pcdLearningRequest   HashedId3 OPTIONAL,
+    missingCrlIdentifier   MissingCrlIdentifier OPTIONAL,
+    encryptionKey          EncryptionKey OPTIONAL,
+    ...,
+    inlineP2pcdRequest     SequenceOfHashedId3 OPTIONAL,
+    requestedCertificate   Certificate OPTIONAL
+}
+
+MissingCrlIdentifier ::= SEQUENCE  {
+    cracaId         HashedId3,
+    crlSeries       CrlSeries,
+    ...
+}
+
+Countersignature ::= Ieee1609Dot2Data (WITH COMPONENTS {...,
+  content (WITH COMPONENTS {..., 
+    signedData  (WITH COMPONENTS {..., 
+      tbsData (WITH COMPONENTS {..., 
+        payload (WITH COMPONENTS {..., 
+          data ABSENT,
+          extDataHash PRESENT
+        }),
+        headerInfo(WITH COMPONENTS {..., 
+          generationTime PRESENT,
+          expiryTime ABSENT,
+          generationLocation ABSENT,
+          p2pcdLearningRequest ABSENT,
+          missingCrlIdentifier ABSENT,
+          encryptionKey ABSENT
+        })
+      })
+    })
+  })
+})
+
+--********************************************************************** 
+-- 
+--  Structures for describing encrypted data
+-- 
+--**********************************************************************  
+
+
+EncryptedData ::= SEQUENCE  {
+    recipients     SequenceOfRecipientInfo,
+    ciphertext     SymmetricCiphertext
+}
+RecipientInfo ::= CHOICE  {
+    pskRecipInfo        PreSharedKeyRecipientInfo,
+    symmRecipInfo       SymmRecipientInfo,
+    certRecipInfo       PKRecipientInfo, 
+    signedDataRecipInfo PKRecipientInfo, 
+    rekRecipInfo        PKRecipientInfo 
+}
+
+SequenceOfRecipientInfo ::= SEQUENCE OF RecipientInfo
+       
+PreSharedKeyRecipientInfo ::= HashedId8
+SymmRecipientInfo ::= SEQUENCE  { 
+    recipientId        HashedId8, 
+    encKey             SymmetricCiphertext
+}
+
+PKRecipientInfo ::= SEQUENCE  { 
+    recipientId        HashedId8, 
+    encKey             EncryptedDataEncryptionKey
+}
+
+EncryptedDataEncryptionKey ::= CHOICE  { 
+    eciesNistP256          EciesP256EncryptedKey,
+    eciesBrainpoolP256r1   EciesP256EncryptedKey,
+    ...
+}
+
+SymmetricCiphertext ::= CHOICE  {
+    aes128ccm           AesCcmCiphertext,
+    ...
+}
+
+AesCcmCiphertext ::= SEQUENCE  {
+    nonce           OCTET STRING (SIZE (12)),
+    ccmCiphertext   Opaque -- 16 bytes longer than plaintext
+}
+
+
+--********************************************************************** 
+-- 
+--  Certificates and other security management data structures
+-- 
+--********************************************************************** 
+
+-- Certificates are implicit (type = implicit, toBeSigned includes 
+-- reconstruction value, signature absent) or explicit (type = explicit,
+-- toBeSigned includes verification key, signature present).
+
+Certificate ::= CertificateBase (ImplicitCertificate | ExplicitCertificate)
+
+SingleCertificate ::= SEQUENCE (SIZE(1)) OF Certificate
+
+SequenceOfCertificate ::= SEQUENCE OF Certificate
+
+CertificateBase ::= SEQUENCE  {
+    version                 Uint8(3),
+    type                    CertificateType,
+    issuer                  IssuerIdentifier,
+    toBeSigned              ToBeSignedCertificate,
+    signature               Signature OPTIONAL
+}
+  
+CertificateType  ::= ENUMERATED  {
+    explicit,
+    implicit,
+    ...
+}
+
+ImplicitCertificate ::= CertificateBase (WITH COMPONENTS {...,
+    type(implicit),
+    toBeSigned(WITH COMPONENTS {..., 
+      verifyKeyIndicator(WITH COMPONENTS {reconstructionValue})
+    }), 
+    signature ABSENT
+})
+
+ExplicitCertificate ::= CertificateBase (WITH COMPONENTS {...,
+    type(explicit),
+    toBeSigned(WITH COMPONENTS {..., 
+        verifyKeyIndicator(WITH COMPONENTS {verificationKey})
+    }), 
+    signature PRESENT
+})
+
+IssuerIdentifier ::= CHOICE  { 
+    sha256AndDigest         HashedId8,
+    self                    HashAlgorithm,
+    ...,
+    sha384AndDigest         HashedId8
+}
+
+ToBeSignedCertificate ::= SEQUENCE  { 
+    id                     CertificateId,
+    cracaId                HashedId3,
+    crlSeries              CrlSeries,
+    validityPeriod         ValidityPeriod,
+    region                 GeographicRegion OPTIONAL,
+    assuranceLevel         SubjectAssurance OPTIONAL,
+    appPermissions         SequenceOfPsidSsp OPTIONAL,
+    certIssuePermissions   SequenceOfPsidGroupPermissions OPTIONAL,
+    certRequestPermissions SequenceOfPsidGroupPermissions OPTIONAL, 
+    canRequestRollover     NULL OPTIONAL,
+    encryptionKey          PublicEncryptionKey OPTIONAL,
+    verifyKeyIndicator     VerificationKeyIndicator,
+    ...
+}
+(WITH COMPONENTS { ..., appPermissions PRESENT} |
+ WITH COMPONENTS { ..., certIssuePermissions PRESENT} |
+ WITH COMPONENTS { ..., certRequestPermissions PRESENT})
+
+CertificateId ::= CHOICE  {
+    linkageData             LinkageData,
+    name                    Hostname,
+    binaryId                OCTET STRING(SIZE(1..64)),
+    none                    NULL,
+    ...
+}
+
+LinkageData ::= SEQUENCE  {
+    iCert                 IValue,
+    linkage-value         LinkageValue, 
+    group-linkage-value   GroupLinkageValue OPTIONAL
+}
+         
+EndEntityType ::= BIT STRING {app (0), enrol (1) } (SIZE (8)) (ALL EXCEPT {})
+
+PsidGroupPermissions ::= SEQUENCE  {
+    subjectPermissions SubjectPermissions,
+    minChainLength     INTEGER DEFAULT 1,
+    chainLengthRange   INTEGER DEFAULT 0, 
+    eeType             EndEntityType DEFAULT {app}
+}
+
+SequenceOfPsidGroupPermissions ::= SEQUENCE OF PsidGroupPermissions
+
+SubjectPermissions ::= CHOICE  {
+    explicit        SequenceOfPsidSspRange,
+    all             NULL,
+    ...
+}
+
+VerificationKeyIndicator ::= CHOICE  {
+    verificationKey         PublicVerificationKey,
+    reconstructionValue     EccP256CurvePoint,
+    ...
+}
+  
+END
+
diff --git a/function_test/OER_EncDec/IEEE1609dot2BaseTypes.asn b/function_test/OER_EncDec/IEEE1609dot2BaseTypes.asn
new file mode 100644
index 0000000000000000000000000000000000000000..2c7148467901fde5d9a7aafa1a1d8b7e3249294e
--- /dev/null
+++ b/function_test/OER_EncDec/IEEE1609dot2BaseTypes.asn
@@ -0,0 +1,338 @@
+IEEE1609dot2BaseTypes {iso(1) identified-organization(3) ieee(111) 
+standards-association-numbered-series-standards(2) wave-stds(1609)  
+dot2(2) base(1) base-types(2) major-version-2(2)}
+
+-- Minor version: 1
+
+-- 
+--********************************************************************
+--  IEEE P1609.2 Base Data Types 
+-- 
+--******************************************************************** 
+
+DEFINITIONS AUTOMATIC TAGS ::= BEGIN 
+ 
+EXPORTS ALL;
+
+
+-- ------------------------------------------------------------------
+-- 
+-- Integers
+--
+-- ------------------------------------------------------------------
+
+IMPORTS;
+
+Uint3  ::= INTEGER (0..7)                    -- (hex)                      07
+Uint8  ::= INTEGER (0..255)                  -- (hex)                      ff
+Uint16 ::= INTEGER (0..65535)                -- (hex)                   ff ff
+Uint32 ::= INTEGER (0..4294967295)--<LONGLONG>-- -- (hex)             ff ff ff ff
+Uint64 ::= INTEGER (0..18446744073709551615) -- (hex) ff ff ff ff ff ff ff ff
+
+SequenceOfUint8  ::= SEQUENCE OF Uint8
+SequenceOfUint16 ::= SEQUENCE OF Uint16
+
+-- ------------------------------------------------------------------
+-- 
+-- OCTET STRING types
+--
+-- ------------------------------------------------------------------
+
+
+Opaque ::= OCTET STRING
+
+  
+HashedId10 ::= OCTET STRING (SIZE(10))
+HashedId8  ::= OCTET STRING (SIZE(8))
+HashedId3  ::= OCTET STRING (SIZE(3))
+SequenceOfHashedId3 ::= SEQUENCE OF HashedId3
+
+
+-- ------------------------------------------------------------------
+-- 
+-- Time
+--
+-- ------------------------------------------------------------------
+
+Time32 ::= Uint32
+Time64 ::= Uint64
+
+ValidityPeriod ::= SEQUENCE  {
+    start          Time32,
+    duration       Duration
+}
+
+Duration ::= CHOICE  {
+    microseconds     Uint16,
+    milliseconds     Uint16,
+    seconds          Uint16,
+    minutes          Uint16,
+    hours            Uint16,
+    sixtyHours       Uint16,
+    years            Uint16
+} 
+
+-- ------------------------------------------------------------------
+-- 
+-- Location
+--
+-- ------------------------------------------------------------------
+
+
+GeographicRegion ::= CHOICE  {
+    circularRegion      CircularRegion,
+    rectangularRegion   SequenceOfRectangularRegion,
+    polygonalRegion     PolygonalRegion,
+    identifiedRegion    SequenceOfIdentifiedRegion,
+    ...
+}
+
+CircularRegion ::= SEQUENCE  {
+    center          TwoDLocation,
+    radius          Uint16
+}
+
+RectangularRegion ::= SEQUENCE  {
+    northWest       TwoDLocation,
+    southEast       TwoDLocation
+}
+
+SequenceOfRectangularRegion ::= SEQUENCE OF RectangularRegion
+
+PolygonalRegion ::= SEQUENCE SIZE(3..MAX) OF TwoDLocation
+
+TwoDLocation ::= SEQUENCE  {
+    latitude      Latitude,
+    longitude     Longitude
+}
+
+IdentifiedRegion ::= CHOICE  {
+    countryOnly           CountryOnly,
+    countryAndRegions     CountryAndRegions,
+    countryAndSubregions   CountryAndSubregions,
+    ...
+}
+
+SequenceOfIdentifiedRegion ::= SEQUENCE OF IdentifiedRegion
+
+CountryOnly ::= Uint16
+
+CountryAndRegions ::= SEQUENCE  {
+    countryOnly    CountryOnly,
+    regions        SequenceOfUint8
+}
+
+CountryAndSubregions ::= SEQUENCE  {
+    country             CountryOnly,
+    regionAndSubregions  SequenceOfRegionAndSubregions
+}
+
+RegionAndSubregions ::= SEQUENCE  {
+    region             Uint8,
+    subregions         SequenceOfUint16
+}
+
+SequenceOfRegionAndSubregions ::= SEQUENCE OF RegionAndSubregions
+
+ThreeDLocation ::= SEQUENCE  {
+    latitude        Latitude,
+    longitude       Longitude,
+    elevation       Elevation
+}
+
+Latitude ::= NinetyDegreeInt
+Longitude ::= OneEightyDegreeInt
+Elevation ::= ElevInt
+
+NinetyDegreeInt ::= INTEGER  {
+    min 		(-900000000),
+    max 		(900000000),
+    unknown 	(900000001)
+} (-900000000..900000001)
+
+KnownLatitude ::= NinetyDegreeInt (min..max) -- Minus 90deg to +90deg in microdegree intervals
+UnknownLatitude ::= NinetyDegreeInt (unknown)
+  
+OneEightyDegreeInt ::= INTEGER  {
+    min      	(-1799999999),
+    max      	(1800000000),
+    unknown  	(1800000001)
+} (-1799999999..1800000001)
+
+KnownLongitude ::= OneEightyDegreeInt (min..max)
+UnknownLongitude ::= OneEightyDegreeInt (unknown)
+  
+ElevInt ::= Uint16 -- Range is from -4096 to 61439 in units of one-tenth of a meter
+
+-- ------------------------------------------------------------------
+-- 
+-- Crypto
+--
+-- ------------------------------------------------------------------
+
+Signature ::= CHOICE  {
+    ecdsaNistP256Signature        EcdsaP256Signature,
+    ecdsaBrainpoolP256r1Signature EcdsaP256Signature,
+    ...,
+    ecdsaBrainpoolP384r1Signature EcdsaP384Signature
+}
+
+EcdsaP256Signature ::= SEQUENCE  {
+    rSig     EccP256CurvePoint,
+    sSig     OCTET STRING (SIZE (32))
+}
+
+EcdsaP384Signature ::= SEQUENCE  {
+    rSig     EccP384CurvePoint,
+    sSig     OCTET STRING (SIZE (48))
+}
+
+EccP256CurvePoint ::= CHOICE  {
+    x-only           OCTET STRING (SIZE (32)),
+    fill             NULL,  -- consistency with 1363 / X9.62
+    compressed-y-0   OCTET STRING (SIZE (32)),
+    compressed-y-1   OCTET STRING (SIZE (32)),
+    uncompressedP256 SEQUENCE  {
+        x OCTET STRING (SIZE (32)),
+        y OCTET STRING (SIZE (32))
+    }
+}
+
+EccP384CurvePoint::= CHOICE  {
+    x-only           OCTET STRING (SIZE (48)),
+    fill             NULL, -- consistency w 1363 / X9.62
+    compressed-y-0   OCTET STRING (SIZE (48)),
+    compressed-y-1   OCTET STRING (SIZE (48)),
+    uncompressedP384 SEQUENCE  {
+        x OCTET STRING (SIZE (48)),
+        y OCTET STRING (SIZE (48))
+    }
+}
+
+
+SymmAlgorithm ::= ENUMERATED  { 
+    aes128Ccm,
+    ...
+}
+
+HashAlgorithm ::= ENUMERATED  { 
+    sha256,
+    ...,
+    sha384
+}
+
+EciesP256EncryptedKey ::= SEQUENCE  {
+    v               EccP256CurvePoint,
+    c               OCTET STRING (SIZE (16)),
+    t               OCTET STRING (SIZE (16))
+}
+
+EncryptionKey ::= CHOICE  {
+    public               PublicEncryptionKey,
+    symmetric            SymmetricEncryptionKey 
+}
+
+PublicEncryptionKey ::= SEQUENCE  { 
+    supportedSymmAlg      SymmAlgorithm,
+    publicKey             BasePublicEncryptionKey
+}
+
+BasePublicEncryptionKey ::= CHOICE  { 
+    eciesNistP256             EccP256CurvePoint,
+    eciesBrainpoolP256r1      EccP256CurvePoint,
+    ...
+}
+
+PublicVerificationKey ::= CHOICE  { 
+    ecdsaNistP256             EccP256CurvePoint,
+    ecdsaBrainpoolP256r1      EccP256CurvePoint,
+    ...,
+    ecdsaBrainpoolP384r1      EccP384CurvePoint
+}
+
+SymmetricEncryptionKey ::= CHOICE  {
+    aes128Ccm     OCTET STRING(SIZE(16)),
+    ...
+}
+
+-- ------------------------------------------------------------------
+-- 
+-- PSID / ITS-AID
+--
+-- ------------------------------------------------------------------
+
+
+PsidSsp ::= SEQUENCE  {
+    psid                  Psid,
+    ssp                   ServiceSpecificPermissions OPTIONAL
+}
+
+SequenceOfPsidSsp ::= SEQUENCE OF PsidSsp
+
+Psid ::= INTEGER (0..MAX)
+
+SequenceOfPsid ::= SEQUENCE OF Psid
+
+ServiceSpecificPermissions ::= CHOICE  {
+--    opaque              OCTET STRING (SIZE(0..MAX)),
+    opaque              OCTET STRING,
+    ...,
+    bitmapSsp           BitmapSsp
+}
+
+BitmapSsp ::= OCTET STRING (SIZE(0..31))
+
+PsidSspRange ::= SEQUENCE  {
+    psid                Psid,
+    sspRange            SspRange OPTIONAL
+}
+
+SequenceOfPsidSspRange ::= SEQUENCE OF PsidSspRange
+
+SspRange ::= CHOICE  {
+    opaque              SequenceOfOctetString,
+    all                 NULL,
+    ... ,
+    bitmapSspRange      BitmapSspRange
+}
+   
+BitmapSspRange ::= SEQUENCE  {
+    sspValue            OCTET STRING (SIZE(1..32)),
+    sspBitmask          OCTET STRING (SIZE(1..32))
+}
+
+-- SequenceOfOctetString ::= SEQUENCE (SIZE (0..MAX)) OF 
+--    OCTET STRING (SIZE(0..MAX))
+
+SequenceOfOctetString ::= SEQUENCE OF OCTET STRING
+
+-- ------------------------------------------------------------------
+-- 
+-- Goes in certs
+--
+-- ------------------------------------------------------------------
+
+SubjectAssurance ::= OCTET STRING (SIZE(1))
+
+CrlSeries ::= Uint16
+  
+
+-- ------------------------------------------------------------------
+-- 
+-- Pseudonym Linkage
+--
+-- ------------------------------------------------------------------
+
+IValue ::= Uint16
+Hostname ::= UTF8String (SIZE(0..255))
+LinkageValue ::= OCTET STRING (SIZE(9))
+GroupLinkageValue ::= SEQUENCE  {
+    jValue  OCTET STRING (SIZE(4)),
+    value   OCTET STRING (SIZE(9))
+}
+  
+LaId ::= OCTET STRING (SIZE(2)) 
+LinkageSeed ::= OCTET STRING (SIZE(16))
+
+END
+
diff --git a/function_test/OER_EncDec/ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script b/function_test/OER_EncDec/ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script
new file mode 100644
index 0000000000000000000000000000000000000000..0c8bcf494378f9e11973b1daef03fcdb7f84b3b2
--- /dev/null
+++ b/function_test/OER_EncDec/ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script
@@ -0,0 +1,233 @@
+.******************************************************************************
+.* Copyright (c) 2000-2018 Ericsson Telecom AB
+.* All rights reserved. This program and the accompanying materials
+.* are made available under the terms of the Eclipse Public License v2.0
+.* which accompanies this distribution, and is available at
+.* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+.*
+.* Contributors:
+.*   Balasko, Jeno
+.*   Beres, Szabolcs
+.*   Delic, Adam
+.*   Kovacs, Ferenc
+.*   Szabados, Kristof
+.*   Tarasov, Victor
+.*
+.******************************************************************************/
+:text.
+:lang eng.
+.*
+:docname.Test Description
+:docno.8/152 91-CRL 113 200/5 Uen
+:rev.C
+:date.2015-04-27
+.*
+:prep.ETH/XZR Kristof Szabados (+36 1 437 7256)
+:appr.ETH/XZ (Roland Gecse)
+:checked.ETHBAAT
+.*
+:title.Test Description - OER coder
+:contents level=3.
+.*---------------------------------------------------------------------*
+:h1.PREREQUISITES AND PREPARATIONS
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h2.Scope of the Test Object
+.*---------------------------------------------------------------------*
+:xmp tab=1 nokeep.
+
+This TD contains unified test case related to TTCN3 Executor's OER coder function.
+Test case implement the OER codings example from specification ISO/IEC 8825-7:2015 
+(https://www.itu.int/rec/T-REC-X.696-201508-I)
+:exmp.
+
+:p.:us.Revision Information:eus.
+
+:xmp nokeep.
+:us.History:eus.
+
+REV   DATE         PREPARED   CHANGE
+===   ==========   ========   ======
+A     2003-10-31   ETHEKR     New document
+B     2007-03-06   EDMDELI    Implicit message encoding
+C     2007-03-21   EJNOSZA    Bugfix in a testcase for implicit msg. enc.
+D     2008-10-01   EFERKOV    Big integers
+E     2010-01-18   EKRISZA    Updated for TITAN R8C
+F     2011-06-18   EKRISZA    Added tests for errors
+A     2011-12-12   EKRISZA     Updated for release
+PB1   2011-01-30   ETHBAAT    Editorial changes
+A
+
+:exmp.
+
+
+.*---------------------------------------------------------------------*
+:h2.Test Tools
+.*---------------------------------------------------------------------*
+:p.:us.Software Tools:eus.
+:xmp tab=2 nokeep.
+
+	SAtester
+
+:exmp.
+:np.
+.*---------------------------------------------------------------------*
+:h1.REQUIREMENT-BASED TESTS
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h2.Testing OER encodings
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h3. Example of OER encodings from ISO/IEC 8825-7:2015 Annex A
+.*---------------------------------------------------------------------*
+:xmp tab=0.
+
+<TC - ISO/IEC 8825-7:2015 Annex A – Example of OER encodings>
+
+<STATIC:ASN>
+
+TempA
+
+DEFINITIONS ::=
+
+BEGIN
+
+  IMPORTS;
+
+  Date ::= [APPLICATION 3] IMPLICIT VisibleString -- YYYYMMDD
+  EmployeeNumber ::= [APPLICATION 2] IMPLICIT INTEGER
+  Name ::= [APPLICATION 1] IMPLICIT SEQUENCE   {
+	givenName VisibleString,
+	initial VisibleString,
+	familyName VisibleString }
+  ChildInformation ::= SET {
+	name Name,
+	dateOfBirth [0] Date}
+  Record ::= [APPLICATION 0] IMPLICIT SET {
+	name Name,
+	title [0] VisibleString,
+	number EmployeeNumber,
+	dateOfHire [1] Date,
+	nameOfSpouse [2] Name,
+	children [3] IMPLICIT SEQUENCE OF ChildInformation DEFAULT {} }
+END
+
+<STATIC>
+
+
+type component Test_CT {}
+
+<TTCN_TC:PURE_EXEC>
+
+import from TempA all;
+
+external function enc_OER_Date(in Date pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Date(in octetstring stream) return Date with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_EmployeeNumber(in EmployeeNumber pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EmployeeNumber(in octetstring stream) return EmployeeNumber with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Name(in Name pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Name(in octetstring stream) return Name with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_ChildInformation(in ChildInformation pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_ChildInformation(in octetstring stream) return ChildInformation with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Record(in Record pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Record(in octetstring stream) return Record with { extension "prototype(convert) decode(OER)" }
+
+//*********************************************
+// TESTCASES
+//*********************************************
+
+testcase tc_OER_encoding_of_Date() runs on Test_CT {
+  const Date date :=  "19710917"
+  const octetstring raw_encoded := '083139373130393137'O; 
+
+  if (enc_OER_Date(date) == raw_encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Date(raw_encoded) == date) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_encoding_of_EmployeeNumber() runs on Test_CT {
+  const EmployeeNumber empl_num :=  51
+  if (enc_OER_EmployeeNumber(empl_num) == '0133'O) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_encoding_of_Name() runs on Test_CT {
+  const Name name :=  {
+	givenName := "John",
+	initial := "P",
+	familyName := "Smith"
+  }
+  const octetstring raw_encoded := '044A6F686E015005536D697468'O; 
+
+  if (enc_OER_Name(name) == raw_encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Name(raw_encoded) == name) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_ChildInformation() runs on Test_CT {
+  const ChildInformation child := {
+	name := {
+		givenName := "Ralph",
+		initial := "T",
+		familyName := "Smith"
+	},
+	dateOfBirth := "19571111"
+  }
+  const octetstring raw_encoded := '0552616C7068015405536D697468083139353731313131'O;
+
+  if (enc_OER_ChildInformation(child) == raw_encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_ChildInformation(raw_encoded) == child) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Record() runs on Test_CT {
+  const octetstring raw_encoded := 
+	'80044A6F686E015005536D6974680133084469726563746F72083139373130393137044D617279015405536D69746801020552616C7068015405536D69746808313935373131313105537573616E0142054A6F6E6573083139353930373137'O;
+  const Record rec := {
+	name := {
+		givenName := "John",
+		initial := "P",
+		familyName := "Smith"},
+	title := "Director",
+	number := 51,
+	dateOfHire := "19710917",
+	nameOfSpouse := {
+		givenName := "Mary",
+		initial := "T",
+		familyName := "Smith"},
+	children := {
+		{ name := {
+			givenName := "Ralph",
+			initial := "T",
+			familyName := "Smith"},
+		dateOfBirth := "19571111" },
+		{ name := {
+			givenName := "Susan",
+			initial := "B",
+			familyName := "Jones"},
+		dateOfBirth := "19590717"}
+	}
+  }
+
+  if (enc_OER_Record(rec) == raw_encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Record(raw_encoded) == rec) {setverdict(pass);} else {setverdict(fail);}
+}
+
+//*********************************************
+// CONTROL PART
+//*********************************************
+
+control {
+  execute(tc_OER_encoding_of_Date());
+  execute(tc_OER_encoding_of_EmployeeNumber());
+  execute(tc_OER_encoding_of_Name());
+  execute(tc_OER_ChildInformation());
+  execute(tc_OER_Record());
+}
+
+<RESULT>
+
+Overall verdict: pass
+
+<END_TC>
+
diff --git a/function_test/OER_EncDec/Makefile b/function_test/OER_EncDec/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..1efc1b96d824e39411a1f903fb36df4dda5efb94
--- /dev/null
+++ b/function_test/OER_EncDec/Makefile
@@ -0,0 +1,165 @@
+##############################################################################
+# Copyright (c) 2000-2018 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+#
+# Contributors:
+#   
+#   Balasko, Jeno
+#   Delic, Adam
+#   Hanko, Matyas
+#   Kovacs, Ferenc
+#   Lovassy, Arpad
+#   Ormandi, Matyas
+#   Raduly, Csaba
+#   Szabados, Kristof
+#   Szabo, Janos Zoltan – initial implementation
+#   Tarasov, Victor
+#
+##############################################################################
+# uncomment this line to use alternative runtime (TITAN_RUNTIME_2)
+# RT2 = yes
+
+# This Makefile was generated by the compiler
+# of the TTCN-3 Test Executor version 1.4.pl5
+# for Matyas Hanko (ethmhk@duna61) on Mon Oct  6 16:26:18 2003
+
+# The following make commands are available:
+# - make, make all       Builds the executable test suite.
+# - make compile         Translates TTCN-3 and ASN.1 modules to C++.
+# - make clean           Removes all generated files.
+# - make dep             Creates/updates dependency list.
+# - make archive         Archives all source files.
+
+#
+# Set these variables...
+#
+
+TOP := ../../
+include   $(TOP)/Makefile.cfg
+
+
+# The path of your TTCN-3 Test Executor installation:
+# Uncomment this line to override the environment variable.
+# TTCN3_DIR =
+
+# Your platform: (SOLARIS, LINUX, FREEBSD or WIN32)
+ifndef PLATFORM
+PLATFORM = SOLARIS
+endif
+
+# Your C++ compiler:
+#CXX = g++
+
+# Flags for the C++ preprocessor (and makedepend as well):
+CPPFLAGS = -D$(PLATFORM) -I$(TTCN3_DIR)/include -I$(XMLDIR)/include/libxml2
+ifdef RT2
+CPPFLAGS += -DTITAN_RUNTIME_2
+endif
+ifeq ($(DEBUG), yes)
+CPPFLAGS += -DMEMORY_DEBUG
+endif
+
+# Flags for the C++ compiler:
+CXXFLAGS = -Wall
+
+# Flags for the linker:
+LDFLAGS =
+
+# Flags for the TTCN-3 and ASN.1 compiler:
+COMPILER_FLAGS = -L
+ifdef RT2
+COMPILER_FLAGS += -R
+endif
+
+# Execution mode: (either ttcn3 or ttcn3-parallel)
+ifndef RT2
+TTCN3_LIB = ttcn3
+else
+TTCN3_LIB = ttcn3-rt2
+endif
+
+
+# The path of your OpenSSL installation:
+# If you do not have your own one, leave it unchanged.
+OPENSSL_DIR = $(TTCN3_DIR)
+
+# Directory to store the archived source files:
+# Note: you can set any directory except ./archive
+ARCHIVE_DIR = ./backup
+
+#
+# You may change these variables. Add your files if necessary...
+#
+
+# The TTCN-3 modules needed for this project:
+TTCN3_MODULES = Temp.ttcn
+
+# The ASN.1 modules needed for this project:
+ASN1_MODULES = TempA.asn IEEE1609dot2BaseTypes.asn IEEE1609dot2.asn EtsiTs103097Module.asn
+
+# C++ source & header files generated by TTCN-3 & ASN.1 compilers:
+GENERATED_SOURCES = Temp.cc $(ASN1_MODULES:.asn=.cc)
+GENERATED_HEADERS = Temp.hh $(ASN1_MODULES:.asn=.hh)
+
+# Source & header files of Test Ports and your other modules:
+USER_SOURCES =
+USER_HEADERS =
+
+# All object files needed for the executable test suite:
+# OBJECTS = Temp.o TempA.o IEEE1609dot2BaseTypes.o IEEE1609dot2.o
+OBJECTS = $(GENERATED_SOURCES:.cc=.o)
+
+# The name of the executable test suite:
+TARGET = Temp
+
+ifdef COVERAGE
+CPPFLAGS += -fprofile-arcs -ftest-coverage -g
+CXXFLAGS += -fprofile-arcs -ftest-coverage -g
+LDFLAGS += -fprofile-arcs -ftest-coverage -g -lgcov
+endif
+
+#
+# Do not modify these unless you know what you are doing...
+#
+SOLARIS_LIBS = -lxnet -L$(XMLDIR)/lib -lxml2 -lresolv -lcurses
+SOLARIS8_LIBS = -lxnet -L$(XMLDIR)/lib -lxml2 -lresolv -lnsl -lsocket -lcurses
+LINUX_LIBS = -L$(XMLDIR)/lib -lxml2 -lpthread -lrt -lncurses
+FREEBSD_LIBS = -L$(XMLDIR)/lib -lxml2 -lncurses
+WIN32_LIBS = -L$(XMLDIR)/lib -lxml2 -lncurses
+
+#
+# Rules for building the executable...
+#
+all: $(TARGET) ;
+
+$(TARGET): $(OBJECTS)
+	$(CXX) $(LDFLAGS) -o $@ $(OBJECTS) -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \
+	-L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS)
+
+.cc.o .c.o:
+	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<
+
+$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile
+	@if [ ! -f $@ ]; then $(RM) compile; $(MAKE) compile; fi
+
+compile: $(TTCN3_MODULES) $(ASN1_MODULES)
+	$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) $(TTCN3_MODULES) \
+	$(ASN1_MODULES) $(ASN1_STATIC_MODULES) - $?
+	touch $@
+
+clean:
+	-$(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \
+	$(GENERATED_SOURCES) compile *.log *.gcda *.gcno
+
+dep: $(GENERATED_SOURCES)
+	makedepend $(CPPFLAGS) $(USER_SOURCES) $(GENERATED_SOURCES)
+
+archive:
+	mkdir -p $(ARCHIVE_DIR)
+	tar -cvhf - $(TTCN3_MODULES) $(ASN1_MODULES) \
+	$(USER_HEADERS) $(USER_SOURCES) Makefile \
+	| gzip >$(ARCHIVE_DIR)/$(TARGET)-`date '+%y%m%d-%H%M'`.tgz
+
diff --git a/function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script b/function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script
new file mode 100644
index 0000000000000000000000000000000000000000..de2b9eb66919908c7b06742f0e24b8515382c1cb
--- /dev/null
+++ b/function_test/OER_EncDec/OER_EncDec_ETSI_TS_103_097_v131.script
@@ -0,0 +1,357 @@
+.******************************************************************************
+.* Copyright (c) 2000-2018 Ericsson Telecom AB
+.* All rights reserved. This program and the accompanying materials
+.* are made available under the terms of the Eclipse Public License v2.0
+.* which accompanies this distribution, and is available at
+.* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+.*
+.* Contributors:
+.*   Balasko, Jeno
+.*   Beres, Szabolcs
+.*   Delic, Adam
+.*   Kovacs, Ferenc
+.*   Szabados, Kristof
+.*
+.******************************************************************************/
+:text.
+:lang eng.
+.*
+:docname.Test Description
+:docno.8/152 91-CRL 113 200/5 Uen
+:rev.C
+:date.2015-04-27
+.*
+:prep.ETH/XZR Kristof Szabados (+36 1 437 7256)
+:appr.ETH/XZ (Roland Gecse)
+:checked.ETHBAAT
+.*
+:title.Test Description - OER coder
+:contents level=3.
+.*---------------------------------------------------------------------*
+:h1.PREREQUISITES AND PREPARATIONS
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h2.Scope of the Test Object
+.*---------------------------------------------------------------------*
+:xmp tab=1 nokeep.
+
+This TD contains unified test cases related to TTCN3 Executor's OER coder function.
+
+The target of these test cases are the basic data types from specification
+'ISO/IEC 8825-7:2015 -- Information technology – ASN.1 encoding rules:
+Specification of Octet Encoding Rules'
+
+The target data types are used in the following technical specification:
+ 'ETSI TS 103 097 V1.3.1 (2017-10)'
+Intelligent Transport Systems (ITS); Security;
+Security header and certificate formats and certificate formats 
+
+ 'IEEE Std 1609.2-2016 IEEE Standard'
+Wireless Access in Vehicular Environments—Security Services for
+Applications and Management Messages
+
+:exmp.
+
+:p.:us.Revision Information:eus.
+
+:xmp nokeep.
+:us.History:eus.
+
+REV   DATE         PREPARED   CHANGE
+===   ==========   ========   ======
+A     2003-10-31   ETHEKR     New document
+B     2007-03-06   EDMDELI    Implicit message encoding
+C     2007-03-21   EJNOSZA    Bugfix in a testcase for implicit msg. enc.
+D     2008-10-01   EFERKOV    Big integers
+E     2010-01-18   EKRISZA    Updated for TITAN R8C
+F     2011-06-18   EKRISZA    Added tests for errors
+A     2011-12-12   EKRISZA     Updated for release
+PB1   2011-01-30   ETHBAAT    Editorial changes
+
+:exmp.
+
+
+.*---------------------------------------------------------------------*
+:h2.Test Tools
+.*---------------------------------------------------------------------*
+:p.:us.Software Tools:eus.
+:xmp tab=2 nokeep.
+
+	SAtester
+
+:exmp.
+:np.
+.*---------------------------------------------------------------------*
+:h1.REQUIREMENT-BASED TESTS
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h2.Testing OER encoding of the basic types
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h3. OER encoding
+.*---------------------------------------------------------------------*
+:xmp tab=0.
+
+<TC - OER encoding (unified tests)>
+
+<STATIC:ASN>
+
+TempA
+
+DEFINITIONS ::=
+
+BEGIN
+
+IMPORTS
+  Certificate, Ieee1609Dot2Data FROM IEEE1609dot2 {
+    iso(1) identified-organization(3) ieee(111)
+    standards-association-numbered-series-standards(2) wave-stds(1609)
+    dot2(2) base(1) schema(1) major-version-2(2)
+  };
+
+  TestIeee1609Dot2Data ::= Ieee1609Dot2Data
+  TestCertificate ::= Certificate
+
+END
+
+<STATIC>
+
+
+type component Test_CT {}
+
+<TTCN_TC:PURE_EXEC>
+
+import from TempA all;
+
+external function enc_Ieee1609Dot2Data(in TestIeee1609Dot2Data pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_Ieee1609Dot2Data(in octetstring stream) return TestIeee1609Dot2Data with { extension "prototype(convert) decode(OER)" }
+
+//*********************************************
+// TESTCASES
+//*********************************************
+
+//D.5.1 “Basic safety message” with dummy payload, signed with a digest
+testcase tc_Ieee1609Dot2Data_SignedWithDigest() runs on Test_CT {
+  const octetstring encoded := 
+'0381004003800F5468697320697320612042534D0D0A4001201112131415161718802122232425262728808231323334353637383132333435363738313233343536373831323334353637384142434445464748414243444546474841424344454647484142434445464748'O;
+  const TestIeee1609Dot2Data data := {
+    protocolVersion := 3,
+    content := {
+      signedData := {
+        hashId := sha256,
+        tbsData := {
+          payload := {
+            data := {
+              protocolVersion := 3,
+              content := { unsecuredData := '5468697320697320612042534D0D0A'O} 
+            }
+          },
+          headerInfo := {
+            psid := 32,
+            generationTime := 1230066625199609624
+          } 
+        },
+        signer := {digest := '2122232425262728'O},
+        signature_ := {
+          ecdsaNistP256Signature := {
+            rSig := { compressed_y_0 := '3132333435363738313233343536373831323334353637383132333435363738'O },
+            sSig := '4142434445464748414243444546474841424344454647484142434445464748'O
+          }
+        }
+      }
+    } 
+  };
+
+  const TestIeee1609Dot2Data decoded := {
+    protocolVersion := 3,
+    content := {
+      signedData := {
+        hashId := sha256,
+        tbsData := {
+          payload := {
+            data := {
+              protocolVersion := 3,
+              content := { unsecuredData := '5468697320697320612042534D0D0A'O} 
+            },
+            extDataHash := omit
+          },
+          headerInfo := {
+            psid := 32,
+            generationTime := 1230066625199609624,
+            expiryTime := omit,
+            generationLocation := omit,
+            p2pcdLearningRequest := omit,
+            missingCrlIdentifier := omit,
+            encryptionKey := omit,
+            inlineP2pcdRequest := omit,
+            requestedCertificate := omit
+          } 
+        },
+        signer := {digest := '2122232425262728'O},
+        signature_ := {
+          ecdsaNistP256Signature := {
+            rSig := { compressed_y_0 := '3132333435363738313233343536373831323334353637383132333435363738'O },
+            sSig := '4142434445464748414243444546474841424344454647484142434445464748'O
+          }
+        }
+      }
+    } 
+  };
+
+  if (enc_Ieee1609Dot2Data(data) == encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_Ieee1609Dot2Data(encoded) == decoded) {setverdict(pass);} else {setverdict(fail);}
+}
+
+// D.5.2 “Basic safety message” with dummy pay load, signed with a certificate
+testcase tc_Ieee1609Dot2Data_SignedWithCertificate() runs on Test_CT {
+  const octetstring encoded :=
+    '0381004003800F5468697320697320612042534D0D0A4001201112131415161718810101000301802122232425262728508080006431323334353637383941424344515253545556575859616263004604E09A208400A983010380007C8001E4800348010200012000012681829192939495969798919293949596979891929394959697989192939495969798808231323334353637383132333435363738313233343536373831323334353637384142434445464748414243444546474841424344454647484142434445464748'O;
+
+  const TestIeee1609Dot2Data data := {
+    protocolVersion := 3,
+    content := {
+      signedData := {
+        hashId := sha256,
+        tbsData := {
+          payload := {
+            data := {
+              protocolVersion := 3,
+              content := { unsecuredData := '5468697320697320612042534D0D0A'O }
+            }
+          },
+          headerInfo := { psid := 32, generationTime := 1230066625199609624 }
+        },
+        signer := {
+          certificate := {
+            {
+              version := 3,
+              type_ := implicit,
+                issuer := { sha256AndDigest := '2122232425262728'O },
+                toBeSigned := {
+                  id := {
+                    linkageData := {
+                      iCert := 100,
+                      linkage_value := '313233343536373839'O,
+                      group_linkage_value := { jValue := '41424344'O, value_ := '515253545556575859'O }
+                    }
+                  },
+                  cracaId := '616263'O,
+                  crlSeries := 70,
+                  validityPeriod := { start_ := 81828384, duration := { hours := 169 } },
+                  region := { identifiedRegion := { { countryOnly := 124 }, { countryOnly := 484 }, { countryOnly := 840 } } },
+                  appPermissions := { { psid := 32}, { psid := 38} },
+                  verifyKeyIndicator := { reconstructionValue := { compressed_y_0 := '9192939495969798919293949596979891929394959697989192939495969798'O } }
+                }
+              }
+            }
+          },
+          signature_ := {
+            ecdsaNistP256Signature := {
+              rSig := { compressed_y_0 := '3132333435363738313233343536373831323334353637383132333435363738'O},
+              sSig := '4142434445464748414243444546474841424344454647484142434445464748'O
+            }
+          }
+        }
+      }
+    };
+
+  const TestIeee1609Dot2Data decoded := {
+    protocolVersion := 3,
+    content := {
+      signedData := {
+        hashId := sha256,
+        tbsData := {
+          payload := {
+            data := {
+              protocolVersion := 3,
+              content := { unsecuredData := '5468697320697320612042534D0D0A'O }
+            },
+            extDataHash := omit
+          },
+          headerInfo := {
+            psid := 32,
+            generationTime := 1230066625199609624,
+            expiryTime := omit,
+            generationLocation := omit,
+            p2pcdLearningRequest := omit,
+            missingCrlIdentifier := omit,
+            encryptionKey := omit,
+            inlineP2pcdRequest := omit,
+            requestedCertificate := omit
+          }
+        },
+        signer := {
+          certificate := {
+            {
+              version := 3,
+              type_ := implicit,
+                issuer := { sha256AndDigest := '2122232425262728'O },
+                toBeSigned := {
+                  id := {
+                    linkageData := {
+                      iCert := 100,
+                      linkage_value := '313233343536373839'O,
+                      group_linkage_value := {
+                        jValue := '41424344'O,
+                        value_ := '515253545556575859'O
+                      }
+                    }
+                  },
+                  cracaId := '616263'O,
+                  crlSeries := 70,
+                  validityPeriod := {
+                    start_ := 81828384,
+                    duration := { hours := 169 }
+                  },
+                  region := {
+                    identifiedRegion := {
+                      { countryOnly := 124 },
+                      { countryOnly := 484 },
+                      { countryOnly := 840 }
+                    }
+                  },
+                  assuranceLevel := omit,
+                  appPermissions := {
+                    { psid := 32, ssp := omit },
+                    { psid := 38, ssp := omit }
+                  },
+                  certIssuePermissions := omit,
+                  certRequestPermissions := omit,
+                  canRequestRollover := omit,
+                  encryptionKey := omit,
+                  verifyKeyIndicator := {
+                    reconstructionValue := { compressed_y_0 := '9192939495969798919293949596979891929394959697989192939495969798'O }
+                  }
+                },
+                signature_ := omit
+              }
+            }
+          },
+          signature_ := {
+            ecdsaNistP256Signature := {
+              rSig := { compressed_y_0 := '3132333435363738313233343536373831323334353637383132333435363738'O},
+              sSig := '4142434445464748414243444546474841424344454647484142434445464748'O
+            }
+          }
+        }
+      }
+    };
+
+  if (enc_Ieee1609Dot2Data(data) == encoded) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_Ieee1609Dot2Data(encoded) == decoded) {setverdict(pass);} else {setverdict(fail);}
+}
+//*********************************************
+// CONTROL PART
+//*********************************************
+
+control {
+  execute(tc_Ieee1609Dot2Data_SignedWithDigest());
+  execute(tc_Ieee1609Dot2Data_SignedWithCertificate());
+}
+
+<RESULT>
+
+Overall verdict: pass
+
+<END_TC>
+
diff --git a/function_test/OER_EncDec/OER_EncDec_ITSPKI.script b/function_test/OER_EncDec/OER_EncDec_ITSPKI.script
new file mode 100644
index 0000000000000000000000000000000000000000..3ddf4ece0c8a4a13aadb7f6a5d4c59ff9d12bc31
--- /dev/null
+++ b/function_test/OER_EncDec/OER_EncDec_ITSPKI.script
@@ -0,0 +1,810 @@
+.******************************************************************************
+.* Copyright (c) 2000-2018 Ericsson Telecom AB
+.* All rights reserved. This program and the accompanying materials
+.* are made available under the terms of the Eclipse Public License v2.0
+.* which accompanies this distribution, and is available at
+.* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+.*
+.* Contributors:
+.*   Balasko, Jeno
+.*   Beres, Szabolcs
+.*   Delic, Adam
+.*   Kovacs, Ferenc
+.*   Szabados, Kristof
+.*   Tarasov, Victor
+.*
+.******************************************************************************/
+:text.
+:lang eng.
+.*
+:docname.Test Description
+:docno.8/152 91-CRL 113 200/5 Uen
+:rev.C
+:date.2015-04-27
+.*
+:prep.ETH/XZR Kristof Szabados (+36 1 437 7256)
+:appr.ETH/XZ (Roland Gecse)
+:checked.ETHBAAT
+.*
+:title.Test Description - OER coder
+:contents level=3.
+.*---------------------------------------------------------------------*
+:h1.PREREQUISITES AND PREPARATIONS
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h2.Scope of the Test Object
+.*---------------------------------------------------------------------*
+:xmp tab=1 nokeep.
+
+This TD contains unified test cases related to TTCN3 Executor's OER coder function.
+
+The target of these test cases are the basic data types from specification
+'ISO/IEC 8825-7:2015 -- Information technology – ASN.1 encoding rules:
+Specification of Octet Encoding Rules'
+
+The target data types are used in the following technical specification:
+ 'ETSI TS 103 097 V1.3.1 (2017-10)'
+Intelligent Transport Systems (ITS); Security;
+Security header and certificate formats and certificate formats 
+
+ 'IEEE Std 1609.2-2016 IEEE Standard'
+Wireless Access in Vehicular Environments—Security Services for
+Applications and Management Messages
+
+:exmp.
+
+:p.:us.Revision Information:eus.
+
+:xmp nokeep.
+:us.History:eus.
+
+REV   DATE         PREPARED   CHANGE
+===   ==========   ========   ======
+A     2003-10-31   ETHEKR     New document
+B     2007-03-06   EDMDELI    Implicit message encoding
+C     2007-03-21   EJNOSZA    Bugfix in a testcase for implicit msg. enc.
+D     2008-10-01   EFERKOV    Big integers
+E     2010-01-18   EKRISZA    Updated for TITAN R8C
+F     2011-06-18   EKRISZA    Added tests for errors
+A     2011-12-12   EKRISZA     Updated for release
+PB1   2011-01-30   ETHBAAT    Editorial changes
+
+:exmp.
+
+
+.*---------------------------------------------------------------------*
+:h2.Test Tools
+.*---------------------------------------------------------------------*
+:p.:us.Software Tools:eus.
+:xmp tab=2 nokeep.
+
+	SAtester
+
+:exmp.
+:np.
+.*---------------------------------------------------------------------*
+:h1.REQUIREMENT-BASED TESTS
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h2.Testing OER encoding of the basic types
+.*---------------------------------------------------------------------*
+.*---------------------------------------------------------------------*
+:h3. OER encoding
+.*---------------------------------------------------------------------*
+:xmp tab=0.
+
+<TC - OER encoding (unified tests)>
+
+<STATIC:ASN>
+
+TempA
+
+DEFINITIONS ::=
+
+BEGIN
+
+  IMPORTS;
+
+  Null ::= NULL
+
+  Bool ::= BOOLEAN
+
+  Uint   ::= INTEGER (0..MAX)
+  Uint8  ::= INTEGER (0..255)
+  Uint16 ::= INTEGER (0..65535) 
+  Uint32 ::= INTEGER (0..4294967295)
+  Uint64 ::= INTEGER (0..18446744073709551615)
+
+  Int    ::= INTEGER
+  Sint8  ::= INTEGER (-128..127)
+  Sint16 ::= INTEGER (-32768..32767)
+  Sint32 ::= INTEGER (-2147483648..2147483647)
+  Sint64 ::= INTEGER (-9223372036854775808..9223372036854775807)
+
+  Enum ::= ENUMERATED {zero(0), one(1), two(2)}
+  EnumM ::= ENUMERATED {zero(0), one(1), two(2), numM(18)}
+  EnumP ::= ENUMERATED {zero(0), one(1), two(2), numP(1234)}
+  EnumB ::= ENUMERATED {zero(0), one(1), two(2), numB(65261)}
+  EnumNM ::= ENUMERATED {zero(0), one(1), two(2), numNM(-275)}
+  EnumNB ::= ENUMERATED {zero(0), one(1), two(2), numNB(-64302)}
+
+  BitStr ::= BIT STRING
+  BitStrEmpty ::= BIT STRING (SIZE(0))
+  BitStrRandom ::= BIT STRING (SIZE(54))
+  BitStrAligned ::= BIT STRING (SIZE(48))
+
+  OctetStr ::= OCTET STRING
+  OctetStrEmpty ::= OCTET STRING (SIZE(0))
+  OctetStrRandom ::= OCTET STRING (SIZE(6))
+
+  SequenceEmpty ::= SEQUENCE {}
+  SequenceEmptyExtendable ::= SEQUENCE {
+    ... 
+  }
+  SequenceSimple ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)),
+    f2 OCTET STRING (SIZE (2)),
+    f3 OCTET STRING (SIZE (2))
+  }
+  SequenceSimpleExtendable ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)),
+    f2 OCTET STRING (SIZE (2)),
+    f3 OCTET STRING (SIZE (2)),
+    ...
+  }
+  SequenceSimpleExtended ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)),
+    f2 OCTET STRING (SIZE (2)),
+    f3 OCTET STRING (SIZE (2)),
+    ...,
+    e1 OCTET STRING (SIZE (2)),
+    e2 OCTET STRING (SIZE (2)),
+    e3 OCTET STRING (SIZE (2))
+
+  }
+  SequenceSomeOptional ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)),
+    f2 [2] OCTET STRING (SIZE (2)) OPTIONAL,
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+  SequenceAllOptional ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)) OPTIONAL,
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+  SequenceOptionalExtendable ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)),
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...
+  }
+  SequenceLongOptionalExtendable ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)) OPTIONAL,
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    f4 [4] OCTET STRING (SIZE (2)) OPTIONAL,
+    f5 [5] OCTET STRING (SIZE (2)) OPTIONAL,
+    f6 [6] OCTET STRING (SIZE (2)) OPTIONAL,
+    f7 [7] OCTET STRING (SIZE (2)) OPTIONAL,
+    f8 [8] OCTET STRING (SIZE (2)) OPTIONAL,
+    f9 [9] OCTET STRING (SIZE (2)) OPTIONAL,
+    f10 [10] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...
+  }
+  SequenceOptionalExtended ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)),
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...,
+    e1 [4] OCTET STRING (SIZE (2)) OPTIONAL,
+    e2 [5] OCTET STRING (SIZE (2)),
+    e3 [6] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+  SequenceLongOptionalExtended ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)),
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...,
+    e1 [4] OCTET STRING (SIZE (2)) OPTIONAL,
+    e2 [5] OCTET STRING (SIZE (2)),
+    e3 [6] OCTET STRING (SIZE (2)) OPTIONAL,
+    e4 [7] OCTET STRING (SIZE (2)) OPTIONAL,
+    e5 [8] OCTET STRING (SIZE (2)),
+    e6 [9] OCTET STRING (SIZE (2)) OPTIONAL,
+    e7 [10] OCTET STRING (SIZE (2)) OPTIONAL,
+    e8 [11] OCTET STRING (SIZE (2)),
+    e9 [12] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+  SequenceUnknownExtended ::= SEQUENCE {
+    f1 OCTET STRING (SIZE (2)) OPTIONAL,
+    f2 [2] OCTET STRING (SIZE (2)),
+    f3 [3] OCTET STRING (SIZE (2)) OPTIONAL,
+    ...,
+    e1 [4] OCTET STRING (SIZE (2)) OPTIONAL,
+    e2 [5] OCTET STRING (SIZE (2)),
+    e3 [6] OCTET STRING (SIZE (2)) OPTIONAL,
+    e4 [7] OCTET STRING (SIZE (2)) OPTIONAL
+  }
+
+  SequenceOfOctetString ::= SEQUENCE OF OCTET STRING (SIZE (2))
+
+  Choice ::= CHOICE {
+    f [0] OCTET STRING (SIZE (2)),
+    s [1] NULL
+  }
+  ChoiceBis ::= CHOICE {
+    f [42] OCTET STRING (SIZE (2)),
+    s [99] NULL
+  }
+  ChoiceTer ::= CHOICE {
+    f [123456] OCTET STRING (SIZE (2)),
+    s [999999] NULL
+  }
+  ChoiceQuatro ::= CHOICE {
+    f [0] NULL,
+    ...,
+    s [42] OCTET STRING (SIZE (2)),
+    t [99] NULL
+  }
+
+  Utf8 ::= UTF8String
+
+END
+
+<STATIC>
+
+
+type component Test_CT {}
+
+<TTCN_TC:PURE_EXEC>
+
+import from TempA all;
+
+external function enc_OER_Null(in Null pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Null(in octetstring stream) return Null with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Bool(in Bool pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Bool(in octetstring stream) return Bool with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Uint(in Uint pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint(in octetstring stream) return Uint with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Uint8(in Uint8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint8(in octetstring stream) return Uint8 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Uint16(in Uint16 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint16(in octetstring stream) return Uint16 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Uint32(in Uint32 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint32(in octetstring stream) return Uint32 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Uint64(in Uint64 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Uint64(in octetstring stream) return Uint64 with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Int(in Int pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Int(in octetstring stream) return Int with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Sint8(in Sint8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Sint8(in octetstring stream) return Sint8 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Sint16(in Sint16 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Sint16(in octetstring stream) return Sint16 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Sint32(in Sint32 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Sint32(in octetstring stream) return Sint32 with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_Sint64(in Sint64 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Sint64(in octetstring stream) return Sint64 with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Enum(in Enum pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Enum(in octetstring stream) return Enum with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumM(in EnumM pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumM(in octetstring stream) return EnumM with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumP(in EnumP pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumP(in octetstring stream) return EnumP with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumB(in EnumB pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumB(in octetstring stream) return EnumB with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumNM(in EnumNM pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumNM(in octetstring stream) return EnumNM with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_EnumNB(in EnumNB pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_EnumNB(in octetstring stream) return EnumNB with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_BitStr(in BitStr pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_BitStr(in octetstring pdu) return BitStr with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_BitStrEmpty(in BitStrEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_BitStrEmpty(in octetstring pdu) return BitStrEmpty with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_BitStrRandom(in BitStrRandom pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_BitStrRandom(in octetstring pdu) return BitStrRandom with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_BitStrAligned(in BitStrAligned pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_BitStrAligned(in octetstring pdu) return BitStrAligned with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_OctetStr(in OctetStr pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_OctetStr(in octetstring pdu) return OctetStr with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_OctetStrEmpty(in OctetStrEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_OctetStrEmpty(in octetstring pdu) return OctetStrEmpty with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_OctetStrRandom(in OctetStrRandom pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_OctetStrRandom(in octetstring pdu) return OctetStrRandom with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_SequenceEmpty(in SequenceEmpty pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceEmpty(in octetstring stream) return SequenceEmpty with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceEmptyExtendable(in SequenceEmptyExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceEmptyExtendable(in octetstring stream) return SequenceEmptyExtendable with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceSimple(in SequenceSimple pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceSimple(in octetstring stream) return SequenceSimple with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceSimpleExtendable(in SequenceSimpleExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceSimpleExtendable(in octetstring stream) return SequenceSimpleExtendable with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceSimpleExtended(in SequenceSimpleExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceSimpleExtended(in octetstring stream) return SequenceSimpleExtended with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceSomeOptional(in SequenceSomeOptional pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceSomeOptional(in octetstring stream) return SequenceSomeOptional with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceAllOptional(in SequenceAllOptional pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceAllOptional(in octetstring stream) return SequenceAllOptional with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceOptionalExtendable(in SequenceOptionalExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceOptionalExtendable(in octetstring stream) return SequenceOptionalExtendable with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceLongOptionalExtendable(in SequenceLongOptionalExtendable pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceLongOptionalExtendable(in octetstring stream) return SequenceLongOptionalExtendable with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceOptionalExtended(in SequenceOptionalExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceOptionalExtended(in octetstring stream) return SequenceOptionalExtended with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceLongOptionalExtended(in SequenceLongOptionalExtended pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceLongOptionalExtended(in octetstring stream) return SequenceLongOptionalExtended with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_SequenceOfOctetString(in SequenceOfOctetString pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_SequenceOfOctetString(in octetstring stream) return SequenceOfOctetString with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Choice(in Choice pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Choice(in octetstring stream) return Choice with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_ChoiceBis(in ChoiceBis pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_ChoiceBis(in octetstring stream) return ChoiceBis with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_ChoiceTer(in ChoiceTer pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_ChoiceTer(in octetstring stream) return ChoiceTer with { extension "prototype(convert) decode(OER)" }
+external function enc_OER_ChoiceQuatro(in ChoiceQuatro pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_ChoiceQuatro(in octetstring stream) return ChoiceQuatro with { extension "prototype(convert) decode(OER)" }
+
+external function enc_OER_Utf8(in Utf8 pdu) return octetstring with { extension "prototype(convert) encode(OER)" }
+external function dec_OER_Utf8(in octetstring stream) return Utf8 with { extension "prototype(convert) decode(OER)" }
+
+//*********************************************
+// TESTCASES
+//*********************************************
+
+testcase tc_OER_Null() runs on Test_CT {
+  const Null nn := NULL
+  
+  if (enc_OER_Null(nn) == ''O) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Null(''O) == nn) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Bool() runs on Test_CT {
+  const Bool b1 := true
+  const Bool b2 := false  
+
+  if (enc_OER_Bool(b1) == 'FF'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Bool(b2) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Bool('FF'O) == b1){setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Bool('42'O) == b1){setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Bool('00'O) == b2){setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint() runs on Test_CT {
+  const Uint u0 := 0
+  const Uint u1 := 1
+  const Uint u254 := 254
+  const Uint uR := 8234104123542484900769178205574010627627573691361805720124810878238590820080
+  const octetstring oR := '20123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O
+  const Uint uB := 115307965754428812535861235258289182183752994114051557942764040435498874699501
+  const octetstring oB := '20FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+  const octetstring oBB := '280000000000000000FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+
+  if (enc_OER_Uint(u0) == '0100'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint(u1) == '0101'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint(u254) == '01FE'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint(uR) == oR) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint(uB) == oB) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint('0100'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint('0101'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint('01FE'O) == u254) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint(oR) == uR) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint(oB) == uB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint(oBB) == uB) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint8() runs on Test_CT {
+  const Uint8 u0 := 0
+  const Uint8 u1 := 1  
+  const Uint8 u18 := 18 
+  const Uint8 u254 := 254 
+
+  if (enc_OER_Uint8(u0) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint8(u1) == '01'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint8(u18) == '12'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint8(u254) == 'FE'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint8('00'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint8('01'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint8('12'O) == u18) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint8('FE'O) == u254) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint16() runs on Test_CT {
+  const Uint16 u0 := 0
+  const Uint16 u1 := 1
+  const Uint16 u4660 := 4660  
+  const Uint16 u65261 := 65261 
+
+  if (enc_OER_Uint16(u0) == '0000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint16(u1) == '0001'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint16(u4660) == '1234'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint16(u65261) == 'FEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint16('0000'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint16('0001'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint16('1234'O) == u4660) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint16('FEED'O) == u65261) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint32() runs on Test_CT {
+  const Uint32 u0 := 0
+  const Uint32 u1 := 1
+  const Uint32 uR := 305419896
+  const Uint32 uB := 4277010157
+
+  if (enc_OER_Uint32(u0) == '00000000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint32(u1) == '00000001'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint32(uR) == '12345678'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint32(uB) == 'FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint32('00000000'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint32('00000001'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint32('12345678'O) == uR) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint32('FEEDFEED'O) == uB) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Uint64() runs on Test_CT {
+  const Uint64 u0 := 0
+  const Uint64 u1 := 1
+  const Uint64 uR := 1311768467463790320
+  const Uint64 uB := 18369618753251835629
+
+  if (enc_OER_Uint64(u0) == '0000000000000000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint64(u1) == '0000000000000001'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint64(uR) == '123456789ABCDEF0'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Uint64(uB) == 'FEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Uint64('0000000000000000'O) == u0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint64('0000000000000001'O) == u1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint64('123456789ABCDEF0'O) == uR) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Uint64('FEEDFEEDFEEDFEED'O) == uB) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Int() runs on Test_CT {
+  const Int i0 := 0
+  const Int i1 := 1
+  const Int i254 := 254
+  const Int iR := 8234104123542484900769178205574010627627573691361805720124810878238590820080
+  const octetstring oR := '20123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O
+  const Int iB := 115307965754428812535861235258289182183752994114051557942764040435498874699501
+  const octetstring oB := '2100FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+  const octetstring oBB := '280000000000000000FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+  const Int iBn := -484123482887382887709749750398725669516990551589006096693543572414254940435
+  const octetstring oBn := '20FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O
+  const Int iBBn := -107557985113773710522801806803113897225642410974278758319332773129674538819856
+  const octetstring oBBn := '21FF123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O
+  const octetstring oBBnn := '28FFFFFFFFFFFFFFFF123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0'O
+
+  if (enc_OER_Int(i0) == '0100'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(i1) == '0101'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(i254) == '0200FE'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(iR) == oR) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(iB) == oB) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(iBn) == oBn) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Int(iBBn) == oBBn) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Int('0100'O) == i0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int('0101'O) == i1) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int('0200FE'O) == i254) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oR) == iR) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oB) == iB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oBB) == iB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oBBn) == iBBn) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Int(oBBnn) == iBBn) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Sint8() runs on Test_CT {
+  const Sint8 s0 := 0
+  const Sint8 s18 := 18
+  const Sint8 sn2 := -2  
+
+  if (enc_OER_Sint8(s0) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint8(s18) == '12'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint8(sn2) == 'FE'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Sint8('00'O) == s0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint8('12'O) == s18) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint8('FE'O) == sn2) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Sint16() runs on Test_CT {
+  const Sint16 s0 := 0
+  const Sint16 s4660 := 4660
+  const Sint16 sn275 := -275  
+
+  if (enc_OER_Sint16(s0) == '0000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint16(s4660) == '1234'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint16(sn275) == 'FEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Sint16('0000'O) == s0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint16('1234'O) == s4660) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint16('FEED'O) == sn275) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Sint32() runs on Test_CT {
+  const Sint32 s0 := 0
+  const Sint32 sB := 305419896
+  const Sint32 sN := -17957139
+
+  if (enc_OER_Sint32(s0) == '00000000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint32(sB) == '12345678'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint32(sN) == 'FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Sint32('00000000'O) == s0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint32('12345678'O) == sB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint32('FEEDFEED'O) == sN) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Sint64() runs on Test_CT {
+  const Sint64 s0 := 0
+  const Sint64 sB := 1311768467463790320
+  const Sint64 sN := -77125320457715987
+
+  if (enc_OER_Sint64(s0) == '0000000000000000'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint64(sB) == '123456789ABCDEF0'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Sint64(sN) == 'FEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Sint64('0000000000000000'O) == s0) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint64('123456789ABCDEF0'O) == sB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Sint64('FEEDFEEDFEEDFEED'O) == sN) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Enum() runs on Test_CT {
+  const Enum enum_zero := zero
+  const EnumM enumm_numM := numM
+  const EnumP enumm_numP := numP
+  const EnumB enumm_numB := numB
+  const EnumNM enumm_numNM := numNM
+  const EnumNB enumm_numNB := numNB
+
+  if (enc_OER_Enum(enum_zero) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumM(enumm_numM) == '12'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumP(enumm_numP) == '8204D2'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumB(enumm_numB) == '8300FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumNM(enumm_numNM) == '82FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_EnumNB(enumm_numNB) == '83FF04D2'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Enum('00'O) == enum_zero) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumM('12'O) == enumm_numM) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumP('8204D2'O) == enumm_numP) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumB('8300FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumB('840000FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);}
+  // if (dec_OER_EnumB('85000000FEED'O) == enumm_numB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumNM('82FEED'O) == enumm_numNM) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumNB('83FF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_EnumNB('84FFFF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);}
+  // if (dec_OER_EnumNB('85FFFFFF04D2'O) == enumm_numNB) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_BitStr() runs on Test_CT {
+  const BitStrEmpty empty := ''B
+  const BitStrRandom random :=   '111111101110110111111110111011011111111011101101111110'B
+  const BitStrAligned aligned := '111111101110110111111110111011011111111011101101'B
+
+  if (enc_OER_BitStrEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_BitStrRandom(random) == 'FEEDFEEDFEEDF8'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_BitStrAligned(aligned) == 'FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (enc_OER_BitStr(empty) == '0100'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_BitStr(random) == '0802FEEDFEEDFEEDF8'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_BitStr(aligned) == '0700FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_BitStrEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_BitStrRandom('FEEDFEEDFEEDF8'O) == random) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_BitStrAligned('FEEDFEEDFEED'O) == aligned) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_BitStr('0100'O) == empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_BitStr('0802FEEDFEEDFEEDF8'O) == random) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_BitStr('0700FEEDFEEDFEED'O) == aligned) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_OctetStr() runs on Test_CT {
+  const OctetStrEmpty empty := ''O
+  const OctetStrRandom random :=   'FEEDFEEDFEED'O
+
+  if (enc_OER_OctetStrEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_OctetStrRandom(random) == 'FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (enc_OER_OctetStr(empty) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_OctetStr(random) == '06FEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+  
+  if (dec_OER_OctetStrEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_OctetStrRandom('FEEDFEEDFEED'O) == random) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_OctetStr('00'O) == empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_OctetStr('06FEEDFEEDFEED'O) == random) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceEmpty() runs on Test_CT {
+  const SequenceEmpty empty := {}
+  const SequenceEmptyExtendable empty_extendable := {}
+
+  if (enc_OER_SequenceEmpty(empty) == ''O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceEmptyExtendable(empty_extendable) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceEmpty(''O) == empty) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceSimple() runs on Test_CT {
+  const SequenceSimple s := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := 'CCCC'O}
+  const SequenceSimpleExtendable s_ee := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O}
+  const SequenceSimpleExtended s_ed := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e1:='9999'O,e2:='8888'O,e3:='7777'O}
+  const SequenceSimpleExtended s_ed100 := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e1:='9999'O}
+  const SequenceSimpleExtended s_ed010 := {f1:='AAAA'O,f2:='BBBB'O,f3:='CCCC'O,e2:='8888'O}
+
+  if (enc_OER_SequenceSimple(s) == 'AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSimpleExtendable(s_ee) == '00AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSimpleExtended(s_ed) == '80AAAABBBBCCCC0205E0029999028888027777'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSimpleExtended(s_ed100) == '80AAAABBBBCCCC020580029999'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSimpleExtended(s_ed010) == '80AAAABBBBCCCC020540028888'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceSimple('AAAABBBBCCCC'O) == s) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSimpleExtendable('00AAAABBBBCCCC'O) == s_ee) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSimpleExtended('80AAAABBBBCCCC0205E0029999028888027777'O) == s_ed) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSimpleExtended('80AAAABBBBCCCC020540028888'O).e2 == '8888'O) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceSomeOptional() runs on Test_CT {
+  const SequenceSomeOptional seqSO111 := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := 'CCCC'O}
+  const SequenceSomeOptional seqSO110 := {f1 := 'AAAA'O,f2 := 'BBBB'O,f3 := omit}
+  const SequenceSomeOptional seqSO101 := {f1 := 'AAAA'O,f2 := omit,   f3 := 'CCCC'O}
+  const SequenceSomeOptional seqSO100 := {f1 := 'AAAA'O,f2 := omit,   f3 := omit}
+
+  if (enc_OER_SequenceSomeOptional(seqSO111) == 'C0AAAABBBBCCCC'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSomeOptional(seqSO110) == '80AAAABBBB'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSomeOptional(seqSO101) == '40AAAACCCC'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceSomeOptional(seqSO100) == '00AAAA'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceSomeOptional('C0AAAABBBBCCCC'O) == seqSO111) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSomeOptional('80AAAABBBB'O)     == seqSO110) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceSomeOptional('00AAAA'O)         == seqSO100) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceAllOptional() runs on Test_CT {
+  const SequenceAllOptional seqSAO000 := {f1:=omit,f2:=omit,f3:=omit}
+  
+  if (enc_OER_SequenceAllOptional(seqSAO000) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceAllOptional('00'O) == seqSAO000) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceOptionalExtendable() runs on Test_CT {
+  const SequenceOptionalExtendable seqSOE110 := {f1:='FEED'O,f2:='FEED'O,f3:=omit}
+  const SequenceOptionalExtendable seqSOE011 := {f1:=omit,f2:='FEED'O,f3:='FEED'O}
+  
+  if (enc_OER_SequenceOptionalExtendable(seqSOE110) == '40FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceOptionalExtendable(seqSOE011) == '20FEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceOptionalExtendable('40FEEDFEED'O) == seqSOE110) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOptionalExtendable('20FEEDFEED'O) == seqSOE011) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceLongOptionalExtendable() runs on Test_CT {
+  const SequenceLongOptionalExtendable seq01 := {
+    f1:='FEED'O,f2:='FEED'O,f3:='FEED'O,f4:='FEED'O,f5:='FEED'O,f6:='FEED'O,f7:='FEED'O,f8:='FEED'O,f9:='FEED'O,f10:='FEED'O
+  }
+  const SequenceLongOptionalExtendable seq02 := {
+    f1:='FEED'O,f2:=omit,f3:='FEED'O,f4:=omit,f5:='FEED'O,f6:=omit,f7:='FEED'O,f8:=omit,f9:='FEED'O,f10:=omit
+  }
+  
+  if (enc_OER_SequenceLongOptionalExtendable(seq01) == '7FE0FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceLongOptionalExtendable(seq02) == '5540FEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceLongOptionalExtendable('7FE0FEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED'O) == seq01) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceLongOptionalExtendable('5540FEEDFEEDFEEDFEEDFEED'O) == seq02) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceOptionalExtended() runs on Test_CT {
+  const SequenceOptionalExtended seq01_enc := {f1:='FEED'O,f2:='FEED'O,e1:='FEED'O,e2:='FEED'O}
+  const SequenceOptionalExtended seq01_dec := {f1:='FEED'O,f2:='FEED'O,f3:=omit,e1:='FEED'O,e2:='FEED'O,e3:=omit}
+  const SequenceOptionalExtended seq02_enc := {f2:='FEED'O,f3:='FEED'O,e2:='FEED'O,e3:='FEED'O}
+  const SequenceOptionalExtended seq02_dec := {f1:=omit,f2:='FEED'O,f3:='FEED'O,e1:=omit,e2:='FEED'O,e3:='FEED'O}
+  
+  if (enc_OER_SequenceOptionalExtended(seq01_enc) == 'C0FEEDFEED0205C002FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceOptionalExtended(seq02_enc) == 'A0FEEDFEED02056002FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOptionalExtended('C0FEEDFEED0205C002FEED02FEED'O) == seq01_dec) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOptionalExtended('A0FEEDFEED02056002FEED02FEED'O) == seq02_dec) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceLongOptionalExtended() runs on Test_CT {
+  const SequenceLongOptionalExtended seq01_enc := {
+    f1:='FEED'O,f2:='FEED'O,e1:='FEED'O,e2:='FEED'O,e4:='FEED'O,e5:='FEED'O,e7:='FEED'O,e8:='FEED'O
+  }
+  const SequenceLongOptionalExtended seq01_dec := {
+    f1:='FEED'O,f2:='FEED'O,f3:=omit,e1:='FEED'O,e2:='FEED'O,e3:=omit,e4:='FEED'O,e5:='FEED'O,e6:=omit,e7:='FEED'O,e8:='FEED'O,e9:=omit
+  }
+  
+  if (enc_OER_SequenceLongOptionalExtended(seq01_enc) == 'C0FEEDFEED0307DB0002FEED02FEED02FEED02FEED02FEED02FEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceLongOptionalExtended('C0FEEDFEED0307DB0002FEED02FEED02FEED02FEED02FEED02FEED'O) == seq01_dec) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_SequenceOfOctetString() runs on Test_CT {
+  const SequenceOfOctetString seqOfEmpty := {}
+  const SequenceOfOctetString seqOf := {'FEED'O,'FEED'O,'FEED'O,'FEED'O,'FEED'O,'FEED'O}
+
+  if (enc_OER_SequenceOfOctetString(seqOfEmpty) == '0100'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_SequenceOfOctetString(seqOf) == '0106FEEDFEEDFEEDFEEDFEEDFEED'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_SequenceOfOctetString('0100'O) == seqOfEmpty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOfOctetString('0106FEEDFEEDFEEDFEEDFEEDFEED'O) == seqOf) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_SequenceOfOctetString('03000006FEEDFEEDFEEDFEEDFEEDFEED'O) == seqOf) {setverdict(pass);} else {setverdict(fail);}
+}
+
+testcase tc_OER_Choice() runs on Test_CT {
+  const Choice choice := {f:='FEED'O}
+  const ChoiceBis choice_bis := {f:='FEED'O}
+  const ChoiceTer choice_ter := {f:='FEED'O}
+  const ChoiceQuatro choice_quatro := {s:='FEED'O}
+
+  if (enc_OER_Choice(choice) == '80FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_ChoiceBis(choice_bis) == 'AAFEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_ChoiceTer(choice_ter) == 'BF87C440FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_ChoiceQuatro(choice_quatro) == 'AA02FEED'O) {setverdict(pass);} else {setverdict(fail);}
+  
+  if (dec_OER_Choice('80FEED'O) == choice) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_ChoiceBis('AAFEED'O) == choice_bis) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_ChoiceTer('BF87C440FEED'O) == choice_ter) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_ChoiceQuatro('AA02FEED'O) == choice_quatro) {setverdict(pass);} else {setverdict(fail);}
+
+}
+
+testcase tc_OER_Utf8() runs on Test_CT {
+  const Utf8 str_empty := "" 
+  const Utf8 str := "May the force be with you." 
+  
+  if (enc_OER_Utf8(str_empty) == '00'O) {setverdict(pass);} else {setverdict(fail);}
+  if (enc_OER_Utf8(str) == '1A4D61792074686520666F726365206265207769746820796F752E'O) {setverdict(pass);} else {setverdict(fail);}
+
+  if (dec_OER_Utf8('00'O) == str_empty) {setverdict(pass);} else {setverdict(fail);}
+  if (dec_OER_Utf8('1A4D61792074686520666F726365206265207769746820796F752E'O) == str) {setverdict(pass);} else {setverdict(fail);}
+}
+
+//*********************************************
+// CONTROL PART
+//*********************************************
+
+control {
+  execute(tc_OER_Null());
+  execute(tc_OER_Bool());
+  execute(tc_OER_Uint());
+  execute(tc_OER_Uint8());
+  execute(tc_OER_Uint16());
+  execute(tc_OER_Uint32());
+  execute(tc_OER_Uint64());
+  execute(tc_OER_Int());
+  execute(tc_OER_Sint8());
+  execute(tc_OER_Sint16());
+  execute(tc_OER_Sint32());
+  execute(tc_OER_Sint64());
+  execute(tc_OER_Enum());
+  execute(tc_OER_BitStr());
+  execute(tc_OER_OctetStr());
+  execute(tc_OER_SequenceEmpty());
+  execute(tc_OER_SequenceSimple());
+  execute(tc_OER_SequenceSomeOptional());
+  execute(tc_OER_SequenceAllOptional());
+  execute(tc_OER_SequenceOptionalExtendable());
+  execute(tc_OER_SequenceLongOptionalExtendable());
+  execute(tc_OER_SequenceOptionalExtended());
+  execute(tc_OER_SequenceLongOptionalExtended());
+  execute(tc_OER_SequenceOfOctetString());
+  execute(tc_OER_Choice());
+  execute(tc_OER_Utf8());
+}
+
+<RESULT>
+
+Overall verdict: pass
+
+<END_TC>
+
diff --git a/function_test/OER_EncDec/Temp.cfg b/function_test/OER_EncDec/Temp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..1462938a881fb12ed2d5baba5886dd5adc9104c3
--- /dev/null
+++ b/function_test/OER_EncDec/Temp.cfg
@@ -0,0 +1,20 @@
+###############################################################################
+# Copyright (c) 2000-2018 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+#
+# Contributors:
+#   Balasko, Jeno
+#   Hanko, Matyas
+#
+###############################################################################
+[MODULE_PARAMETERS]
+[LOGGING]
+LogSourceInfo := Yes
+Logfile := "Temp.log"
+FileMask := LOG_ALL
+ConsoleMask := TTCN_WARNING | TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS | DEBUG_ENCDEC
+[EXECUTE]
+Temp
diff --git a/function_test/OER_EncDec/run_test_itspki b/function_test/OER_EncDec/run_test_itspki
new file mode 100755
index 0000000000000000000000000000000000000000..07fe41591b02952dfd85db1da8123890bec0f176
--- /dev/null
+++ b/function_test/OER_EncDec/run_test_itspki
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Script parameters are coming from ../Makefile.
+../Tools/SAtester $* ./OER_EncDec_ITSPKI.script
+rm Temp.ttcn
+rm TempA.asn
diff --git a/function_test/OER_EncDec/run_test_personnel_record b/function_test/OER_EncDec/run_test_personnel_record
new file mode 100755
index 0000000000000000000000000000000000000000..464f1a76f210156eaec32d8fc1eedb571d1b9a2d
--- /dev/null
+++ b/function_test/OER_EncDec/run_test_personnel_record
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Script parameters are coming from ../Makefile.
+../Tools/SAtester $* ./ISOIEC-8825-7-2015-AnnexA-PersonnelRecord.script
+rm Temp.ttcn
+rm TempA.asn