diff --git a/SDT/schema4.0/etc/domain.rnc b/SDT/schema4.0/etc/domain.rnc
index fc43f18e933d4c75f045adad30caf89fabfdf881..948cf751ad71f83a5d28634928f7c63169d0b961 100644
--- a/SDT/schema4.0/etc/domain.rnc
+++ b/SDT/schema4.0/etc/domain.rnc
@@ -16,25 +16,9 @@ Domain =
     DocDef,
     element Imports { Domain+ }?,
     element DataTypes { DataTypeDef+ }?,
-    ModuleClasses?,
-    element DeviceClasses {
-      element DeviceClass {
-        attribute id { xsd:Name },
-        attribute semanticURI { xsd:anyURI }?,
-        DocDef,
-        PropertiesDef?,
-        ModuleClasses?,
-        element SubDevices {
-          element SubDevice {
-            attribute id { xsd:Name },
-            attribute semanticURI { xsd:anyURI }?,
-            DocDef,
-            PropertiesDef?,
-            ModuleClasses?
-          }+
-        }?
-      }+
-    }?
+    ModuleClassesDef?,
+    DeviceClassesDef?,
+    ProductsDef?
   }
 PropertiesDef =
   element Properties {
@@ -53,7 +37,7 @@ DataTypeDef =
     attribute unitOfMeasure { text }?,
     attribute semanticURI { xsd:anyURI }?,
     DocDef,
-    (ExtendDef | (StructType | ArrayType | SimpleType | EnumType)),
+    (ExtendDef? | (StructType | ArrayType | SimpleType | EnumType)),
     ConstraintsDef?
   }
 StructType = element Struct { DataTypeDef+ }
@@ -109,20 +93,54 @@ DocDef =
            element caption { text }
          })*
   }?
-ModuleClasses =
+DeviceClassesDef =
+  element DeviceClasses {
+    element DeviceClass {
+      attribute id { xsd:Name },
+      attribute semanticURI { xsd:anyURI }?,
+      DocDef,
+      PropertiesDef?,
+      ModuleClassesDef?,
+      SubDevicesRef?
+    }+
+  }
+SubDevicesRef =
+  element SubDevices {
+    element SubDevice {
+      attribute id { xsd:Name },
+      attribute semanticURI { xsd:anyURI }?,
+      DocDef,
+      PropertiesDef?,
+      ModuleClassesDef?
+    }+
+  }
+ModuleClassesDef =
   element ModuleClasses {
     element ModuleClass {
       attribute name { xsd:Name },
       attribute optional { xsd:boolean }?,
       attribute semanticURI { xsd:anyURI }?,
       DocDef,
-      ExtendDef,
+      ExtendDef?,
       PropertiesDef?,
       Actions?,
       Data?,
       Events?
     }+
   }
+ProductsDef =
+  element Products {
+    element Product {
+      attribute id { xsd:Name },
+      attribute semanticURI { xsd:anyURI }?,
+      DocDef,
+      PropertiesDef?,
+      ModuleClassesDef?,
+      SubDevicesRef?,
+      element DeviceClass { ExtendDef },
+      ExtendDef?
+    }+
+  }
 Actions =
   element Actions {
     element Action {
@@ -181,7 +199,7 @@ ExtendDef =
          attribute name { xsd:Name },
          attribute type { ExtendType }
        })?
-  }?
+  }
 ExtendType =
   "action"
   | "datapoint"
diff --git a/SDT/schema4.0/src/domain.rng b/SDT/schema4.0/src/domain.rng
index 22f363d9a1f8c00666edea01c381c3a0a35605cd..e8b3a98def1397e9a0d6ddd09b094fe041dd04c7 100644
--- a/SDT/schema4.0/src/domain.rng
+++ b/SDT/schema4.0/src/domain.rng
@@ -49,53 +49,13 @@
 				</element>
 			</optional>
 			<optional>
-				<ref name="ModuleClasses"/>
+				<ref name="ModuleClassesDef"/>
 			</optional>
 			<optional>
