diff --git a/spec/src/main/asciidoc/license-efsl.adoc b/spec/src/main/asciidoc/license-efsl.adoc
index ebc7070..2aa72e0 100644
--- a/spec/src/main/asciidoc/license-efsl.adoc
+++ b/spec/src/main/asciidoc/license-efsl.adoc
@@ -13,7 +13,7 @@
 
 Release: {revdate}
 ....
-Copyright (c) 2019 Eclipse Foundation.
+Copyright (c) 2020 Eclipse Foundation.
 
 === Eclipse Foundation Specification License
 
diff --git a/spec/src/main/asciidoc/spec.adoc b/spec/src/main/asciidoc/spec.adoc
index 1fe3753..fca9e38 100644
--- a/spec/src/main/asciidoc/spec.adoc
+++ b/spec/src/main/asciidoc/spec.adoc
@@ -1,59 +1,32 @@
-== Jakarta Annotations Specification, Version 1.3
-
-Copyright (c) 2016, 2019 Oracle and/or its affiliates. All rights reserved.
-
-Oracle and Java are registered trademarks of Oracle and/or its
-affiliates. Other names may be trademarks of their respective owners.
-
-===
-
-image:annotations-3.png[image]
-
-Introduction
-
-image:annotations-4.png[image]
+== Introduction
 
 With the addition of JSR 175 (A Metadata
 Facility for the JavaTM Programming Language) in the Java platform we
 envision that various technologies will use annotations to enable a
 declarative style of programming. It would be unfortunate if these
 technologies each independently defined their own annotations for common
-concepts. It would be valuable to have consistency within the Java EE
+concepts. It would be valuable to have consistency within the Jakarta EE
 and Java SE component technologies, but it will also be valuable to
-allow consistency between Java EE and Java SE.
+allow consistency between Jakarta EE and Java SE.
 
 It is the intention of this specification to
 define a small set of common annotations that will be available for use
 within other specifications. It is hoped that this will help to avoid
 unnecessary redundancy or duplication between annotations defined in
-different Java Specification Requests (JSR). This would allow us to have
+different Jakarta EE specifications. This would allow us to have
 the common annotations all in one place and let the technologies refer
 to this specification rather than have them specified in multiple
 specifications. This way all technologies can use the same version of
 the annotations and there will be consistency in the annotations used
 across the platforms.
 
-===
+=== Goals
 
-image:annotations-5.png[image]
+Define annotations for use in Jakarta EE: This
+spec will define annotations for use within component technologies in
+Jakarta EE as well as the platform as a whole.
 
-Goals
-
-Define annotations for use in Java EE: This
-JSR will define annotations for use within component technologies in
-Java EE as well as the platform as a whole.
-
-Define annotations for use in future revisions
-of Java SE: This JSR will define annotations for use in JSRs targeted
-for Java SE as well as future revisions of Java SE.
-
-
-
-===
-
-image:annotations-5.png[image]
-
-Non-Goals
+=== Non-Goals
 
 Support for Java versions prior to J2SE 5.0
 
@@ -62,11 +35,7 @@
 5.0. It is not a goal of this specification to define a way of doing
 annotation processing of any kind for versions prior to J2SE 5.0.
 
-===
-
-image:annotations-5.png[image]
-
-Compatibility
+=== Compatibility
 
 The annotations defined in this specification
 may be included individually as needed in products that make use of
@@ -74,104 +43,59 @@
 these annotations. Products that support these Java specifications must
 include the required annotations.
 
-===
-
-image:annotations-5.png[image]
-
-Conventions
+=== Conventions
 
 The keywords ‘MUST’, ‘MUST NOT’, ‘REQUIRED’,
 ‘SHALL’, ‘SHALL NOT’, ‘SHOULD’, ‘SHOULD NOT’, ‘RECOMMENDED’, ‘MAY’ AND
 ‘OPTIONAL’ in this document are to be interpreted as described in RFC
 2119.
 
+Java code is formatted as shown below:
 
-
-Java code is formatted as shown below in
-figure 1.1:
-
-Figure 1.1 Example Java code
-
+[source,java]
+----
 package com.wombat.hello;
 
