diff --git a/README.md b/README.md
index 4f9fa58e4..c786ce0e6 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,7 @@ Javadocs are available on [javadoc.io](https://www.javadoc.io):
- [cloudevents-api](https://www.javadoc.io/doc/io.cloudevents/cloudevents-api)
- [cloudevents-core](https://www.javadoc.io/doc/io.cloudevents/cloudevents-core)
+- [cloudevents-avro-compact](https://www.javadoc.io/doc/io.cloudevents/cloudevents-avro-compact)
- [cloudevents-json-jackson](https://www.javadoc.io/doc/io.cloudevents/cloudevents-json-jackson)
- [cloudevents-protobuf](https://www.javadoc.io/doc/io.cloudevents/cloudevents-protobuf)
- [cloudevents-xml](https://www.javadoc.io/doc/io.cloudevents/cloudevents-xml)
diff --git a/core/src/main/java/io/cloudevents/core/format/ContentType.java b/core/src/main/java/io/cloudevents/core/format/ContentType.java
index 1d8656393..c5b19f883 100644
--- a/core/src/main/java/io/cloudevents/core/format/ContentType.java
+++ b/core/src/main/java/io/cloudevents/core/format/ContentType.java
@@ -45,6 +45,10 @@ public enum ContentType {
* The content type for transports sending cloudevents in the protocol buffer format.
*/
PROTO("application/cloudevents+protobuf"),
+ /**
+ * The content type for transports sending cloudevents in the compact Avro format.
+ */
+ AVRO_COMPACT("application/cloudevents+avrocompact"),
/**
* The content type for transports sending cloudevents in XML format.
*/
diff --git a/docs/avro.md b/docs/avro.md
new file mode 100644
index 000000000..0b98fa8f0
--- /dev/null
+++ b/docs/avro.md
@@ -0,0 +1,49 @@
+---
+title: CloudEvents Avro Compact
+nav_order: 4
+---
+
+# CloudEvents Avro Compact
+
+[![Javadocs](http://www.javadoc.io/badge/io.cloudevents/cloudevents-avro-compact.svg?color=green)](http://www.javadoc.io/doc/io.cloudevents/cloudevents-avro-compact)
+
+This module provides the Avro Compact `EventFormat` implementation.
+
+# Setup
+For Maven based projects, use the following dependency:
+
+```xml
+
+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *
+ * http://www.apache.org/licenses/LICENSE-2.0 + *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package io.cloudevents.avro.compact;
+
+
+import io.cloudevents.CloudEvent;
+import io.cloudevents.CloudEventData;
+import io.cloudevents.core.builder.CloudEventBuilder;
+import io.cloudevents.core.data.BytesCloudEventData;
+import io.cloudevents.core.format.EventDeserializationException;
+import io.cloudevents.core.format.EventFormat;
+import io.cloudevents.core.format.EventSerializationException;
+import io.cloudevents.rw.CloudEventDataMapper;
+import io.cloudevents.v1.avro.compact.CloudEvent.Builder;
+
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.time.Instant;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * An implementation of {@link EventFormat} for the Avro Compact format.
+ * This format is resolvable with {@link io.cloudevents.core.provider.EventFormatProvider} using the content type {@link #AVRO_COMPACT_CONTENT_TYPE}.
+ */
+public class AvroCompactFormat implements EventFormat {
+
+ public static final String AVRO_COMPACT_CONTENT_TYPE = "application/cloudevents+avrocompact";
+
+ @Override
+ public byte[] serialize(CloudEvent from) throws EventSerializationException {
+ try {
+ Builder to = io.cloudevents.v1.avro.compact.CloudEvent.newBuilder();
+
+ // extensions
+ Map
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package io.cloudevents.avro.compact;
+
+import io.cloudevents.CloudEvent;
+import io.cloudevents.core.builder.CloudEventBuilder;
+import io.cloudevents.core.data.BytesCloudEventData;
+import io.cloudevents.core.format.EventFormat;
+import io.cloudevents.core.provider.EventFormatProvider;
+import org.junit.jupiter.api.Test;
+
+import java.net.URI;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.util.Collections;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class AvroCompactFormatTest {
+
+ private final EventFormat format = EventFormatProvider.getInstance().resolveFormat(AvroCompactFormat.AVRO_COMPACT_CONTENT_TYPE);
+
+ @Test
+ void format() {
+ assertNotNull(format);
+ assertEquals(Collections.singleton("application/cloudevents+avrocompact"), format.deserializableContentTypes());
+
+ CloudEvent event = CloudEventBuilder.v1()
+ // mandatory
+ .withId("")
+ .withSource(URI.create(""))
+ .withType("")
+ // optional
+ .withTime(Instant.EPOCH.atOffset(ZoneOffset.UTC))
+ .withSubject("")
+ .withDataSchema(URI.create(""))
+ // extension
+ // support boolean, int, long, string, bytes
+ .withExtension("boolean", false)
+ .withExtension("int", 0)
+ .withExtension("time", Instant.EPOCH.atOffset(ZoneOffset.UTC))
+ .withExtension("string", "")
+ // omitting bytes, because it is not supported by CloudEvent.equals
+ .withData("", BytesCloudEventData.wrap(new byte[0]))
+ .build();
+
+ byte[] serialized = format.serialize(event);
+
+ assertNotNull(serialized);
+
+ CloudEvent deserialized = format.deserialize(serialized);
+
+ assertEquals(event, deserialized);
+
+ byte[] reserialized = format.serialize(deserialized);
+
+ assertArrayEquals(serialized, reserialized);
+
+
+ }
+}
diff --git a/pom.xml b/pom.xml
index 15e307b74..252f9d4c3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,6 +68,7 @@