-				<element name="DeviceClasses">
-					<oneOrMore>
-						<element name="DeviceClass">
-							<attribute name="id">
-								<data type="Name"/>
-							</attribute>
-							<optional>
-								<attribute name="semanticURI">
-									<data type="anyURI"/>
-								</attribute>
-							</optional>
-							<ref name="DocDef"/>
-							<optional>
-								<ref name="PropertiesDef"/>
-							</optional>
-							<optional>
-								<ref name="ModuleClasses"/>
-							</optional>
-							<optional>
-								<element name="SubDevices">
-									<oneOrMore>
-										<element name="SubDevice">
-											<attribute name="id">
-												<data type="Name"/>
-											</attribute>
-											<optional>
-												<attribute name="semanticURI">
-													<data type="anyURI"/>
-												</attribute>
-											</optional>
-											<ref name="DocDef"/>
-											<optional>
-												<ref name="PropertiesDef"/>
-											</optional>
-											<optional>
-												<ref name="ModuleClasses"/>
-											</optional>
-										</element>
-									</oneOrMore>
-								</element>
-							</optional>
-						</element>
-					</oneOrMore>
-				</element>
+				<ref name="DeviceClassesDef" />
+			</optional>
+			<optional>
+				<ref name="ProductsDef" />
 			</optional>
 		</element>
 	</define>
@@ -150,7 +110,9 @@
 			</optional>
 			<ref name="DocDef"/>
 			<choice>
-				<ref name="ExtendDef" />
+				<optional>
+					<ref name="ExtendDef" />
+				</optional>
 				<choice>
 					<ref name="StructType" />
 					<ref name="ArrayType" />
@@ -312,7 +274,60 @@
 	</define>
 
 
-	<define name="ModuleClasses">
+	<define name="DeviceClassesDef">
+		<element name="DeviceClasses">
+			<oneOrMore>
+				<element name="DeviceClass">
+					<attribute name="id">
+						<data type="Name"/>
+					</attribute>
+					<optional>
+						<attribute name="semanticURI">
+							<data type="anyURI"/>
+						</attribute>
+					</optional>
+					<ref name="DocDef"/>
+					<optional>
+						<ref name="PropertiesDef"/>
+					</optional>
+					<optional>
+						<ref name="ModuleClassesDef"/>
+					</optional>
+					<optional>
+						<ref name="SubDevicesRef" />
+					</optional>
+				</element>
+			</oneOrMore>
+		</element>
+	</define>
+
+
+	<define name="SubDevicesRef">
+		<element name="SubDevices">
+			<oneOrMore>
+				<element name="SubDevice">
+					<attribute name="id">
+						<data type="Name"/>
+					</attribute>
+					<optional>
+						<attribute name="semanticURI">
+							<data type="anyURI"/>
+						</attribute>
+					</optional>
+					<ref name="DocDef"/>
+					<optional>
+						<ref name="PropertiesDef"/>
+					</optional>
+					<optional>
+						<ref name="ModuleClassesDef"/>
+					</optional>
+				</element>
+			</oneOrMore>
+		</element>
+	</define>
+
+
+	<define name="ModuleClassesDef">
 		<element name="ModuleClasses">
 			<oneOrMore>
 				<element name="ModuleClass">
@@ -330,7 +345,9 @@
 						</attribute>
 					</optional>
 					<ref name="DocDef"/>
-					<ref name="ExtendDef" />
+					<optional>
+						<ref name="ExtendDef" />
+					</optional>
 					<optional>
 						<ref name="PropertiesDef"/>
 					</optional>
@@ -349,6 +366,40 @@
 	</define>
 
 
+	<define name="ProductsDef">
+		<element name="Products">
+			<oneOrMore>
+				<element name="Product">
+					<attribute name="id">
+						<data type="Name"/>
+					</attribute>
+					<optional>
+						<attribute name="semanticURI">
+							<data type="anyURI"/>
+						</attribute>
+					</optional>
+					<ref name="DocDef"/>
+					<optional>
+						<ref name="PropertiesDef"/>
+					</optional>
+					<optional>
+						<ref name="ModuleClassesDef"/>
+					</optional>
+					<optional>
+						<ref name="SubDevicesRef" />
+					</optional>
+					<element name="DeviceClass">
+						<ref name="ExtendDef" />
+					</element>
+					<optional>
+						<ref name="ExtendDef" />
+					</optional>
+				</element>
+			</oneOrMore>
+		</element>
+	</define>
+
+
 	<define name="Actions">
 		<element name="Actions">
 			<oneOrMore>
@@ -482,7 +533,6 @@
 
 
 	<define name="ExtendDef">
