diff --git a/build.gradle.kts b/build.gradle.kts
index 60ca438ab30a3eb07b4bb920b4a30519745467ca..491dc362c744f8c93a83848712f052aee1a6b267 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -18,7 +18,7 @@ dependencies {
     implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
     implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
 
-    implementation("hu.bme.i9rv7w:er-lib:0.3.1-SNAPSHOT")
+    implementation("hu.bme.i9rv7w:er-lib:0.4")
 
     testImplementation("org.jetbrains.kotlin:kotlin-test")
     testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
diff --git a/src/main/kotlin/hu/bme/i9rv7w/ergraph/App.kt b/src/main/kotlin/hu/bme/i9rv7w/ergraph/App.kt
deleted file mode 100644
index 29edf73dffcc9fd8ebbec4c41eb294137f35acf3..0000000000000000000000000000000000000000
--- a/src/main/kotlin/hu/bme/i9rv7w/ergraph/App.kt
+++ /dev/null
@@ -1,274 +0,0 @@
-package hu.bme.i9rv7w.ergraph
-
-import hu.bme.i9rv7w.ergraph.core.relation.physical.Connects
-import hu.bme.i9rv7w.ergraph.model.electrical.PowerCord
-import hu.bme.i9rv7w.ergraph.model.electrical.SocketStrip
-import hu.bme.i9rv7w.ergraph.model.electrical.Supply
-
-fun betapok() {
-    val `betap-hosszabbito-6` = SocketStrip(socketNum = 6)
-    val `betap-hosszabbito-1` = SocketStrip(socketNum = 3) // 3 lyukas
-    val `betap-hosszabbito-2` = SocketStrip(socketNum = 3)
-    val `betap-diszkret-1` = SocketStrip(socketNum = 1) // 1 lzukas diszkret
-    val `betap-diszkret-2` = SocketStrip(socketNum = 1) // 1 lzukas
-    val `betap-diszkret-3` = SocketStrip(socketNum = 1) // 1 lzukas
-
-    val `salgo-eloszto-1` = SocketStrip() // salgo elsozto 1
-    val `rack2-ups-1` = SocketStrip()
-    val `rack1-eloszto-1` = SocketStrip()
-    `betap-hosszabbito-6`.run {
-        betápol(`salgo-eloszto-1`, 1)
-        betápol(`rack2-ups-1`, 2)
-        betápol(`rack1-eloszto-1`, 3)
-    }
-
-    val `rack1-ups2` = SocketStrip()
-    `betap-hosszabbito-1`.betápol(`rack1-ups2`, 1)
-
-    val `rack2-eloszto-1` = SocketStrip()
-    `betap-hosszabbito-2`.run {
-        betápol(`rack2-eloszto-1`, 1)
-    }
-
-    // salgo elosztókat még uplinknek is hívják
-    val `rack1-ups-1` = SocketStrip()
-    val `salgo-eloszto-2` = SocketStrip()
-    `betap-diszkret-1`.run {
-        betápol(`rack1-ups-1`, 1)
-        betápol(`salgo-eloszto-2`, 2)
-    }
-
-    val `salgo-eloszto-3` = SocketStrip()
-    val `salgo-eloszto-4` = SocketStrip()
-    `betap-diszkret-2`.run {
-        betápol(`salgo-eloszto-3`, 1)
-        betápol(`salgo-eloszto-4`, 1)
-    }
-
-    val `rack2-eloszto-2` = SocketStrip() // TODO dunno
-    `rack1-ups-1`.betápol(`rack2-eloszto-2`, 24)
-
-    val `rack2-eloszto-3` = SocketStrip()
-    `betap-diszkret-3`.run {
-        betápol(`rack2-eloszto-3`, 1)
-    }
-
-    /*---------------------------------------*/
-    // rack1
-    val `rack1-3j` = Supply()
-    val `rack1-2l` = Supply()
-    val `rack1-11j` = Supply()
-    `rack1-eloszto-1`.run {
-        bedug(`rack1-3j`, 1)
-        bedug(`rack1-2l`, 2)
-        bedug(`rack1-11j`, 5)
-    }
-    val `rack1-2f` = Supply()
-    val `rack1-8b` = Supply()
-    val `rack1-6` = Supply()
-    val `rack1-5b` = Supply()
-    val `rack1-11b` = Supply()
-    val `rack1-1j` = Supply()
-    val `rack1-4j` = Supply()
-    `rack1-ups2`.run {
-        bedug(`rack1-2f`, 21) // 2X lent
-        bedug(`rack1-8b`, 14) // 1X fent
-        bedug(`rack1-6`, 22)
-        bedug(`rack1-5b`, 13)
-        bedug(`rack1-11b`, 11)
-        bedug(`rack1-1j`, 24)
-        bedug(`rack1-4j`, 12)
-    }
-    val `rack1-1b` = Supply()
-    val `rack1-8j` = Supply()
-    `rack2-eloszto-3`.run {
-        bedug(`rack1-1b`, 4)
-        bedug(`rack1-8j`, 6)
-    }
-
-    val `rack1-9b` = Supply()
-    val `rack1-3b` = Supply()
-    val `rack1-7` = Supply()
-    `rack1-ups-1`.run {
-        bedug(`rack1-9b`, 23)
-        bedug(`rack1-3b`, 21)
-        bedug(`rack1-7`, 13)
-    }
-
-    /*---------------------------------------*/
-    // fura
-    val `rack1-9j` = Supply()
-    val `rack1-5j` = Supply()
-    val `rack1-10` = Supply()
-    `rack2-eloszto-2`.run {
-        bedug(`rack1-9j`, 5)
-        bedug(`rack1-5j`, 4)
-        bedug(`rack1-10`, 6)
-    }
-
-    val `rack1-4b` = Supply()
-    `rack2-eloszto-1`.bedug(`rack1-4b`, 6)
-
-    /*---------------------------------------*/
-    // rack2
-    val `rack2-5b` = Supply()
-    val `rack2-sw2` = Supply()
-    `rack2-eloszto-2`.run {
-        bedug(`rack2-5b`, 1)
-        bedug(`rack2-sw2`, 3)
-    }
-
-    val `rack2-7f` = Supply()
-    val `rack2-3b` = Supply()
-    val `rack2-6f` = Supply()
-    `rack2-ups-1`.run {
-        bedug(`rack2-7f`, 13)
-        bedug(`rack2-3b`, 12)
-        bedug(`rack2-6f`, 14)
-    }
-
-    val `rack2-6l` = Supply()
-    val `rack2-7l` = Supply()
-    val `rack2-3j` = Supply()
-    `rack2-eloszto-1`.run {
-        bedug(`rack2-6l`, 4)
-        bedug(`rack2-7l`, 3)
-        bedug(`rack2-3j`, 2)
-    }
-
-    val `rack2-sw1` = Supply()
-    `rack1-ups2`.run {
-        bedug(`rack2-sw1`, 24)
-    }
-
-    /*---------------------------------------*/
-    // salgo
-
-    val `fenti` = SocketStrip()
-    val `lenti` = SocketStrip()
-    `salgo-eloszto-2`.betápol(`fenti`, 9)
-    `salgo-eloszto-4`.betápol(`lenti`, 2)
-
-    // also es felso
-    val `salgo-5b` = Supply()
-    val `salgo-5j` = Supply()
-    val `salgo-6j` = Supply()
-    val `salgo-6b` = Supply()
-    val `salgo-7j` = Supply()
-    val `salgo-7b` = Supply() // TODO kornel ups
-    val `salgo-10j` = Supply()
-    val `salgo-10b` = Supply()
-    val `salgo-12j` = Supply()
-    val `salgo-12b` = Supply()
-    val `salgo-13j` = Supply()
-    val `salgo-13b` = Supply()
-    val `salgo-14j` = Supply()
-    val `salgo-14b` = Supply()
-
-    //
-    val `salgo-15j` = Supply()
-    val `salgo-15b` = Supply()
-    val `salgo-17j` = Supply()
-    val `salgo-17b` = Supply()
-    val `salgo-18j` = Supply()
-    val `salgo-18b` = Supply()
-    val `salgo-19j` = Supply()
-    val `salgo-19b` = Supply()
-    val `salgo-26j` = Supply()
-    val `salgo-26b` = Supply()
-    val `salgo-29j` = Supply()
-    val `salgo-29b` = Supply()
-    val `salgo-34j` = Supply()
-    val `salgo-34b` = Supply()
-    val `salgo-35j` = Supply()
-    val `salgo-35b` = Supply()
-
-    val `salgo-31f` = Supply() // felso
-    val `salgo-31a` = Supply() // also
-
-    // egy tapos
-    val `salgo-21` = Supply()
-    val `salgo-33` = Supply()
-
-    // harom tapos
-    val `salgo-40a` = Supply() // also
-    val `salgo-40k` = Supply() // kozep
-    val `salgo-40f` = Supply() // fenti
-
-
-    fenti.run {
-        bedug(`salgo-5b`, 9)
-        bedug(`salgo-6b`, 8)
-        //bedug(`salgo-7b`, 1) // TODO UPS
-        bedug(`salgo-10b`, 1)
-        bedug(`salgo-12b`, 6)
-        bedug(`salgo-13b`, 5)
-        bedug(`salgo-14b`, 4)
-        bedug(`salgo-10j`, 7)
-    }
-    lenti.run {
-        bedug(`salgo-5j`, 6)
-        bedug(`salgo-6j`, 5)
-        bedug(`salgo-7j`, 14)
-        bedug(`salgo-12j`, 3)
-        bedug(`salgo-13j`, 2)
-        bedug(`salgo-14j`, 1)
-    }
-
-    `salgo-eloszto-2`.run {
-        bedug(`salgo-15b`, 1)
-        bedug(`salgo-17b`, 2)
-        bedug(`salgo-18b`, 3)
-        bedug(`salgo-21`, 4)
-        bedug(`salgo-31f`, 6)
-        bedug(`salgo-34b`, 7)
-        bedug(`salgo-40k`, 8)
-    }
-
-    `salgo-eloszto-1`.run {
-        bedug(`salgo-19b`, 2)
-        bedug(`salgo-26b`, 3)
-        bedug(`salgo-33`, 5)
-        bedug(`salgo-40f`, 7)
-    }
-
-    `salgo-eloszto-3`.run {
-        bedug(`salgo-26j`, 1)
-        bedug(`salgo-29j`, 2)
-        bedug(`salgo-31a`, 3)
-        bedug(`salgo-34j`, 4)
-        bedug(`salgo-35j`, 5)
-    }
-
-    `salgo-eloszto-4`.run {
-        bedug(`salgo-15j`, 3)
-        bedug(`salgo-17j`, 4)
-        bedug(`salgo-18j`, 5)
-        bedug(`salgo-19j`, 6)
-        bedug(`salgo-40a`, 7)
-
-    }
-
-    // TODO 28 UPS
-    // TODO 29 UPS
-    // TODO 35 ups
-}
-
-private fun SocketStrip.bedug(supply: Supply, hely: Int) {
-    val betap = this
-    val cord = PowerCord()
-    Connects(betap.sockets[hely], cord)
-    Connects(cord, supply)
-}
-
-private fun SocketStrip.betápol(strip: SocketStrip, hova: Int) {
-    val betap = this
-    val cord = PowerCord() // TODO ez tuti power cord?
-    Connects(betap.sockets[hova], cord)
-    Connects(cord, strip)
-}
-
-fun main() {
-    betapok()
-    println("asd")
-}
\ No newline at end of file
diff --git a/src/main/kotlin/hu/bme/i9rv7w/ergraph/electrical/App.kt b/src/main/kotlin/hu/bme/i9rv7w/ergraph/electrical/App.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7ede79f482e217b860ffccda4b54f18392a8cce1
--- /dev/null
+++ b/src/main/kotlin/hu/bme/i9rv7w/ergraph/electrical/App.kt
@@ -0,0 +1,240 @@
+package hu.bme.i9rv7w.ergraph
+
+import hu.bme.i9rv7w.ergraph.core.relation.physical.Connects
+import hu.bme.i9rv7w.ergraph.core.schema.Entity
+import hu.bme.i9rv7w.ergraph.core.schema.Graph
+import hu.bme.i9rv7w.ergraph.schema.*
+
+fun betapok() {
+    val dev = { name: String -> Graph.getByName(name)!!.cast<Device>()!! }
+    val strip = { name: String -> Graph.getByName(name)!!.cast<SocketStrip>()!! }
+
+    SocketStrip(socketNum = 6).name("betap-hosszabbito-6")
+    SocketStrip(socketNum = 3).name("betap-hosszabbito-1")
+    SocketStrip(socketNum = 3).name("betap-hosszabbito-2")
+    SocketStrip(socketNum = 2).name("betap-diszkret-1")
+    SocketStrip(socketNum = 2).name("betap-diszkret-2")
+    SocketStrip(socketNum = 2).name("betap-diszkret-3")
+
+    SocketStrip(socketNum = 9).name("salgo-eloszto-1")
+    SocketStrip(socketNum = 30).name("rack2-ups-1")
+    SocketStrip().name("rack1-eloszto-1")
+    strip("betap-hosszabbito-6").run {
+        stripToStrip(strip("salgo-eloszto-1"), socket = 1)
+        stripToStrip(strip("rack2-ups-1"), socket = 2)
+        stripToStrip(strip("rack1-eloszto-1"), socket = 3)
+    }
+
+    SocketStrip(socketNum = 30).name("rack1-ups-2")
+    SocketStrip().name("rack2-eloszto-1")
+    SocketStrip(socketNum = 9).name("salgo-eloszto-2")
+    SocketStrip(socketNum = 30).name("rack1-ups-1") // TODO fix modulo
+    SocketStrip(socketNum = 8).name("salgo-eloszto-3")
+    SocketStrip(socketNum = 8).name("salgo-eloszto-4")
+    SocketStrip(socketNum = 8).name("rack2-eloszto-2") // TODO dunno
+    SocketStrip(socketNum = 8).name("rack2-eloszto-3")
+
+    strip("betap-hosszabbito-1").stripToStrip(strip("rack1-ups-2"), 1)
+    strip("betap-hosszabbito-2").stripToStrip(strip("rack2-eloszto-1"), 1)
+
+    // salgo elosztókat még uplinknek is hívják
+    strip("betap-diszkret-1").run {
+        stripToStrip(strip("rack1-ups-1"), 1)
+        stripToStrip(strip("salgo-eloszto-2"), 2)
+    }
+
+    strip("betap-diszkret-2").run {
+        stripToStrip(strip("salgo-eloszto-3"), 1)
+        stripToStrip(strip("salgo-eloszto-4"), 2) // corrected 1 -> 2
+    }
+
+    strip("rack1-ups-1").stripToStrip(strip("rack2-eloszto-2"), 24) // TODO modulo
+    strip("betap-diszkret-3").stripToStrip(strip("rack2-eloszto-3"), 1)
+
+    Device(supplyNum = 2, unit = 1).name("rack1-node-1")
+    Device(supplyNum = 2, unit = 1).name("rack1-node-2")
+    Device(supplyNum = 2, unit = 1).name("rack1-node-3")
+    Device(supplyNum = 2, unit = 1).name("rack1-node-4")
+    Device(supplyNum = 2, unit = 1).name("rack1-node-5")
+    Device(supplyNum = 1, unit = 1).name("rack1-node-6")
+    Device(supplyNum = 1, unit = 1).name("rack1-node-7")
+    Device(supplyNum = 2, unit = 1).name("rack1-node-8")
+    Device(supplyNum = 2, unit = 1).name("rack1-node-9")
+    Device(supplyNum = 1, unit = 1).name("rack1-node-10")
+    Device(supplyNum = 2, unit = 1).name("rack1-node-11")
+
+    Device(supplyNum = 2, unit = 1).name("rack2-node-3")
+    Device(supplyNum = 2, unit = 1).name("rack2-node-5")
+    Device(supplyNum = 2, unit = 1).name("rack2-node-6")
+    Device(supplyNum = 2, unit = 1).name("rack2-node-7")
+
+    Device(supplyNum = 1, unit = 1).name("rack2-sw2")
+    Device(supplyNum = 1, unit = 1).name("rack2-sw1")
+
+    strip("rack1-eloszto-1").run {
+        stripToSupply(dev("rack1-node-3").supplies[1], 1)
+        stripToSupply(dev("rack1-node-2").supplies[0], 2)
+        stripToSupply(dev("rack1-node-11").supplies[1], 5)
+    }
+
+    strip("rack1-ups-2").run {
+        stripToSupply(dev("rack1-node-2").supplies[1], 21) // 2X lent
+        stripToSupply(dev("rack1-node-8").supplies[0], 14) // 1X fent
+        stripToSupply(dev("rack1-node-6").supplies[0], 22)
+        stripToSupply(dev("rack1-node-5").supplies[0], 13)
+        stripToSupply(dev("rack1-node-11").supplies[0], 11)
+        stripToSupply(dev("rack1-node-1").supplies[1], 24)
+        stripToSupply(dev("rack1-node-4").supplies[1], 12)
+    }
+
+    strip("rack2-eloszto-3").run {
+        stripToSupply(dev("rack1-node-1").supplies[0], 4)
+        stripToSupply(dev("rack1-node-8").supplies[1], 6)
+    }
+
+
+    strip("rack1-ups-1").run {
+        stripToSupply(dev("rack1-node-9").supplies[0], 23)
+        stripToSupply(dev("rack1-node-3").supplies[0], 21)
+        stripToSupply(dev("rack1-node-7").supplies[0], 13)
+    }
+
+    /*---------------------------------------*/
+    // fura
+
+    strip("rack2-eloszto-2").run {
+        stripToSupply(dev("rack1-node-9").supplies[1], 5)
+        stripToSupply(dev("rack1-node-5").supplies[1], 4)
+        stripToSupply(dev("rack1-node-10").supplies[0], 6)
+    }
+
+    strip("rack2-eloszto-1").stripToSupply(dev("rack1-node-4").supplies[0], 6)
+
+    /*---------------------------------------*/
+    // rack2
+
+    strip("rack2-eloszto-2").run {
+        stripToSupply(dev("rack2-node-5").supplies[0], 1)
+        stripToSupply(dev("rack2-sw2").supplies[0], 3)
+    }
+
+
+    strip("rack2-ups-1").run {
+        stripToSupply(dev("rack2-node-7").supplies[1], 13)
+        stripToSupply(dev("rack2-node-3").supplies[0], 12)
+        stripToSupply(dev("rack2-node-6").supplies[1], 14)
+    }
+
+
+    strip("rack2-eloszto-1").run {
+        stripToSupply(dev("rack2-node-6").supplies[0], 4)
+        stripToSupply(dev("rack2-node-7").supplies[0], 3)
+        stripToSupply(dev("rack2-node-3").supplies[1], 2)
+    }
+
+    strip("rack1-ups-2").run {
+        stripToSupply(dev("rack2-sw1").supplies[0], 24)
+    }
+
+    /*---------------------------------------*/
+    // salgo
+
+    SocketStrip(socketNum = 9).name("salgo-oldal-fenti")
+    SocketStrip(socketNum = 9).name("salgo-oldal-lenti")
+    strip("salgo-eloszto-2").stripToStrip(strip("salgo-oldal-fenti"), socket = 9)
+    strip("salgo-eloszto-4").stripToStrip(strip("salgo-oldal-lenti"), socket = 2)
+
+    Device(supplyNum = 2, unit = 1).name("salgo-node-5")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-6")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-7")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-10")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-12")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-13")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-14")
+    Device(supplyNum = 2, unit = 2).name("salgo-node-15")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-17")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-18")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-19")
+    Device(supplyNum = 1, unit = 1).name("salgo-node-21")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-26")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-29")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-31")
+    Device(supplyNum = 1, unit = 1).name("salgo-node-33")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-34")
+    Device(supplyNum = 2, unit = 1).name("salgo-node-35")
+    Device(supplyNum = 3, unit = 1).name("salgo-node-40")
+
+    strip("salgo-oldal-fenti").run {
+        stripToSupply(dev("salgo-node-5").supplies[0], socket = 9)
+        stripToSupply(dev("salgo-node-6").supplies[0], socket = 8)
+        stripToSupply(dev("salgo-node-10").supplies[0], socket = 1)
+        stripToSupply(dev("salgo-node-12").supplies[0], socket = 6)
+        stripToSupply(dev("salgo-node-13").supplies[0], socket = 5)
+        stripToSupply(dev("salgo-node-14").supplies[0], socket = 4)
+        stripToSupply(dev("salgo-node-10").supplies[1], socket = 7)
+    }
+    strip("salgo-oldal-lenti").run {
+        stripToSupply(dev("salgo-node-5").supplies[1], socket = 6)
+        stripToSupply(dev("salgo-node-6").supplies[1], socket = 5)
+        stripToSupply(dev("salgo-node-7").supplies[1], socket = 4)
+        stripToSupply(dev("salgo-node-12").supplies[1], socket = 3)
+        stripToSupply(dev("salgo-node-13").supplies[1], socket = 2)
+        stripToSupply(dev("salgo-node-14").supplies[1], socket = 1)
+    }
+
+    strip("salgo-eloszto-2").run {
+        stripToSupply(dev("salgo-node-15").supplies[0], socket = 1)
+        stripToSupply(dev("salgo-node-17").supplies[0], socket = 2)
+        stripToSupply(dev("salgo-node-18").supplies[0], socket = 3)
+        stripToSupply(dev("salgo-node-21").supplies[0], socket = 4)
+        stripToSupply(dev("salgo-node-31").supplies[0], socket = 6)
+        stripToSupply(dev("salgo-node-34").supplies[0], socket = 7)
+        stripToSupply(dev("salgo-node-40").supplies[1], socket = 8)
+    }
+
+    strip("salgo-eloszto-1").run {
+        stripToSupply(dev("salgo-node-19").supplies[0], socket = 2)
+        stripToSupply(dev("salgo-node-26").supplies[0], socket = 3)
+        stripToSupply(dev("salgo-node-33").supplies[0], socket = 5)
+        stripToSupply(dev("salgo-node-40").supplies[0], socket = 7)
+    }
+
+    strip("salgo-eloszto-3").run {
+        stripToSupply(dev("salgo-node-26").supplies[1], socket = 1)
+        stripToSupply(dev("salgo-node-29").supplies[1], socket = 2)
+        stripToSupply(dev("salgo-node-31").supplies[1], socket = 3)
+        stripToSupply(dev("salgo-node-34").supplies[1], socket = 4)
+        stripToSupply(dev("salgo-node-35").supplies[1], socket = 5)
+    }
+
+    strip("salgo-eloszto-4").run {
+        stripToSupply(dev("salgo-node-15").supplies[1], socket = 3)
+        stripToSupply(dev("salgo-node-17").supplies[1], socket = 4)
+        stripToSupply(dev("salgo-node-18").supplies[1], socket = 5)
+        stripToSupply(dev("salgo-node-19").supplies[1], socket = 6)
+        stripToSupply(dev("salgo-node-40").supplies[2], socket = 7)
+    }
+
+    // TODO 28 UPS
+    // TODO 29 UPS
+    // TODO 35 ups
+}
+
+private fun SocketStrip.toStrip(what: Entity, socket: Int) {
+    val strip = this.cast<SocketStrip>()
+    check(strip != null)
+    val cord = PowerCord()
+    Connects(strip.sockets[socket - 1], cord)
+    Connects(cord, what)
+}
+
+private fun SocketStrip.stripToSupply(supply: Supply, socket: Int) = toStrip(supply, socket)
+
+private fun SocketStrip.stripToStrip(strip: SocketStrip, socket: Int) = toStrip(strip, socket)
+
+fun main() {
+    betapok()
+    println("asd")
+    // https://www.graphdracula.net/
+    //https://github.com/pcbje/ggraph
+}
\ No newline at end of file
diff --git a/src/main/kotlin/hu/bme/i9rv7w/ergraph/electrical/electricalSchema.kt b/src/main/kotlin/hu/bme/i9rv7w/ergraph/electrical/electricalSchema.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8a2f59242f91a371b080b388f0a408fe6e8774ee
--- /dev/null
+++ b/src/main/kotlin/hu/bme/i9rv7w/ergraph/electrical/electricalSchema.kt
@@ -0,0 +1,24 @@
+package hu.bme.i9rv7w.ergraph.schema
+
+import hu.bme.i9rv7w.ergraph.core.schema.ComposableEntity
+import hu.bme.i9rv7w.ergraph.core.schema.Entity
+import hu.bme.i9rv7w.ergraph.core.schema.Label
+
+class InputSource : Entity()
+class SocketStrip(
+    socketNum: Int = 6,
+    val sockets: List<Socket> = List(socketNum) { Socket() },
+) : ComposableEntity<Socket>(sockets)
+
+class Socket : Entity()
+class PowerCord : Entity()
+class Supply : Entity()
+class Device(
+    supplyNum: Int = 1,
+    unit: Int = 1, // height
+    val supplies: List<Supply> = List(supplyNum) { Supply() },
+) : ComposableEntity<Supply>(supplies) {
+    init {
+        add(Label("unit-height", unit.toString()))
+    }
+}
diff --git a/src/main/kotlin/hu/bme/i9rv7w/ergraph/schema/NetzwerkStuff.kt b/src/main/kotlin/hu/bme/i9rv7w/ergraph/schema/NetzwerkStuff.kt
new file mode 100644
index 0000000000000000000000000000000000000000..cdad40f04371acd3eab78e6817e9a5d285770567
--- /dev/null
+++ b/src/main/kotlin/hu/bme/i9rv7w/ergraph/schema/NetzwerkStuff.kt
@@ -0,0 +1,9 @@
+package hu.bme.i9rv7w.ergraph.schema
+
+import hu.bme.i9rv7w.ergraph.core.schema.ComposableEntity
+import hu.bme.i9rv7w.ergraph.core.schema.Entity
+
+class Node : ComposableEntity<Port>()
+class Port : Entity()
+class Cable : Entity()
+class Service : Entity()
diff --git a/src/main/kotlin/hu/bme/i9rv7w/ergraph/util.kt b/src/main/kotlin/hu/bme/i9rv7w/ergraph/util.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5f2c01f0980738555e4871b4e3b95b6fbb6b5156
--- /dev/null
+++ b/src/main/kotlin/hu/bme/i9rv7w/ergraph/util.kt
@@ -0,0 +1,7 @@
+package hu.bme.i9rv7w.ergraph
+
+fun String.splitLet(init: (String) -> Any) {
+    trim().split("\\s+".toRegex()).forEach {
+        init(it)
+    }
+}
\ No newline at end of file
diff --git a/src/test/kotlin/hu/bme/er-graph/AppTest.kt b/src/test/kotlin/hu/bme/er-graph/AppTest.kt
index e6f8a65764cc4e70c20ea221c0552b696f4b965a..60932a979c6bb7ea8b822f9f51ee08ebc6975bbd 100644
--- a/src/test/kotlin/hu/bme/er-graph/AppTest.kt
+++ b/src/test/kotlin/hu/bme/er-graph/AppTest.kt
@@ -1,15 +1,9 @@
-/*
- * This Kotlin source file was generated by the Gradle 'init' task.
- */
-package hu.bme.`er-graph`
+package hu.bme.ergraph
 
-import hu.bme.i9rv7w.ergraph.App
 import kotlin.test.Test
-import kotlin.test.assertNotNull
 
 class AppTest {
-    @Test fun testAppHasAGreeting() {
-        val classUnderTest = App()
-        assertNotNull(classUnderTest.greeting, "app should have a greeting")
+    @Test
+    fun testAppHasAGreeting() {
     }
 }