diff --git a/changelog.txt b/changelog.txt
index c98f112ae03369bab5a71c8e2454cfe439401f4d..6b6532c4595af1b0d63b7f7965c6f1d0e00d7526 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,9 @@
 # Changelog
 
+## [2.0.3] - 2020-06-22
+### Added
+- css class in JSON renderer
+
 ## 2.0.2 - 2020-06-17
 ### Changed
 - Skip saving empty keys in the PersistentContainer
diff --git a/src/Field.php b/src/Field.php
index e3a26e94326ac2ff8dd0b42da0cbe702a27ce41a..458bb386815097e0262bff46d4c8fcbdd0fd1f03 100644
--- a/src/Field.php
+++ b/src/Field.php
@@ -2,6 +2,8 @@
 
 namespace WPDesk\Forms;
 
+use WPDesk\Forms\Field\BasicField;
+
 /**
  * The idea is that from the moment the factory returns this interface it's values cannot be changed.
  * And that is why here are only the getters.
@@ -116,6 +118,29 @@ interface Field {
 	/** @return bool */
 	public function is_class_set( $name );
 
+	/** bool */
+	public function has_data();
+
+	/**
+	 * @return array
+	 */
+	public function get_data();
+
+	/**
+	 * @param string $data_name
+	 * @param string $data_value
+	 *
+	 * @return $this
+	 */
+	public function add_data( $data_name, $data_value );
+
+	/**
+	 * @param string $data_name
+	 *
+	 * @return $this
+	 */
+	public function unset_data( $data_name );
+
 	/**
 	 * @return mixed
 	 */
diff --git a/src/Field/BasicField.php b/src/Field/BasicField.php
index 02004ff3148c313352a7d34173cd555c49fb5478..8bd59511a674d4efbcfde0192f5b6de185d146fd 100644
--- a/src/Field/BasicField.php
+++ b/src/Field/BasicField.php
@@ -137,6 +137,17 @@ abstract class BasicField implements Field {
 		return ! empty( $this->meta['class'] );
 	}
 
+	public function has_data() {
+		return ! empty( $this->meta['data'] );
+	}
+
+	/**
+	 * @return array
+	 */
+	public function get_data() {
+		return empty( $this->meta['data'] ) ? [] : $this->meta['data'];
+	}
+
 	public function get_possible_values() {
 		return isset( $this->meta['possible_values'] ) ? $this->meta['possible_values'] : [];
 	}
@@ -210,6 +221,32 @@ abstract class BasicField implements Field {
 		return $this;
 	}
 
+	/**
+	 * @param string $data_name
+	 * @param string $data_value
+	 *
+	 * @return $this
+	 */
+	public function add_data( $data_name, $data_value ) {
+		if ( !isset( $this->meta['data'] ) ) {
+			$this->meta['data'] = [];
+		}
+		$this->meta['data'][ $data_name ] = $data_value;
+
+		return $this;
+	}
+
+	/**
+	 * @param string $data_name
+	 *
+	 * @return $this
+	 */
+	public function unset_data( $data_name ) {
+		unset( $this->meta['data'][ $data_name ] );
+
+		return $this;
+	}
+
 	/**
 	 * @param $name
 	 * @param $value
diff --git a/src/Renderer/JsonNormalizedRenderer.php b/src/Renderer/JsonNormalizedRenderer.php
index 175fe70cbab72312a118f294ed419b09d5bd0c0f..2f0c1c379897a4f708bcd338c0c6dba95ee676ac 100644
--- a/src/Renderer/JsonNormalizedRenderer.php
+++ b/src/Renderer/JsonNormalizedRenderer.php
@@ -32,6 +32,9 @@ class JsonNormalizedRenderer implements FieldRenderer {
 				'value '   => isset( $fields_data[ $field->get_name() ] ) ? $fields_data[ $field->get_name() ] : $field->get_default_value()
 			];
 
+			if ( $field->has_classes() ) {
+				$rendered['class'] = $field->get_classes();
+			}
 			if ( $field->has_description() ) {
 				$rendered['description'] = $field->get_description();
 			}
@@ -45,6 +48,17 @@ class JsonNormalizedRenderer implements FieldRenderer {
 			if ( $options ) {
 				$rendered['options'] = $options;
 			}
+			if ( $field->has_data() ) {
+				$data = $field->get_data();
+				$rendered['data'] = [];
+				foreach ( $data as $data_name => $data_value ) {
+					$rendered['data'][] = [
+						'name'  => $data_name,
+						'value' => $data_value,
+					];
+				}
+			}
+
 			$rendered_fields[] = $rendered;
 		}