-		<optional>
 			<element name="Extend">
 				<attribute name="domain">
 					<data type="Name"/>
@@ -511,7 +561,6 @@
 					</choice>
 				</optional>
 			</element>
-		</optional>
 	</define>
 
 
diff --git a/SDT/schema4.0/src/domain.xsd b/SDT/schema4.0/src/domain.xsd
index 2094a78750417011f5b9c44bd0b2f1fca68f5739..f0c20b3c92da5e3be0fcaaa6fa1fc536db8faadf 100644
--- a/SDT/schema4.0/src/domain.xsd
+++ b/SDT/schema4.0/src/domain.xsd
@@ -24,6 +24,7 @@
             <xs:element minOccurs="0" ref="DataTypes"/>
             <xs:element minOccurs="0" ref="ModuleClasses"/>
             <xs:element minOccurs="0" ref="DeviceClasses"/>
+            <xs:element minOccurs="0" ref="Products"/>
           </xs:sequence>
           <xs:attribute ref="xml:base"/>
           <xs:attribute name="id" use="required" type="xs:Name"/>
@@ -46,49 +47,6 @@
       </xs:sequence>
     </xs:complexType>
   </xs:element>
-  <xs:element name="DeviceClasses">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element maxOccurs="unbounded" ref="DeviceClass"/>
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="DeviceClass">
-    <xs:complexType>
-      <xs:complexContent>
-        <xs:extension base="DocDef">
-          <xs:sequence>
-            <xs:element minOccurs="0" ref="Properties"/>
-            <xs:element minOccurs="0" ref="ModuleClasses"/>
-            <xs:element minOccurs="0" ref="SubDevices"/>
-          </xs:sequence>
-          <xs:attribute name="id" use="required" type="xs:Name"/>
-          <xs:attribute name="semanticURI" type="xs:anyURI"/>
-        </xs:extension>
-      </xs:complexContent>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="SubDevices">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element maxOccurs="unbounded" ref="SubDevice"/>
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="SubDevice">
-    <xs:complexType>
-      <xs:complexContent>
-        <xs:extension base="DocDef">
-          <xs:sequence>
-            <xs:element minOccurs="0" ref="Properties"/>
-            <xs:element minOccurs="0" ref="ModuleClasses"/>
-          </xs:sequence>
-          <xs:attribute name="id" use="required" type="xs:Name"/>
-          <xs:attribute name="semanticURI" type="xs:anyURI"/>
-        </xs:extension>
-      </xs:complexContent>
-    </xs:complexType>
-  </xs:element>
   <xs:element name="Properties">
     <xs:complexType>
       <xs:sequence>
@@ -117,7 +75,7 @@
         <xs:extension base="DocDef">
           <xs:sequence>
             <xs:choice>
-              <xs:group ref="ExtendDef"/>
+              <xs:element minOccurs="0" ref="Extend"/>
               <xs:choice>
                 <xs:element ref="Struct"/>
                 <xs:element ref="Array"/>
@@ -250,6 +208,48 @@
     </xs:complexType>
   </xs:element>
   <xs:element name="caption" type="xs:string"/>
+  <xs:element name="DeviceClasses">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" name="DeviceClass">
+          <xs:complexType>
+            <xs:complexContent>
+              <xs:extension base="DocDef">
+                <xs:sequence>
+                  <xs:element minOccurs="0" ref="Properties"/>
+                  <xs:element minOccurs="0" ref="ModuleClasses"/>
+                  <xs:element minOccurs="0" ref="SubDevices"/>
+                </xs:sequence>
+                <xs:attribute name="id" use="required" type="xs:Name"/>
+                <xs:attribute name="semanticURI" type="xs:anyURI"/>
+              </xs:extension>
+            </xs:complexContent>
+          </xs:complexType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="SubDevices">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="SubDevice"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="SubDevice">
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:extension base="DocDef">
+          <xs:sequence>
+            <xs:element minOccurs="0" ref="Properties"/>
+            <xs:element minOccurs="0" ref="ModuleClasses"/>
+          </xs:sequence>
+          <xs:attribute name="id" use="required" type="xs:Name"/>
+          <xs:attribute name="semanticURI" type="xs:anyURI"/>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
   <xs:element name="ModuleClasses">
     <xs:complexType>
       <xs:sequence>