-public class Hello \{
-
- public static void main(String[] args) \{
-
- System.out.println("Hello world");
-
- }
-
+public class Hello {
+    public static void main(String[] args) {
+        System.out.println("Hello world");
+    }
 }
+----
 
-===
-
-image:annotations-5.png[image]
-
-Expert Group Members
+=== Expert Group Members
 
 The following expert group members
 participated in JSR 250:
 
-Cedric Beust (individual)
+- Cedric Beust (individual)
+- Bill Burke (JBoss)
+- Wayne Carr (Intel)
+- Robert Clevenger (Oracle)
+- Evan Ireland (Sybase)
+- Woo Jin Kim (Tmax Soft)
+- Gavin King (JBoss)
+- Rajiv Mordani (Oracle Corporation, Specification lead)
+- Ted Neward (individual)
+- Anurag Parashar (Pramati technologies)
+- Michael Santos (individual)
+- Hani Suleiman (Ironflare AB)
+- Seth White (BEA)
 
-Bill Burke (JBoss)
-
-Wayne Carr (Intel)
-
-Robert Clevenger (Oracle)
-
-Evan Ireland (Sybase)
-
-Woo Jin Kim (Tmax Soft)
-
-Gavin King (JBoss)
-
-Rajiv Mordani (Oracle Corporation,
-Specification lead)
-
-Ted Neward (individual)
-
-Anurag Parashar (Pramati technologies)
-
-Michael Santos (individual)
-
-Hani Suleiman (Ironflare AB)
-
-Seth White (BEA)
-
-===
-
-image:annotations-5.png[image]
-
-Acknowledgements
+=== Acknowledgements
 
 In addition to the expert group listed above,
 Linda DeMichiel, Ron Monzillo, Lance Andersen and Bill Shannon all of
 whom work at Oracle Corporation have provided input to this
 specification.
 
-
-
-===
-
-===
-
-image:annotations-6.png[image]
-
-Annotations
-
-image:annotations-7.png[image]
+== Annotations
 
 This chapter describes the standard
 annotations, some guidelines for annotation inheritance and the usage of
 these annotations where possible.
 
-===
-
-image:annotations-8.png[image]
-
-General Guidelines for Inheritance of Annotations
+=== General Guidelines for Inheritance of Annotations
 
 The interplay of annotations and inheritance
 in the Java language is potentially a source of complexity for
@@ -181,27 +105,19 @@
 specifications, hence the potential for inconsistencies to arise. For
 instance, consider the following example:
 
-
-
-public class Base \{
-
- @TransactionAttribute(REQUIRES_NEW)
-
- public void foo \{...}
-
+[source,java]
+----
+public class Base {
+    @TransactionAttribute(REQUIRES_NEW)
+    public void foo {...}
 }
 
 @Stateless
-
-public class Derived extends Base \{
-
- @TransactionAttribute(NEVER)
-
- public void foo \{...}
-
+public class Derived extends Base {
+    @TransactionAttribute(NEVER)
+    public void foo {...}
 }
-
-
+----
 
 In keeping with the concept of method
 overriding, most developers will assume that in the _Derived_ class, the
@@ -223,12 +139,12 @@
 defined in the different specifications should interact with
 inheritance:
 
- Class-level annotations only affect the
+. Class-level annotations only affect the
 class they annotate and its members, that is, its methods and fields.
 They never affect a member declared by a superclass, even if it is not
 hidden or overridden by the class in question.
 
-In addition to affecting the annotated class,
+. In addition to affecting the annotated class,
 class-level annotations may act as a shorthand for member-level
 annotations. If a member carries a specific member-level annotation, any
 annotations of the same type implied by a class-level annotation are
@@ -241,16 +157,15 @@
 then the _TransactionAttribute(NEVER)_ applies for that particular
 method and not _TransactionAttribute(REQUIRED)_ .
 
-The interfaces implemented by a class never
+. The interfaces implemented by a class never
 contribute annotations to the class itself or any of its members.
 
-Members inherited from a superclass and which
+. Members inherited from a superclass and which
 are not hidden or overridden maintain the annotations they had in the
 class that declared them, including member-level annotations implied by
 class-level ones.
 
-Member-level annotations on a hidden or
-overridden member are always ignored.
+. Member-level annotations on a hidden or overridden member are always ignored.
 
 This set of guidelines guarantees that the
 effects of an annotation are local to the class on, or inside, which it
@@ -265,152 +180,82 @@
 guidelines defined above will be applied to the _TransactionAttribute_
 annotation.
 
-
-
+[source,java]
+----
 @TransactionAttribute(REQUIRED)
+class Base {
+    @TransactionAttribute(NEVER)
+    public void foo() {...}
 
-class Base \{
-
- @TransactionAttribute(NEVER)
-
- public void foo() \{...}
-
- public void bar() \{...}
-
+    public void bar() {...}
 }
 
-
-
 @Stateless
-
-class ABean extends Base \{
-
- public void foo() \{...}
-
+class ABean extends Base {
+    public void foo() {...}
 }
 
-
-
 @Stateless
-
-public class BBean extends Base \{
-
- @TransactionAttribute(REQUIRES_NEW)
-
- public void foo() \{...}
-
+public class BBean extends Base {
+    @TransactionAttribute(REQUIRES_NEW)
+    public void foo() {...}
 }
 
-
-
 @Stateless
-
 @TransactionAttribute(REQUIRES_NEW)
-
-public class CBean extends Base \{
-
- public void foo() \{...}
-
- public void bar() \{...}
-
+public class CBean extends Base {
+    public void foo() {...}
+    public void bar() {...}
 }
 
-
-
 @Stateless
-
 @TransactionAttribute(REQUIRES_NEW)
-
-public class DBean extends Base \{
-
- public void bar() \{...}
-
+public class DBean extends Base {
+    public void bar() {...}
 }
 
-
-
 @Stateless
-
 @TransactionAttribute(REQUIRES_NEW)
-
-public class EBean extends Base \{
-
+public class EBean extends Base {
+    // ...
 }
-
-
+----
 
 The table below shows the effective
 _TransactionAttribute_ annotation in each of the cases above by applying
 the guidelines specified for annotations and inheritance:
 
+|===
+|Methods in derived classes |Effective TransactionAttribute value
+|foo() in ABean
+|TransactionAttribute(REQUIRED). (Default TransactionAttribute as defined by the EJB specification).
+|bar() in ABean
+|TransactionAttribute(REQUIRED)
+|foo() in BBean
+|TransactionAttribute(REQUIRES_NEW)
+|bar() in BBean
+|TransactionAttribute(REQUIRED)
+|foo() in CBean
+|TransactionAttribute(REQUIRES_NEW)
+|bar() in CBean
+|TransactionAttribute(REQUIRES_NEW)
+|foo() in DBean
+|TransactionAttribute(NEVER) (from Base class)
+|bar() in DBean
+|TransactionAttribute(REQUIRES_NEW)
+|foo() in EBean
+|TransactionAttribute(NEVER) (from Base class)
+|bar() in EBean
+|TransactionAttribute(REQUIRED) (from Base class)
+|===
 
-
-
-
-===
-
-Methods in derived classes
-
-Effective TransactionAttribute value
-
- _foo() in ABean_
-
- _TransactionAttribute(REQUIRED). (Default
-TransactionAttribute as defined by the EJB specification)._
-
- _bar() in ABean_
-
- _TransactionAttribute(REQUIRED)_
-
- _foo() in BBean_
-
- _TransactionAttribute(REQUIRES_NEW)_
-
- _bar() in BBean_
-
- _TransactionAttribute(REQUIRED)_
-
- _foo() in CBean_
-
- _TransactionAttribute(REQUIRES_NEW)_
-
- _bar() in CBean_
-
- _TransactionAttribute(REQUIRES_NEW)_
-
- _foo() in DBean_
-
- _TransactionAttribute(NEVER) (from the Base
-class)_
-
- _bar() in DBean_
-
- _TransactionAttribute(REQUIRES_NEW)_
-
- _foo() in EBean_
-
- _TransactionAttribute(NEVER) (From Base
-class)_
-
- __
-
- _bar() in EBean_
-
- _TransactionAttribute(REQUIRED)(from Base
-class)_
-
-For more details about the
-_TransactionAttribute_ annotation, see the _EJB 3 Core Contracts_
+For more details about the _TransactionAttribute_ annotation, see the _EJB 3 Core Contracts_
 specification.
 
 All annotations defined in this specification
 follow the guidelines defined above unless explicitly stated otherwise.
 
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.Generated
+=== jakarta.annotation.Generated
 
 The _Generated_ annotation is used to mark
 source code that has been generated. It can be specified on a class,
@@ -427,7 +272,7 @@
 8601 standard. For example the _date_ element could have the following
 value:
 
- _2001-07-04T12:08:56.235-0700_
+    2001-07-04T12:08:56.235-0700
 
 which represents 2001-07-04 12:08:56 local
 time in the U.S. Pacific time zone.
@@ -436,84 +281,40 @@
 any comments that the code generator may want to include in the
 generated code.
 
+[source,java]
+----
+package jakarta.annotation;
 
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-package javax.annotation;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
-
-@Target(\{ANNOTATION_TYPE, CONSTRUCTOR,
-FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
-
+@Target({ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
 @Retention(SOURCE)
-
-public @interface Generated \{
-
- String[] value();
-
- String date() default "";
-
- String comments() default "";
-
+public @interface Generated {
+    String[] value();
+    String date() default "";
+    String comments() default "";
 }
+----
 
+|===
+|Element |Description |Default
+|value |Name of the code generator |
+|date |Date source was generated. MUST follow ISO 8601 standard |""
+|comments |placeholder for comments that the generator may want to include in the generated code |""
+|===
 
+The following example shows the usage of the annotation defined above:
 
-===
-
-Element
-
-Description
-
-Default
-
- _value_
-
-Name of the code generator
-
-
-
- _date_
-
-Date source was generated. MUST follow ISO
-8601 standard
-
-""
-
- _comments_
-
-placeholder for comments that the generator
-may want to include in the generated code
-
-""
-
-
-
-The following example shows the usage of the
-annotation defined above:
-
-
-
+[source,java]
+----
 @Generated("com.sun.xml.rpc.AProcessor")
-
-public interface StockQuoteService extends
-java.rmi.Remote \{
-
- this.context = context;
-
+public interface StockQuoteService extends java.rmi.Remote {
+    this.context = context;
 }
+----
 
-
-
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.Resource
+=== jakarta.annotation.Resource
 
 The _Resource_ annotation is used to declare
 a reference to a resource. It can be specified on a class, method, or
@@ -577,105 +378,51 @@
 of the referenced resource must be compatible with that of the resource
 being defined.
 
+[source,java]
+----
+package jakarta.annotation;
 
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-package javax.annotation;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
-
-@Target(\{TYPE, METHOD, FIELD})
-
+@Target({TYPE, METHOD, FIELD})
 @Retention(RUNTIME)
-
 @Repeatable(Resources.class)
+public @interface Resource {
+    public enum AuthenticationType {
+        CONTAINER,
+        APPLICATION
+    }
 
-public @interface Resource \{
+    String name() default "";
 
- public enum AuthenticationType \{
+    Class<?> type() default Object.class;
 
- CONTAINER,
+    AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
 
- APPLICATION
+    boolean shareable() default true;
 
- }
+    String mappedName() default "";
 
- String name() default "";
+    String description() default "";
 
- Class<?> type() default Object.class;
-
- AuthenticationType authenticationType()
-default AuthenticationType.CONTAINER;
-
- boolean shareable() default true;
-
- String mappedName() default "";
-
- String description() default "";
-
- String lookup() default "";
-
+    String lookup() default "";
 }
+----
 
 
+|===
+|Element |Description |Default
+|name |The JNDI name of the resource |""
+|type |The Java type of the resource |Object.class
+|authenticationType |The authentication type to use for the resource |CONTAINER
+|shareable |Indicates whether the resource can be shared. |true
+|mappedName |A product-specific name that the resource should map to. |""
+|description |Description of the resource. |""
+|lookup |the JNDI name of a resource that the resource being defined will be bound to |""
+|===
 
-===
-
-Element
-
-Description
-
-Default
-
- _name_
-
-The JNDI name of the resource
-
- _""_
-
- _type_
-
-The Java type of the resource
-
- _Object.class_
-
- _authenticationType_
-
-The authentication type to use for the
-resource
-
- _CONTAINER_
-
- _shareable_
-
-Indicates whether the resource can be shared.
-
- _true_
-
- _mappedName_
-
-A product-specific name that the resource
-should map to.
-
- _""_
-
- _description_
-
-Description of the resource.
-
- _""_
-
- _lookup_
-
-the JNDI name of a resource that the resource
-being defined will be bound to
-
- _""_
-
-=== Field based injection:
+==== Field based injection
 
 To access a resource a developer declares a
 field and annotates it as being a resource reference. If the name and
@@ -686,26 +433,26 @@
 
 For example:
 
-
-
+[source,java]
+----
 @Resource
-
 private DataSource myDB;
+----
 
 In the example above the effective name is
 _com.example.class/myDB_ and the effective type is
 _javax.sql.DataSource.class_ .
 
-
-
+[source,java]
+----
 @Resource(name="customerDB")
-
 private DataSource myDB;
+----
 
 In the example above the name is _customerDB_
 and the effective type is _javax.sql.DataSource.class_ .
 
-=== Setter based injection:
+==== Setter based injection
 
 To access a resource a developer declares a
 setter method and annotates it as being a resource reference. The name
@@ -720,34 +467,28 @@
 
 For example:
 
-
-
+[source,java]
+----
 @Resource
-
-private void setMyDB(DataSource ds) \{
-
- myDB = ds;
-
+private void setMyDB(DataSource ds) {
+    myDB = ds;
 }
 
 private DataSource myDB;
+----
 
 In the example above the effective name is
 _com.example.class/myDB_ and the type is _javax.sql.DataSource.class_ .
 
-
-
+[source,java]
+----
 @Resource(name="customerDB")
-
-private void setMyDB(DataSource ds) \{
-
- myDB = ds;
-
+private void setMyDB(DataSource ds) {
+    myDB = ds;
 }
 
 private DataSource myDB;
-
-
+----
 
 In the example above the name is _customerDB_
 and the type is _javax.sql.DataSource.class_ .
@@ -756,165 +497,77 @@
 type to the equivalent resource type in the Java EE 5 (and later)
 deployment descriptors:
 
-
-
-===
-
-[width="100%",cols="50%,50%",options="header",]
+[options="header"]
 |===
-|Java Type
-|Equivalent Resource type
-|java.lang.String
-|env-entry
-
-|java.lang.Character
-|env-entry
-
-|java.lang.Integer
-|env-entry
-
-|java.lang.Boolean
-|env-entry
-
-|java.lang.Double
-|env-entry
-
-|java.lang.Byte
-|env-entry
-
-|java.lang.Short
-|env-entry
-
-|java.lang.Long
-|env-entry
-
-|java.lang.Float
-|env-entry
-
-|javax.xml.rpc.Service
-|service-ref
-
-|javax.xml.ws.Service
-|service-ref
-
-|javax.jws.WebService
-|service-ref
-
-|javax.sql.DataSource
-|resource-ref
-
-|javax.jms.ConnectionFactory
-|resource-ref
-
-|javax.jms.QueueConnectionFactory
-|resource-ref
-
-|javax.jms.TopicConnectionFactory
-|resource-ref
-
-|javax.mail.Session
-|resource-ref
-
-|java.net.URL
-|resource-ref
-
-|javax.resource.cci.ConnectionFactory
-|resource-ref
-
-|org.omg.CORBA_2_3.ORB
-|resource-ref
-
-|any other connection factory defined by a
-resource adapter |resource-ref
-
-|javax.jms.Queue
-|message-destination-ref
-
-|javax.jms.Topic
-|message-destination-ref
-
-|javax.resource.cci.InteractionSpec
-|resource-env-ref
-
-|javax.transaction.UserTransaction
-|resource-env-ref
-
-|Everything else
-|resource-env-ref
+|Java Type |Equivalent Resource type
+|java.lang.String |env-entry
+|java.lang.Character |env-entry
+|java.lang.Integer |env-entry
+|java.lang.Boolean |env-entry
+|java.lang.Double |env-entry
+|java.lang.Byte |env-entry
+|java.lang.Short |env-entry
+|java.lang.Long |env-entry
+|java.lang.Float |env-entry
+|jakarta.xml.rpc.Service |service-ref
+|jakarta.xml.ws.Service |service-ref
+|jakarta.jws.WebService |service-ref
+|javax.sql.DataSource |resource-ref
+|jakarta.jms.ConnectionFactory |resource-ref
+|jakarta.jms.QueueConnectionFactory |resource-ref
+|jakarta.jms.TopicConnectionFactory |resource-ref
+|jakarta.mail.Session |resource-ref
+|java.net.URL |resource-ref
+|jakarta.resource.cci.ConnectionFactory |resource-ref
+|org.omg.CORBA_2_3.ORB |resource-ref
+|any other connection factory defined by a resource adapter |resource-ref
+|jakarta.jms.Queue |message-destination-ref
+|jakarta.jms.Topic |message-destination-ref
+|jakarta.resource.cci.InteractionSpec |resource-env-ref
+|jakarta.transaction.UserTransaction |resource-env-ref
+|Everything else |resource-env-ref
 |===
 
-
-
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.Resources
+=== jakarta.annotation.Resources
 
 The _Resource_ annotation is used to declare
 a reference to a resource. The _Resources_ annotation acts as a
 container for multiple resource declarations.
 
+[source,java]
+----
+package jakarta.annotation;
 
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-package javax.annotation;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
-
-@Target(\{TYPE})
-
+@Target({TYPE})
 @Retention(RUNTIME)
-
-public @interface Resources \{
-
- Resource[] value;
-
+public @interface Resources {
+    Resource[] value;
 }
+----
 
-===
+|===
+|Element |Description |Default
+|value |Container for defining multiple resources. |
+|===
 
-Element
+The following example shows the usage of the annotation defined above:
 
-Description
-
-Default
-
- _value_
-
-Container for defining multiple resources.
-
-
-
-
-
-The following example shows the usage of the
-annotation defined above:
-
-@Resources (\{
-
- @Resource(name="myDB"
-type=javax.sql.DataSource),
-
- @Resource(name="myMQ"
-type=javax.jms.ConnectionFactory)
-
+[source,java]
+----
+@Resources ({
+    @Resource(name="myDB", type=javax.sql.DataSource),
+    @Resource(name="myMQ", type=jakarta.jms.ConnectionFactory)
 })
 
-public class CalculatorBean \{
-
- //...
-
+public class CalculatorBean {
+    // ...
 }
+----
 
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.PostConstruct
+=== jakarta.annotation.PostConstruct
 
 The _PostConstruct_ annotation is used on a
 method that needs to be executed after dependency injection is done to
@@ -930,82 +583,56 @@
 
 - The method MUST NOT have any para meters.
 
-- The return type of the method MUST be
-_void_ .
+- The return type of the method MUST be _void_ .
 
-- The method MUST NOT throw a checked
-exception.
+- The method MUST NOT throw a checked exception.
 
 - The method on which _PostConstruct_ is
 applied MAY be _public_ , _protected_ , package private or _private_ .
 
-- The method MUST NOT be static except for
-the application client.
+- The method MUST NOT be static except for the application client.
 
 - In general, the method MUST NOT be final.
 However, other specifications are permitted to relax this requirement on
 a per-component basis.
 
-- If the method throws an unchecked exception
-the class MUST NOT be put into service.
+- If the method throws an unchecked exception the class MUST NOT be put into service.
 
+[source,java]
+----
+package jakarta.annotation;
 
-
-package javax.annotation;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
 @Target(METHOD)
-
 @Retention(RUNTIME)
-
-public @interface PostConstruct \{
+public @interface PostConstruct {
 
 }
+----
 
+The following example shows the usage of the annotation defined above:
 
-
-The following example shows the usage of the
-annotation defined above:
-
+[source,java]
+----
 @Resource
-
-private void setMyDB(DataSource ds) \{
-
- myDB = ds;
-
+private void setMyDB(DataSource ds) {
+    myDB = ds;
 }
 
-
-
 @PostConstruct
-
-private void initialize() \{
-
- //Initialize the connection object from the
-DataSource
-
- connection = myDB.getConnection();
-
+private void initialize() {
+    // Initialize the connection object from the DataSource
+    connection = myDB.getConnection();
 }
 
-
-
 private DataSource myDB;
-
 private Connection connection;
+----
 
 
-
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.PreDestroy
+=== jakarta.annotation.PreDestroy
 
 The _PreDestroy_ annotation is used on a
 method as a callback notification to signal that the instance is in the
@@ -1018,15 +645,11 @@
 requirements have been relaxed by another specification. See in
 particular the _Interceptors_ specification.
 
-
-
 - The method MUST NOT have any para meters.
 
-- The return type of the method MUST be
-_void_ .
+- The return type of the method MUST be _void_ .
 
-- The method MUST NOT throw a checked
-exception.
+- The method MUST NOT throw a checked exception.
 
 - The method on which _PreDestroy_ is applied
 MAY be _public_ , _protected_ , package private or _private_ .
@@ -1037,76 +660,48 @@
 However, other specifications are permitted to relax this requirement on
 a per-component basis.
 
-- If the method throws an unchecked exception
-it is ignored.
+- If the method throws an unchecked exception it is ignored.
 
+[source,java]
+----
+package jakarta.annotation;
 
-
-package javax.annotation;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
 @Target(METHOD)
-
 @Retention(RUNTIME)
-
-public @interface PreDestroy \{
+public @interface PreDestroy {
 
 }
+----
 
+The following example shows the usage of the annotation defined above:
 
-
-The following example shows the usage of the
-annotation defined above:
-
-
-
+[source,java]
+----
 @Resource
-
-private void setMyDB(DataSource ds) \{
-
- myDB = ds;
-
+private void setMyDB(DataSource ds) {
+    myDB = ds;
 }
 
-
-
 @PostConstruct
-
-private void initialize() \{
-
- //Initialize the connection object from the
-DataSource
-
- connection = myDB.getConnection();
-
+private void initialize() {
+    // Initialize the connection object from the DataSource
+    connection = myDB.getConnection();
 }
 
 @PreDestroy
-
-private void cleanup() \{
-
- //Close the connection to the DataSource.
-
- connection.close();
-
+private void cleanup() {
+    // Close the connection to the DataSource.
+    connection.close();
 }
 
-
-
 private DataSource myDB;
-
 private Connection connection;
+----
 
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.Priority
+=== jakarta.annotation.Priority
 
 The _Priority_ annotation can be applied to
 classes or parameters to indicate in what order they should be used. The
@@ -1123,108 +718,62 @@
 _Priority_ annotation may define the range of allowed priorities and any
 priority values with special meaning.
 
-
-
-package javax.annotation;
+[source,java]
+----
+package jakarta.annotation;
 
 import java.lang.annotation.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
-
-
-
-@Target(\{TYPE, PARAMETER})
-
+@Target({TYPE, PARAMETER})
 @Retention(RUNTIME)
-
 @Documented
-
-public @interface Priority \{
-
- /**
-
- * The priority value.
-
- */
-
- int value();
-
+public @interface Priority {
+     // The priority value.
+     int value();
 }
+----
 
-
-
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.security.RunAs
+=== jakarta.annotation.security.RunAs
 
 The _RunAs_ annotation defines the security
-role of the application during execution in a Java EE container. It can
+role of the application during execution in a Jakarta EE container. It can
 be specified on a class. This allows developers to execute an
 application under a particular role. The role MUST map to the user /
 group information in the container’s security realm. The _value_ element
 in the annotation is the name of a security role.
 
+[source,java]
+----
+package jakarta.annotation.security;
 
-
-package javax.annotation.security;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
 @Target(TYPE)
-
 @Retention(RUNTIME)
-
-public @interface RunAs \{
-
- String value();
-
+public @interface RunAs {
+    String value();
 }
+----
 
+|===
+|Element |Description |Default
+|value |Security role of the application during execution in a Jakarta EE container |
+|===
 
+The following example shows the usage of the annotation defined above:
 
-===
-
-Element
-
-Description
-
-Default
-
- _value_
-
-Security role of the application during
-execution in a Java EE container
-
-
-
-
-
-The following example shows the usage of the
-annotation defined above:
-
+[source,java]
+----
 @RunAs("Admin")
-
-public class Calculator \{
-
- //....
-
+public class Calculator {
+    // ...
 }
+----
 
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.security.RolesAllowed
+=== jakarta.annotation.security.RolesAllowed
 
 The _RolesAllowed_ annotation specifies the
 security roles permitted to access method(s) in an application. The
@@ -1238,65 +787,39 @@
 both the class and method level, the method value overrides the class
 value.
 
+[source,java]
+----
+package jakarta.annotation.security;
 
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-package javax.annotation.security;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
-
-@Target(\{TYPE,METHOD})
-
+@Target({TYPE,METHOD})
 @Retention(RUNTIME)
-
-public @interface RolesAllowed \{
-
- String[] value();
-
+public @interface RolesAllowed {
+    String[] value();
 }
+----
 
+|===
+|Element |Description |Default
+|value |List of roles permitted to access methods in the application |
+|===
 
+The following example shows the usage of the annotation defined above:
 
-===
-
-Element
-
-Description
-
-Default
-
- _value_
-
-List of roles permitted to access methods in
-the application
-
-
-
-
-
-The following example shows the usage of the
-annotation defined above:
-
+[source,java]
+----
 @RolesAllowed("Users")
-
-public class Calculator \{
-
- @RolesAllowed("Administrator")
-
- public void setNewRate(int rate) \{
-
- //...
-
+public class Calculator {
+    @RolesAllowed("Administrator")
+    public void setNewRate(int rate) {
+        // ...
+    }
 }
+----
 
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.security.PermitAll
+=== jakarta.annotation.security.PermitAll
 
 The _PermitAll_ annotation specifies that all
 security roles are allowed to invoke the specified method(s), that is,
@@ -1305,114 +828,82 @@
 all methods of the class. If specified at the method level, it only
 affects that method.
 
+[source,java]
+----
+package jakarta.annotation.security;
 
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-package javax.annotation.security;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
-
-@Target(\{TYPE,METHOD})
-
+@Target({TYPE,METHOD})
 @Retention(RUNTIME)
-
-public @interface PermitAll \{
+public @interface PermitAll {
 
 }
+----
 
-The following example shows the usage of the
-annotation defined above:
+The following example shows the usage of the annotation defined above:
 
-import javax.annotation.security.*;
+[source,java]
+----
+import jakarta.annotation.security.*;
 
 @RolesAllowed("Users")
+public class Calculator {
+    @RolesAllowed("Administrator")
+    public void setNewRate(int rate) {
+        // ...
+    }
 
-public class Calculator \{
-
- @RolesAllowed("Administrator")
-
- public void setNewRate(int rate) \{
-
- //...
-
- }
-
- @PermitAll
-
- public long convertCurrency(long amount) \{
-
- //...
-
- }
-
+    @PermitAll
+    public long convertCurrency(long amount) {
+        // ...
+    }
 }
+----
 
-
-
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.security.DenyAll
+=== jakarta.annotation.security.DenyAll
 
 The _DenyAll_ annotation specifies that no
 security roles are allowed to invoke the specified method(s), that is,
-that the method(s) are to be excluded from execution in the Java EE
+that the method(s) are to be excluded from execution in the Jakarta EE
 container.
 
+[source,java]
+----
+package jakarta.annotation.security;
 
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-package javax.annotation.security;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
-
-@Target(\{TYPE, METHOD})
-
+@Target({TYPE, METHOD})
 @Retention(RUNTIME)
-
-public @interface DenyAll \{
+public @interface DenyAll {
 
 }
+----
 
-The following example shows the usage of the
-annotation defined above:
+The following example shows the usage of the annotation defined above:
 
-import javax.annotation.security.*;
+[source,java]
+----
+import jakarta.annotation.security.*;
 
 @RolesAllowed("Users")
+public class Calculator {
+    @RolesAllowed("Administrator")
+    public void setNewRate(int rate) {
+        // ...
+    }
 
-public class Calculator \{
-
- @RolesAllowed("Administrator")
-
- public void setNewRate(int rate) \{
-
- //...
-
- }
-
- @DenyAll
-
- public long convertCurrency(long amount) \{
-
- //...
-
- }
-
+    @DenyAll
+    public long convertCurrency(long amount) {
+        // ...
+    }
 }
+----
 
-===
-
-image:annotations-8.png[image]
-
-PermitAll, DenyAll and RolesAllowed interactions
+=== PermitAll, DenyAll and RolesAllowed interactions
 
 The _PermitAll_ , _DenyAll_ and
 _RolesAllowed_ annotations all define which security roles are allowed
@@ -1426,11 +917,7 @@
 over any class level annotations of type _PermitAll_ , _DenyAll_ and
 _RolesAllowed_ .
 
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.security.DeclareRoles
+=== jakarta.annotation.security.DeclareRoles
 
 The _DeclareRoles_ annotation is used to
 specify security roles used by the application. It can be specified on a
@@ -1440,73 +927,42 @@
 implicitly declared as the result of their use in a _RolesAllowed_
 annotation on the class or a method of the class.
 
+[source,java]
+----
+package jakarta.annotation.security;
 
-
-package javax.annotation.security;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
 @Target(TYPE)
-
 @Retention(RUNTIME)
-
-public @interface DeclareRoles\{
-
- String[] value();
-
+public @interface DeclareRoles {
+    String[] value();
 }
+----
 
+|===
+|Element |Description |Default
+|value |List of security roles specified by the application |
+|===
 
+The following example shows the usage of the annotation defined above:
 
-===
-
-Element
-
-Description
-
-Default
-
- _value_
-
-List of security roles specified by the
-application
-
-
-
-
-
-The following example shows the usage of the
-annotation defined above:
-
+[source,java]
+----
 @DeclareRoles("BusinessAdmin")
+public class Calculator {
+    public void convertCurrency() {
+        if (x.isUserInRole("BusinessAdmin")) {
+            // ...
+        }
+    }
 
-public class Calculator \{
-
- public void convertCurrency() \{
-
- if(x.isUserInRole("BusinessAdmin")) \{
-
- //....
-
- }
-
- }
-
- //...
-
+    // ...
 }
+----
 
-
-
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.sql.DataSourceDefinition
+=== jakarta.annotation.sql.DataSourceDefinition
 
 The _DataSourceDefinition_ annotation is used
 to define a container _DataSource_ to be registered with JNDI. The
@@ -1514,7 +970,7 @@
 commonly-used _DataSource_ properties. Additional standard and
 vendor-specific properties may be specified using the _properties_
 element. The data source will be registered under the name specified in
-the _name_ element. It may be defined to be in any valid Java EE
+the _name_ element. It may be defined to be in any valid Jakarta EE
 namespace, which will determine the accessibility of the data source
 from other components. A JDBC driver implementation class of the
 appropriate type, either _DataSource_ , _ConnectionPoolDataSource_ , or
@@ -1538,7 +994,7 @@
 with or used to override standard data source properties defined using
 this annotation.
 
- _DataSource_ properties that are specified
+_DataSource_ properties that are specified
 and are not supported in a given configuration or cannot be mapped to a
 vendor-specific configuration property may be ignored.
 
@@ -1547,288 +1003,140 @@
 The _password_ element in the annotation is provided as a convenience
 for ease of development.
 
-
-
-package javax.annotation.sql;
+[source,java]
+----
+package jakarta.annotation.sql;
 
 import java.lang.annotation.Target;
-
 import java.lang.annotation.Retention;
-
 import java.lang.annotation.ElementType;
-
 import java.lang.annotation.RetentionPolicy;
 
-@Target(\{ElementType.TYPE})
-
+@Target({ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
-
 @Repeatable(DataSourceDefinitions.class)
-
-public @interface DataSourceDefinition \{
-
- String name();
-
- String className();
-
- String description() default "";
-
- String url() default "";
-
- String user() default "";
-
- String password() default "";
-
- String databaseName() default "";
-
- int portNumber() default -1;
-
- String serverName() default "localhost";
-
- int isolationLevel() default -1;
-
- boolean transactional() default true;
-
- int initialPoolSize() default -1;
-
- int maxPoolSize() default -1;
-
- int minPoolSize() default -1;
-
- int maxIdleTime() default -1;
-
- int maxStatements() default -1;
-
- String[] properties() default \{};
-
- int loginTimeout() default 0;
-
+public @interface DataSourceDefinition {
+    String name();
+    String className();
+    String description() default "";
+    String url() default "";
+    String user() default "";
+    String password() default "";
+    String databaseName() default "";
+    int portNumber() default -1;
+    String serverName() default "localhost";
+    int isolationLevel() default -1;
+    boolean transactional() default true;
+    int initialPoolSize() default -1;
+    int maxPoolSize() default -1;
+    int minPoolSize() default -1;
+    int maxIdleTime() default -1;
+    int maxStatements() default -1;
+    String[] properties() default \{};
+    int loginTimeout() default 0;
 }
-
-
-
-===
+----
 
 [width="100%",cols="34%,33%,33%",options="header",]
 |===
-|Element
-|Description
-|Default
-| _name_ |JNDI
-name by which the data source will be registered
-|
-
-| _className_
-|DataSource implementation class name
-|
-
-| _description_
-|Description of the data source
-|""
-
-| _url_ |A JDBC
-URL. If the url annotation element contains a DataSource property that
-was also specified using the corresponding annotation element, the
-precedence order is undefined and implementation specific.
-|""
-
-| _user_ |User
-name for connection authentications |""
-
-| _password_
-|Password for connection authentications
-|""
-
-| _databaseName_
-|Name of a database on a server
-|""
-
-| _portNumber_
-|Port number where a server is listening for
-requests |""
-
-| _serverName_
-|Database server name
-|"localhost"
-
-| _isolationLevel_
-|Isolation level for connections.
-|-1 (vendor specific)
-
-| _transactional_
-|Indicates whether a connection is
-transactional or not |true
-
-| _initialPoolSize_
-|Number of connections that should be created
-when a connection pool is initialized |-1
-(vendor specific)
-
-| _maxPoolSize_
-|Maximum number of connections that should be
-concurrently allocated for a connection pool
-|-1 (vendor specific)
-
-| _minPoolSize_
-|Minimum number of connections that should be
-allocated for a connection pool |-1 (vendor
-specific)
-
-| _maxIdleTime_
-|The number of seconds that a physical
-connection should remain unused in the pool before the connection is
-closed for a connection pool |-1 (vendor
-specific)
-
-| _maxStatements_
-|The total number of statements that a
-connection pool should keep open. A value of 0 indicates that the
-caching of statements is disabled for a connection pool
-|-1 (vendor specific)
-
-| _properties_
-|Used to specify vendor-specific properties
-and less commonly used _DataSource_ properties. If a _DataSource_
-property is specified in the properties element and the annotation
-element for the property is also specified, the annotation element value
-takes precedence. |\{}
-
-| _loginTimeout_
-|The maximum time in seconds that this data
-source will wait while attempting to connect to a database. A value of 0
-specifies that the timeout is the default system timeout if there is
-one, otherwise it specifies that there is no timeout
-|0
+|Element |Description |Default
+| _name_ |JNDI name by which the data source will be registered |
+| _className_ |DataSource implementation class name |
+| _description_ |Description of the data source |""
+| _url_ |A JDBC URL. If the url annotation element contains a DataSource property that was also specified using the corresponding annotation element, the precedence order is undefined and implementation specific. |""
+| _user_ |User name for connection authentications |""
+| _password_ |Password for connection authentications |""
+| _databaseName_ |Name of a database on a server |""
+| _portNumber_ |Port number where a server is listening for requests |""
+| _serverName_ |Database server name |"localhost"
+| _isolationLevel_ |Isolation level for connections. |-1 (vendor specific)
+| _transactional_ |Indicates whether a connection is transactional or not |true
+| _initialPoolSize_ |Number of connections that should be created when a connection pool is initialized |-1 (vendor specific)
+| _maxPoolSize_ |Maximum number of connections that should be concurrently allocated for a connection pool |-1 (vendor specific)
+| _minPoolSize_ |Minimum number of connections that should be allocated for a connection pool |-1 (vendor specific)
+| _maxIdleTime_ |The number of seconds that a physical connection should remain unused in the pool before the connection is closed for a connection pool |-1 (vendor specific)
+| _maxStatements_ |The total number of statements that a connection pool should keep open. A value of 0 indicates that the caching of statements is disabled for a connection pool |-1 (vendor specific)
+| _properties_ |Used to specify vendor-specific properties and less commonly used _DataSource_ properties. If a _DataSource_ property is specified in the properties element and the annotation element for the property is also specified, the annotation element value takes precedence. |\{}
+| _loginTimeout_ |The maximum time in seconds that this data source will wait while attempting to connect to a database. A value of 0 specifies that the timeout is the default system timeout if there is one, otherwise it specifies that there is no timeout |0
 |===
 
-
-
 Examples:
 
+[source,java]
+----
+@DataSourceDefinition(
+    name="java:global/MyApp/MyDataSource",
+    className="com.foobar.MyDataSource",
+    portNumber=6689,
+    serverName="myserver.com",
+    user="lance",
+    password="secret")
 
-
-@DataSourceDefinition(name="java:global/MyApp/MyDataSource",
-
- className="com.foobar.MyDataSource",
-
- portNumber=6689,
-
- serverName="myserver.com",
-
- user="lance",
-
- password="secret")
-
-
+----
 
 Using a URL:
 
+[source,java]
+----
+@DataSourceDefinition(
+    name="java:global/MyApp/MyDataSource",
+    className="org.apache.derby.jdbc.ClientDataSource",
+    url="jdbc:derby://localhost:1527/myDB",
+    user="lance",
+    password="secret")
+----
 
-
-@DataSourceDefinition(name="java:global/MyApp/MyDataSource",
-
-
-className="org.apache.derby.jdbc.ClientDataSource",
-
- url="jdbc:derby://localhost:1527/myDB",
-
- user="lance",
-
- password="secret")
-
-
-
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.sql.DataSourceDefinitions
+=== jakarta.annotation.sql.DataSourceDefinitions
 
 The _DataSourceDefinition_ annotation is used
 to declare a container _DataSource_ . The _DataSourceDefinitions_
 annotation acts as a container for multiple data source declarations.
 
-
-
-package javax.annotation.sql;
+[source,java]
+----
+package jakarta.annotation.sql;
 
 import java.lang.annotation.Target;
-
 import java.lang.annotation.Retention;
-
 import java.lang.annotation.ElementType;
-
 import java.lang.annotation.RetentionPolicy;
 
-@Target(\{ElementType.TYPE})
-
+@Target({ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
-
-public @interface DataSourceDefinitions \{
-
- DataSourceDefinition[] value ();
-
+public @interface DataSourceDefinitions {
+    DataSourceDefinition[] value ();
 }
+----
 
+|===
+|Element |Description |Default
+|value |Container for defining multiple data sources. |
+|===
 
+The following example shows the usage of the annotation defined above:
 
-===
+[source,java]
+----
+@DataSourceDefinitions ({
+    @DataSourceDefinition(name="java:global/MyApp/MyDataSource",
+        className="com.foobar.MyDataSource",
+        portNumber=6689,
+        serverName="myserver.com",
+        user="lance",
+        password="secret"),
 
-Element
-
-Description
-
-Default
-
- _value_
-
-Container for defining multiple data sources.
-
-
-
-
-
-The following example shows the usage of the
-annotation defined above:
-
-@DataSourceDefinitions (\{
-
-@DataSourceDefinition(name="java:global/MyApp/MyDataSource",
-
- className="com.foobar.MyDataSource",
-
- portNumber=6689,
-
- serverName="myserver.com",
-
- user="lance",
-
- password="secret")
-
-@DataSourceDefinition(name="java:global/MyApp/MyDataSource",
-
-
-className="org.apache.derby.jdbc.ClientDataSource",
-
- url="jdbc:derby://localhost:1527/myDB",
-
- user="lance",
-
- password="secret")
-
+    @DataSourceDefinition(name="java:global/MyApp/MyDataSource",
+        className="org.apache.derby.jdbc.ClientDataSource",
+        url="jdbc:derby://localhost:1527/myDB",
+        user="lance",
+        password="secret")
 })
-
-public class CalculatorBean \{
-
- //...
-
+public class CalculatorBean {
+    // ...
 }
+----
 
-===
-
-image:annotations-8.png[image]
-
-javax.annotation.ManagedBean
+=== jakarta.annotation.ManagedBean
 
 The _ManagedBean_ annotation is used to
 declare a Managed Bean as specified in the _Managed Beans_
@@ -1837,67 +1145,36 @@
 callbacks and interceptors. A Managed Bean may optionally have a name, a
 _String_ specified via the _value_ element.
 
+[source,java]
+----
+package jakarta.annotation;
 
-
-package javax.annotation;
-
-import static
-java.lang.annotation.ElementType.*;
-
-import static
-java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
 @Target(TYPE)
-
 @Retention(RUNTIME)
-
-public @interface ManagedBean \{
-
- boolean value() default "";
-
+public @interface ManagedBean {
+    boolean value() default "";
 }
+----
 
-}
-
-===
-
-Element
-
-Description
-
-Default
-
- _value_
-
-Name of the Managed Bean
-
-""
-
-
-
-
+|===
+|Element |Description |Default
+|value |Name of the Managed Bean |""
+|===
 
 Examples:
 
+[source,java]
+----
 @ManagedBean("cart")
-
-public class ShoppingCart \{
-
-...
-
-
-
+public class ShoppingCart {
+    // ...
 }
+----
 
-===
-
-===
-
-image:annotations-9.png[image]
-
-References
-
-image:annotations-10.png[image]
+== References
 
 JSR 175: A Metadata Facility for the Java
 Programming Language. http://jcp.org/en/jsr/detail?id=175