@@ -262,7 +262,7 @@
       <xs:complexContent>
         <xs:extension base="DocDef">
           <xs:sequence>
-            <xs:group ref="ExtendDef"/>
+            <xs:element minOccurs="0" ref="Extend"/>
             <xs:element minOccurs="0" ref="Properties"/>
             <xs:element minOccurs="0" ref="Actions"/>
             <xs:element minOccurs="0" ref="Data"/>
@@ -275,6 +275,36 @@
       </xs:complexContent>
     </xs:complexType>
   </xs:element>
+  <xs:element name="Products">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="Product"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="Product">
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:extension base="DocDef">
+          <xs:sequence>
+            <xs:element minOccurs="0" ref="Properties"/>
+            <xs:element minOccurs="0" ref="ModuleClasses"/>
+            <xs:element minOccurs="0" ref="SubDevices"/>
+            <xs:element name="DeviceClass">
+              <xs:complexType>
+                <xs:sequence>
+                  <xs:element ref="Extend"/>
+                </xs:sequence>
+              </xs:complexType>
+            </xs:element>
+            <xs:element minOccurs="0" ref="Extend"/>
+          </xs:sequence>
+          <xs:attribute name="id" use="required" type="xs:Name"/>
+          <xs:attribute name="semanticURI" type="xs:anyURI"/>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
   <xs:element name="Actions">
     <xs:complexType>
       <xs:sequence>
@@ -365,11 +395,6 @@
       </xs:complexContent>
     </xs:complexType>
   </xs:element>
-  <xs:group name="ExtendDef">
-    <xs:sequence>
-      <xs:element minOccurs="0" ref="Extend"/>
-    </xs:sequence>
-  </xs:group>
   <xs:element name="Extend">
     <xs:complexType>
       <xs:choice minOccurs="0">
diff --git a/SDT/schema4.0/test/deviceClass-test.xml b/SDT/schema4.0/test/deviceClass-test.xml
index 3720e2a45bd0ea82829b4fb752c635bd60ca089a..acecbc8cd76b864f5eae6f45b640072fad6bdea0 100644
--- a/SDT/schema4.0/test/deviceClass-test.xml
+++ b/SDT/schema4.0/test/deviceClass-test.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<Domain xmlns="http://homegatewayinitiative.org/xml/dal/4.0" xmlns:xi="http://www.w3.org/2001/XInclude" id="deviceClass-test" >
+<Domain xmlns="http://homegatewayinitiative.org/xml/dal/4.0" xmlns:xi="http://www.w3.org/2001/XInclude" id="deviceClass.test" >
 	<Imports>
 		<xi:include href="./dal-core.xml" parse="xml"/>
 	</Imports>
diff --git a/SDT/schema4.0/test/product-test.xml b/SDT/schema4.0/test/product-test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..99250ad3a139c49600b2c31aecf5b7759ff2535d
--- /dev/null
+++ b/SDT/schema4.0/test/product-test.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<Domain xmlns="http://homegatewayinitiative.org/xml/dal/4.0" xmlns:xi="http://www.w3.org/2001/XInclude" id="deviceClass-test" >
+	<Products>
+		<Product id="TestProduct" semanticURI="http://example.com/TestProduct.rdf">
+			<Doc>This is a test product</Doc>
+			<Properties>
+				<Property name="aProperty">
+					<SimpleType type="string"></SimpleType>
+				</Property>
+			</Properties>
+			<ModuleClasses>
+				<ModuleClass name="aModuleClass">
+					<Extend domain="hgi.dal.core" entity="BooleanState" />
+				</ModuleClass>
+			</ModuleClasses>
+			<SubDevices>
+				<SubDevice id="aSubDevice">
+					<ModuleClasses>
+						<ModuleClass name="aSubDeviceModuleClass">
+							<Extend domain="hgi.dal.core" entity="BooleanState"/>
+						</ModuleClass>
+					</ModuleClasses>
+				</SubDevice>
+			</SubDevices>
+			<DeviceClass>
+				<Extend domain="deviceClass.test" entity="Test" />
+			</DeviceClass>
+		</Product>
+
+<!--	TODO: test <extends> element, but only when DeviceClas is optional
+ 		<Product id="AnotherTestProduct">
+		</Product> -->
+	</Products>
+</Domain>
\ No newline at end of file