Repository: mechmotum/symbrim (language: python)

Issue:
Improve class names
There are some class names, which redundantly mention that they are a connection or model. These names can be shortened.
- [x] `TyreModelBase` --> `TyreBase`
- [x] `NonHolonomicTyreModel` --> `NonHolonomicTyre`
- [x] `PedalConnectionBase` --> `PedalsBase`
- [x] `HolonomicPedalsConnection` --> `HolonomicPedals`
- [x] `SeatConnectionBase` --> stay the same, or make it `RearToPelvisBase`, or just `SeatBase`
- [x] `SideLeanConnection` --> `SideLean`
- [x] `SteerConnectionBase` --> stay the same, or make it `SteerToArmsBase`, `HandGripBase` or `GripBase`
- [x] `HolonomicSteerConnection` --> `HolonomicHandGrip`
- [x] `SimpleRigidPelvis` --> `PlanarPelvis`
- [x] `SimpleRigidTorso` --> `PlanarTorso`
- [x] `...PelvisToTorso` --> `...Sacrum`
- [x] `PedalsBase` --> `CranksBase`
- [x] `SimplePedals` --> `MasslessCranks`


Discussion / hints:

Fix patch:
diff --git a/docs/images/UML.svg b/docs/images/UML.svg
new file mode 100644
index 00000000..d870cb6a
--- /dev/null
+++ b/docs/images/UML.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Do not edit this file with editors other than diagrams.net -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1061px" height="546px" viewBox="-0.5 -0.5 1061 546" content="&lt;mxfile host=&quot;drawio-plugin&quot; modified=&quot;2023-05-20T09:39:55.124Z&quot; agent=&quot;5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36&quot; etag=&quot;kHtq9Z6Lu9Yj2Btmz450&quot; version=&quot;20.5.3&quot; type=&quot;embed&quot; pages=&quot;4&quot;&gt;&lt;diagram id=&quot;23iRSUPoRavnBvh4doch&quot; name=&quot;core&quot;&gt;7VnbcpswEP0aHpPh5kseY8dJp9M81Om09VNGgS2oBeQKEeN+fZGRDFjYQ2IH8IyfrD26IM7qrHaxZk3D9IGipf9IXAg0U3dTzbrTTNPQ7WH2w5F1joz1cQ54FLtiUAE84X8gZwo0wS7ElYGMkIDhZRV0SBSBwyoYopSsqsN+kaD61CXyQAGeHBSo6A/sMl+8xUAv8E+APV8+2dBFT4jkYAHEPnLJqgRZM82aUkJY3grTKQScPMlLPu9+T+92YxQi1mTC1wUy0u/6t7mXwhw9O5+fr8ZXYpVXFCTihdGLc307mYo9s7UkgpIkcoGvpWvWZOVjBk9L5PDeVeb6DPNZGGSWkTXVvckHAWWQliCx1wcgITC6zobI3qHgTRwcS/K4KtxgSMwvucAWGBKe97ZLF+RkDcHPG7i6UTgBNzsrwiSU+cQjEQpmBTqpslaM+ULIUnD1Gxhbi4OPEkaqTEKK2U8+/XogrIVYjLfv0rKxlkaUvW5pEjcXcj1uFNM2VjHPveWSycyXgDh/cugec5o2A/a6NSYJdeAAd6aQLqIesAPjrHwcJ/bgIaEQIIZfqyI9ucdNRR3TPMxgEs3hb4IphJyKrrWyjTFCK/a4Rit2m1oZXbTybq1YDbVi9EorlqKVkkImKIbOVbJ7o9h61zfK+KKSd6vEPssbxVZUskmZ+3SZ3DS4S1pViSwF1CT1ERhS+CqxUUfWCRgaGA1SU6NVitQ8fkJxWBt22+enNtC2ys+2BrtE2rdHWqNxQqL3KtYaakpSpO8dhY7hoG/SMC5l7RHSaJqF9E0ae/KQjlRhjXqniktqfoQqBk1V0a8S1lS/9+AoZihy1Cyq1dMw+vjj4KLY32z2YBVxQtf3qy6T+67NFbpKo3ejYl0l1m5UvHzWO0IawzONimpt2Y+oaJ5PVGzsertXrpf73k0TOwqI9m7x9IEBMTOLv2Y3faU/uK3Zfw==&lt;/diagram&gt;&lt;diagram id=&quot;hazVWlcNqvAhnrBg1nSR&quot; name=&quot;bicycle&quot;&gt;7Zxdb+I4FIZ/DZczInG+elnox0jbrmano+32auUSQ7x14siYAvPr105sQmoKGSiJK0WqKnxiJ87x+9gnPoEBGKerWwbz5J7GiAzcYbwagKuB64auI/5Lw7o0+H5YGmYMx6XJqQwP+BdSxqGyLnCM5rWKnFLCcV43TmiWoQmv2SBjdFmvNqWkftUczpBheJhAYlofccyT0hr5w8r+DeFZoq/sDNWRFOrKyjBPYEyXWyZwPQBjRikvP6WrMSLSd9ovZbubd45uOsZQxps04LdrevmI/gZP0dhZr6+//JVef4lU3/ha3zCKxf2rImU8oTOaQXJdWUeMLrIYybMORamqc0dpLoyOMP6HOF+rwYQLToUp4SlRR9EK839k86++Kj2pk8nPV6vtwloXMs7WW41k8UmfTxaqZkWpahdfShmI4jOhk5fSdIMJURVMNyrPzumCTdAe32k5QjZDfE89JXjp2K0LqEG6RTRFosOiAkMEcvxaFx5U+p1t6lVDLD6oUf6NEVfnfYVkoa40wpP1hKARnCNDDfWxXiaYo4ccFm5ZCt7r4/quK18R42i19+b1UaBoUdOF66nysoLP0UQlW+Dpeh/uL78n5GhC3IaEOFYR4hqEPCY4zwUhJSjWQQLcriEJekiOhsRrCIlrFSTeAUjuKWX2keINuyYlNPxWhMxWLr5O0LW3HDNascddfhB99Q86LGzTX5tnjX4iPiKebxyu2BWv6H5vQXLDaMZvGEztiOp9H7whZWdcP2wVFcdwS49KY1TAJ0UF7AhbkCXrSQgOM9LqauJc9Igcj0jTuN42RMzI/geCzJ7FxHPsW0ycfh/1BFL8T0qKb5ByW4ypFZgANzi8mvhtBlxuz8jxjASflJHAYOQ7iiGZW8FIFFoWcQHQM3I0I27jhxLfKkZc86HkRly3XEs6Z+TtOrIr2dDqOuL1e1wnMNI01tKjbgsjZqz1A89wvHk0sSPf4A2dGiy78w1t0gL6/PUJtDSOujy7aDGjrjot3YNiPMTvTGK3+hAP+iz2CaiETVFx7ULFTMgWqFQZlM5ZMbMn3bPi9dmTE1iJmgZhdr06qPv9Pit2RGE+eJuY3xmHgVYXl7AH5nhgLpouLsAuYC4MYP7I8BTJMS7yjp2jEgSgwcritQlKn0o5HhTQ9J10y0DR/d4C5SdlFMeQ2MFJGIYHOYlaxaTPzZ+AidsUE7t2wXS/tzB5wGlOUJlT6ZySKIjsosQzHdbkNeX5EqcEZhKZqQhtNVTSiZMEk/gOrulC9n3O4eRFl0YJZfiXqA+1S8VhxhVMbiDPJtQ7poQyYchocYGq0YM8mboMQ3PR7LseDOeN6R6uahXv4JzrDlJCYD7Hz0WXZcNUqBxnI8o5TVuTgvnQ6u8Qg7vrodWJ3HPJwcy0zMosC7gU5j3Ze3HXvBhQRl/QmxHcMaiQ4FkmigRNZTPpNjyB5FKZuZxuR3Phf5zN7oo6V15l+aF8IU1UtJ2SYhZMcByjrJjGOeTweaPJnOKMF77yR+JPuHQs51pfdHwsyk5VFn+yOuNjmol7gbgYXyTUs0RSQb8vjP3YHZaLzrwGzbSh6328NMzXnhiC7N9psQVUyOPAFmovkfNKxHe7loiZg5rKnQ9DI3v2DnuRnFckYdSxSHxziSnmkWXxGFNo5P03jnt1nFcdm52M7uRhBqTlHNLrwwZ9gIYh6vn0YYYheflsV0hjz7tzvTbOrA2/6xBV/+ZIv+VzzLesm77K4dmVc/PMVzl+rhmy51uwzlDrct+3MbxWk9NmTn9c/jwQppmdTtv5Vet2ndZvKJ8wuzTN6Ht2bSh7Zkb/T5p9E6FCRlM82cw09gGzM1H5QcAM5Pen9c9yFce2ftsMXP8P&lt;/diagram&gt;&lt;diagram id=&quot;v6Iu5fOVvUACu7cSLzF9&quot; name=&quot;rider&quot;&gt;jZJNb4QgEIZ/jccmKN1dz2t33abpyUN7JTIVsigGsWp/fXEd/Ihp0hPDM5+8Q0CTsk8Nq8W75qCCiPA+oC9BFIXk+eiOkQwTiUk8gcJIjkELyOQP+EykreTQbAKt1srKegtzXVWQ2w1jxuhuG/al1bZrzQrYgSxnak8/JLcCX3EgC7+BLITvHBL0lMwHI2gE47pbIXoJaGK0tpNV9gmoUTyvy5R3/cM7D2agsv9JuJ+6z1LGMns1/en2RtJDc3/CKt9MtfjgxwrPrAGc2g5eCqPbisNYjQT03AlpIatZPno7t3zHhC2Vu4XO3E/nW4Gx0K8QTpuCLsGawYWgl3op8euEXsluWcTMxGoJR2QMd1/MpRd5nIEK+euyiYdv9Z/p5Rc=&lt;/diagram&gt;&lt;diagram id=&quot;oesdH2XUcLqIiwCbE73W&quot; name=&quot;rolling-disc&quot;&gt;7ZxtU+I6FMc/DS/doc/wUlD34arXWb2re99FGml204YJQcBPv0mbUiApoNumOHaGGZvTpE3zPz9zklPoOMN48ZmCSXRFQog7djdcdJyzjm1bXmDxP8KyzCyeF2SGMUWhrFQYbtELlMautM5QCKcbFRkhmKHJpnFEkgSO2IYNUErmm9WeCN686wSMoWK4HQGsWu9RyKLM2vO6hf0LROMov7PVlWdikFeWhmkEQjJfMznnHWdICWHZUbwYQiwGLx+XrN1FydlVxyhM2CENHPrw8nz7wxvjH+cDnFxffF3cn/jZVZ4BnskH/k4wRsn4DE1Hst9smQ/GdI5iDBJeGjyRhN3KM11eHkUIh5dgSWaiM1MGRr/z0iAiFL3w+gDzUxY38NOUSa1tX1wNYTwkmFBuSEh6g6LRrbiYvA2FU97sJn9oa8t0BRYbFS/BlOUd5M8FJlP0mHZZNIwBHaNkQBgjsawkRwNSBhelw2ytxONeD0kMGV3yKiuXl3pLh7cCWZ4X7mM50hatu07XlW4rXXa8unahKj+Qwr5C5EARORTqOqfceB9BiAdgChWx+RCwVCtKfsMtcTR6AYzGCS9i+CSaiTFEHKNTaWZkIi42ASPuXJdpnTO3sHyX4yBMhLd9wikqEQpDmAg5CQMMPK7cbUJQwtJx8gb8w4dz2P3kdTze8SEvW0WZf0R1yoYk4c8CUCoj5I4xh8I5DtO8HB7VEaTwtn+Y7nm9ymXvK7KPKZklYSb85/S4Vb4G5T27YeV7ivJsSWGm+x0/alWvQfWg17Dqq0Cj0BSGPJiRRT4kERmTBODzwjpI/wvAUA5zUeeSCAHTefIXZGwpZ2swY0RMzizO53K4QOxBNhfHP8UxlyIrnS3WTp0t80LCn/chv4AorLUSxaJZWirahacipuPFEIGYJOFdhJLsxAUSo7U2i4tn3z2H86EiMzqCO8Y0D0N5wDKGu3wj0PsGhRgw9LzZkcqVz3u5Bnz5vL6mXQXhjmNvhTuuGu70NBTk1aofi15LQeUU5CuvfRT0GqXAUigonezqhcD21djPLAT9FoLKIbAPhKDfKAS2AsGOSL9mDCyvWQxs7wNh8IiJ2CapEQDnQAAyH2yMAEch4ILfN6OgZgJcdz8BlhV88kxC4LcQVAiBeygEJZ5iCAJXgeCaJF/4Ej4hMRqJuMg0CpqYyDgKlvLQLQpvR8E7FIWu3lMMoeApKPyToCcoNE5XyYZBsCxNQsA0CG4LQoUg+O8DBDXZd0coQSHAjXDguyY5iP8N4m8v/321rpf9y8cr/+Hl/8mJumPQpj+rTX+6vsn0p1ZkdUXcpj9fmQ4ph+co0p/a7qnLwDb9aUR5k+lPbffUtU+b/qxddZPpT233PtJeX/Vb3toh1cS15TOsgbB2VyebyH1aW7FO0FcYqGu/W6+D0yQD1lsY6B47A7o3AMrjjaYg0LwBYCzts7Wu87rmsj56Chrd3DBMQZWbG3rPsg/0f2ObGzu72UTW58TfT4BvdmPDbvYtmJXf/1x3+xIG9vhyAUnBRYZJv+/vBYWXbiBFfFQhrQEOTTZIr8ffZoNk0xuxECg8b5VflJ7n97YcKuuYbLXlU6tu/AV1jaeZtvebAt3uum4dUt+e4kdaiNQ//Ry6Bil5OdfQ7KMuQszmmJytlYhnNMekH5Og5aBCDnrvggP1mwdGU0xbGHhmU636mb9ZDF4Vib2Xfan89da9MLiNwqB+Aat097lNLb4+1PO7B4Z6+dZ09Wyruy5tjqmqbEPJa9THkl7MH2RN+3k6xbV55XqVbzy9aDf65Yq37S9ubp2sJvijmdFXv+1w1OFt7mbvaElz/Mofml+pa3+ZF4sf4cg2xoqfMnHO/wA=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><path d="M 60 80 L 60 48.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 60 41.12 L 63.5 48.12 L 56.5 48.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="80" width="120" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 100px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">BicycleBase</div></div></div></foreignObject><text x="60" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BicycleBase</text></switch></g><path d="M 60 160 L 60 128.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 60 121.12 L 63.5 128.12 L 56.5 128.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="160" width="120" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 180px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">WhippleBicycle</div></div></div></foreignObject><text x="60" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">WhippleBicycle</text></switch></g><path d="M 60 240 L 60 208.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 60 201.12 L 63.5 208.12 L 56.5 208.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="240" width="120" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 260px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">WhippleBicycleMoore</div></div></div></foreignObject><text x="60" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">WhippleBicycleMoore</text></switch></g><rect x="0" y="0" width="120" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 20px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ModelBase</div></div></div></foreignObject><text x="60" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ModelBase</text></switch></g><rect x="438.5" y="0" width="70" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 20px; margin-left: 440px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ModelBase</div></div></div></foreignObject><text x="474" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ModelBase</text></switch></g><path d="M 473.5 80 L 473.5 48.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.5 41.12 L 477 48.12 L 470 48.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="423.5" y="80" width="100" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 100px; margin-left: 425px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">FrontFrameBase</div></div></div></foreignObject><text x="474" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">FrontFrameBase</text></switch></g><path d="M 640 80 L 640.03 59.97 L 473.48 59.97 L 473.49 48.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.5 41.12 L 476.99 48.12 L 469.99 48.11 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="605" y="80" width="70" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 100px; margin-left: 606px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">WheelBase</div></div></div></foreignObject><text x="640" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">WheelBase</text></switch></g><path d="M 333.5 80 L 333.48 59.97 L 473.48 59.97 L 473.49 48.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.5 41.12 L 476.99 48.12 L 469.99 48.11 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="283.5" y="80" width="100" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 100px; margin-left: 285px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">RearFrameBase</div></div></div></foreignObject><text x="334" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">RearFrameBase</text></switch></g><path d="M 233.5 80 L 233.48 59.97 L 473.48 59.97 L 473.49 48.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.5 41.12 L 476.99 48.12 L 469.99 48.11 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="196" y="80" width="75" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 73px; height: 1px; padding-top: 100px; margin-left: 197px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">GroundBase</div></div></div></foreignObject><text x="234" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">GroundBase</text></switch></g><path d="M 780 80 L 780.03 59.97 L 473.48 59.97 L 473.49 48.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.5 41.12 L 476.99 48.12 L 469.99 48.11 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="745" y="80" width="70" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 100px; margin-left: 746px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">PedalsBase</div></div></div></foreignObject><text x="780" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">PedalsBase</text></switch></g><path d="M 233.5 160 L 233.5 128.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 233.5 121.12 L 237 128.12 L 230 128.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="196" y="160" width="75" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 73px; height: 1px; padding-top: 180px; margin-left: 197px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">FlatGround</div></div></div></foreignObject><text x="234" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">FlatGround</text></switch></g><path d="M 333.5 240 L 333.5 208.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 333.5 201.12 L 337 208.12 L 330 208.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="271" y="240" width="125" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 123px; height: 1px; padding-top: 260px; margin-left: 272px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">RigidRearFrameMoore</div></div></div></foreignObject><text x="334" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">RigidRearFrameMoore</text></switch></g><path d="M 333.5 160 L 333.5 128.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 333.5 121.12 L 337 128.12 L 330 128.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="283.5" y="160" width="100" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 180px; margin-left: 285px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">RigidRearFrame</div></div></div></foreignObject><text x="334" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">RigidRearFrame</text></switch></g><path d="M 473.5 160 L 473.5 128.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.5 121.12 L 477 128.12 L 470 128.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="423.5" y="160" width="100" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 180px; margin-left: 425px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">RigidFrontFrame</div></div></div></foreignObject><text x="474" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">RigidFrontFrame</text></switch></g><path d="M 473.5 240 L 473.5 208.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.5 201.12 L 477 208.12 L 470 208.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="408.5" y="240" width="130" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 260px; margin-left: 410px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">RigidFrontFrameMoore</div></div></div></foreignObject><text x="474" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">RigidFrontFrameMoore</text></switch></g><path d="M 585 160 L 585 139.97 L 640.03 139.97 L 640.01 128.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 640 121.12 L 643.51 128.11 L 636.51 128.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="533" y="160" width="104" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 102px; height: 1px; padding-top: 180px; margin-left: 534px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">KnifeEdgeWheel</div></div></div></foreignObject><text x="585" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">KnifeEdgeWheel</text></switch></g><path d="M 689 160 L 689 139.97 L 640.03 139.97 L 640.01 128.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 640 121.12 L 643.51 128.11 L 636.51 128.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="646" y="160" width="84" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 82px; height: 1px; padding-top: 180px; margin-left: 647px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ToroidalWheel</div></div></div></foreignObject><text x="688" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ToroidalWheel</text></switch></g><path d="M 780 160 L 780 128.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 780 121.12 L 783.5 128.12 L 776.5 128.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="738" y="160" width="84" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 82px; height: 1px; padding-top: 180px; margin-left: 739px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SimplePedals</div></div></div></foreignObject><text x="780" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SimplePedals</text></switch></g><path d="M 423.5 386 L 423.5 360 L 623.5 360 L 623.5 386" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 423.5 386 L 423.5 542 L 623.5 542 L 623.5 386" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 423.5 386 L 623.5 386" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 373px; margin-left: 425px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">WhippleBicycleMoore</div></div></div></foreignObject><text x="524" y="377" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">WhippleBicycleMoore</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 190px; height: 1px; padding-top: 393px; margin-left: 430px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 22px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ground: GroundBase</div></div></div></foreignObject><text x="430" y="405" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">ground: GroundBase</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 190px; height: 1px; padding-top: 419px; margin-left: 430px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 22px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">rear_frame: RigidRearFrame</div></div></div></foreignObject><text x="430" y="431" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">rear_frame: RigidRearFrame</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 190px; height: 1px; padding-top: 445px; margin-left: 430px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 22px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">front_frame: RigidFrontFrame</div></div></div></foreignObject><text x="430" y="457" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">front_frame: RigidFrontFrame</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 190px; height: 1px; padding-top: 471px; margin-left: 430px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 22px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">rear_wheel: WheelBase</div></div></div></foreignObject><text x="430" y="483" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">rear_wheel: WheelBase</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 190px; height: 1px; padding-top: 497px; margin-left: 430px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 22px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">front_wheel: WheelBase</div></div></div></foreignObject><text x="430" y="509" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">front_wheel: WheelBase</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 190px; height: 1px; padding-top: 523px; margin-left: 430px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 22px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">pedals: PedalsBase</div></div></div></foreignObject><text x="430" y="535" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">pedals: PedalsBase</text></switch></g><path d="M 990 80 L 990 48.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 990 41.12 L 993.5 48.12 L 986.5 48.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="920" y="80" width="140" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 100px; margin-left: 921px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">TyreBase</div></div></div></foreignObject><text x="990" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TyreBase</text></switch></g><rect x="920" y="0" width="140" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 20px; margin-left: 921px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ConnectionBase</div></div></div></foreignObject><text x="990" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ConnectionBase</text></switch></g><path d="M 990 160 L 990 128.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 990 121.12 L 993.5 128.12 L 986.5 128.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="920" y="160" width="140" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 180px; margin-left: 921px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">NonHolonomicTyre</div></div></div></foreignObject><text x="990" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">NonHolonomicTyre</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
diff --git a/docs/images/bicycle-rider-sketch.svg b/docs/images/bicycle-rider-sketch.svg
new file mode 100644
index 00000000..8c3befbe
--- /dev/null
+++ b/docs/images/bicycle-rider-sketch.svg
@@ -0,0 +1,1013 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="220.4536mm"
+   height="87.128685mm"
+   viewBox="0 0 220.45359 87.128688"
+   version="1.1"
+   id="svg4841"
+   inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+   sodipodi:docname="modular_bicycle_model_explanation.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview4843"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="false"
+     inkscape:zoom="1.1003319"
+     inkscape:cx="279.91554"
+     inkscape:cy="257.64953"
+     inkscape:window-width="2560"
+     inkscape:window-height="1351"
+     inkscape:window-x="1911"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer4" />
+  <defs
+     id="defs4838">
+    <marker
+       style="overflow:visible"
+       id="EmptyDiamondLend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="EmptyDiamondLend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(0.8,0,0,0.8,-5.6,0)"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z"
+         id="path36622" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="EmptyTriangleLend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="EmptyTriangleOutL"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(0.8,0,0,0.8,-4.8,0)"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         id="path111358-5" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="EmptyTriangleLend-7"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="EmptyTriangleOutL"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(0.8,0,0,0.8,-4.8,0)"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         id="path111358-5-4" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="EmptyDiamondLend-1"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="EmptyDiamondLend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(0.8,0,0,0.8,-5.6,0)"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z"
+         id="path36622-7" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="EmptyDiamondLend-7"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="EmptyDiamondLend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(0.8,0,0,0.8,-5.6,0)"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z"
+         id="path36622-9" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="EmptyTriangleLend-7-2"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="EmptyTriangleOutL"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(0.8,0,0,0.8,-4.8,0)"
+         style="fill:#ffffff;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         id="path111358-5-4-3" />
+    </marker>
+  </defs>
+  <g
+     inkscape:label="bicycle"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-27.69204,-104.46082)"
+     sodipodi:insensitive="true">
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path3564"
+       sodipodi:type="arc"
+       sodipodi:cx="85.698013"
+       sodipodi:cy="167.68816"
+       sodipodi:rx="15.417147"
+       sodipodi:ry="15.417147"
+       sodipodi:start="0.22213853"
+       sodipodi:end="0.22199715"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="m 100.73634,171.0848 a 15.417147,15.417147 0 0 1 -18.434441,11.6418 15.417147,15.417147 0 0 1 -11.64245,-18.43403 15.417147,15.417147 0 0 1 18.433615,-11.6431 15.417147,15.417147 0 0 1 11.643756,18.43321" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path3564-5"
+       sodipodi:type="arc"
+       sodipodi:cx="151.44449"
+       sodipodi:cy="167.68816"
+       sodipodi:rx="15.417147"
+       sodipodi:ry="15.417147"
+       sodipodi:start="0.22213853"
+       sodipodi:end="0.22199715"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="m 166.48281,171.0848 a 15.417147,15.417147 0 0 1 -18.43444,11.6418 15.417147,15.417147 0 0 1 -11.64245,-18.43403 15.417147,15.417147 0 0 1 18.43362,-11.6431 15.417147,15.417147 0 0 1 11.64375,18.43321" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+       d="m 85.698002,167.68815 29.484358,3.15315 20.8571,-26.0302 h -35.78888 z"
+       id="path976"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+       d="m 115.18236,170.8413 -14.93178,-26.0302 -4.55065,-8.33662"
+       id="path1926" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+       d="m 91.718129,136.35653 11.755821,0.0705"
+       id="path2126"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+       d="m 124.33105,134.86455 h 6.96817 l 4.74024,9.94655 c 4.27897,8.97862 9.63773,18.02412 15.40502,22.87705"
+       id="path2227"
+       sodipodi:nodetypes="ccsc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 115.182,170.841 2,-8"
+       id="path117823"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 115.182,170.841 -2,8"
+       id="path118600"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 115.182,162.841 h 4"
+       id="path119076"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 111.182,178.841 h 4"
+       id="path119076-3"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g13172"
+       transform="translate(0,-1.0583333)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 64.517038,184.46082 H 174.51702"
+         id="path12401"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 68.517038,184.46082 -4,7"
+         id="path12569"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 71.936391,184.46082 -4,7"
+         id="path12978"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 75.355748,184.46082 -4,7"
+         id="path12980"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 78.7751,184.46082 -4,7"
+         id="path12982"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 82.194457,184.46082 -4,7"
+         id="path12984"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 85.61381,184.46082 -4,7"
+         id="path12986"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 89.033167,184.46082 -4,7"
+         id="path12988"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 92.45252,184.46082 -4,7"
+         id="path12990"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 95.871873,184.46082 -4,7"
+         id="path12992"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 99.291216,184.46082 -3.999986,7"
+         id="path12994"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 102.71056,184.46082 -3.999991,7"
+         id="path12996"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 106.12993,184.46082 -4,7"
+         id="path12998"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 109.54927,184.46082 -4,7"
+         id="path13000"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 112.96863,184.46082 -4,7"
+         id="path13002"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 116.38799,184.46082 -4,7"
+         id="path13004"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 119.80734,184.46082 -4,7"
+         id="path13006"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 123.22669,184.46082 -4,7"
+         id="path13008"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 126.64605,184.46082 -4,7"
+         id="path13010"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 130.0654,184.46082 -4,7"
+         id="path13012"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 133.48476,184.46082 -4,7"
+         id="path13014"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 136.90411,184.46082 -4,7"
+         id="path13016"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 140.32346,184.46082 -4,7"
+         id="path13018"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 143.74282,184.46082 -4,7"
+         id="path13020"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 147.16217,184.46082 -4,7"
+         id="path13022"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 150.58152,184.46082 -4,7"
+         id="path13024"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 154.00088,184.46082 -4,7"
+         id="path13026"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 157.42023,184.46082 -4,7"
+         id="path13028"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 160.83958,184.46082 -4,7"
+         id="path13030"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 164.25895,184.46082 -4,7"
+         id="path13032"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 167.6783,184.46082 -4,7"
+         id="path13034"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 171.09766,184.46082 -4,7"
+         id="path13036"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 174.51702,184.46082 -4,7"
+         id="path13038"
+         sodipodi:nodetypes="cc" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="rider"
+     sodipodi:insensitive="true"
+     transform="translate(-27.69204,-104.46082)">
+    <path
+       style="fill:none;stroke:#ff0000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 117.182,162.841 2.144,-22.56165 -23.626072,-3.80487 19.563722,-20.5461 3.52305,14.29162 9.05594,4.71102"
+       id="path37205"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:none;stroke:#ff0000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+       id="path37328"
+       sodipodi:type="arc"
+       sodipodi:cx="120.44852"
+       sodipodi:cy="110.21172"
+       sodipodi:rx="5.5"
+       sodipodi:ry="5.5"
+       sodipodi:start="0.22213853"
+       sodipodi:end="0.22199715"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="m 125.81337,111.42346 a 5.5,5.5 0 0 1 -6.5764,4.15316 5.5,5.5 0 0 1 -4.1534,-6.57626 5.5,5.5 0 0 1 6.57612,-4.15362 5.5,5.5 0 0 1 4.15386,6.57596" />
+    <path
+       style="fill:none;stroke:#ff0000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 115.26365,115.92838 1.46943,-1.53103"
+       id="path37762"
+       sodipodi:nodetypes="cc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="connections">
+    <path
+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="path13196"
+       sodipodi:type="arc"
+       sodipodi:cx="85.606102"
+       sodipodi:cy="183.3438"
+       sodipodi:rx="1.5"
+       sodipodi:ry="1.5"
+       sodipodi:start="0.22213853"
+       sodipodi:end="0.22199715"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="m 87.069245,183.67427 a 1.5,1.5 0 0 1 -1.793565,1.13268 1.5,1.5 0 0 1 -1.132744,-1.79352 1.5,1.5 0 0 1 1.793485,-1.13281 1.5,1.5 0 0 1 1.13287,1.79344"
+       transform="translate(-27.69204,-104.46082)" />
+    <path
+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="path13196-6"
+       sodipodi:type="arc"
+       sodipodi:cx="117.10104"
+       sodipodi:cy="162.87482"
+       sodipodi:rx="1.5"
+       sodipodi:ry="1.5"
+       sodipodi:start="0.22213853"
+       sodipodi:end="0.22199715"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="m 118.56419,163.20529 a 1.5,1.5 0 0 1 -1.79357,1.13268 1.5,1.5 0 0 1 -1.13274,-1.79352 1.5,1.5 0 0 1 1.79348,-1.13281 1.5,1.5 0 0 1 1.13287,1.79344"
+       transform="translate(-27.69204,-104.46082)" />
+    <path
+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="path13196-9"
+       sodipodi:type="arc"
+       sodipodi:cx="151.65482"
+       sodipodi:cy="183.01436"
+       sodipodi:rx="1.5"
+       sodipodi:ry="1.5"
+       sodipodi:start="0.22213853"
+       sodipodi:end="0.22199715"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="m 153.11796,183.34483 a 1.5,1.5 0 0 1 -1.79357,1.13268 1.5,1.5 0 0 1 -1.13274,-1.79352 1.5,1.5 0 0 1 1.79348,-1.13281 1.5,1.5 0 0 1 1.13288,1.79345"
+       transform="translate(-27.69204,-104.46082)" />
+    <path
+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="path13196-0"
+       sodipodi:type="arc"
+       sodipodi:cx="95.770042"
+       sodipodi:cy="136.43681"
+       sodipodi:rx="1.5"
+       sodipodi:ry="1.5"
+       sodipodi:start="0.22213853"
+       sodipodi:end="0.22199715"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="m 97.233185,136.76729 a 1.5,1.5 0 0 1 -1.793565,1.13268 1.5,1.5 0 0 1 -1.132744,-1.79353 1.5,1.5 0 0 1 1.793485,-1.1328 1.5,1.5 0 0 1 1.132871,1.79344"
+       transform="translate(-27.69204,-104.46082)" />
+    <path
+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers stroke fill"
+       id="path13196-95"
+       sodipodi:type="arc"
+       sodipodi:cx="127.86204"
+       sodipodi:cy="134.94582"
+       sodipodi:rx="1.5"
+       sodipodi:ry="1.5"
+       sodipodi:start="0.22213853"
+       sodipodi:end="0.22199715"
+       sodipodi:open="true"
+       sodipodi:arc-type="arc"
+       d="m 129.32518,135.27629 a 1.5,1.5 0 0 1 -1.79356,1.13268 1.5,1.5 0 0 1 -1.13275,-1.79352 1.5,1.5 0 0 1 1.79349,-1.13281 1.5,1.5 0 0 1 1.13287,1.79344"
+       transform="translate(-27.69204,-104.46082)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="classes"
+     transform="translate(-27.69204,-104.46082)"
+     style="display:inline">
+    <g
+       id="g18375"
+       transform="translate(15.177566,2.4560123)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="48.165203"
+         y="141.78894"
+         id="text12578"><tspan
+           sodipodi:role="line"
+           id="tspan12576"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="48.165203"
+           y="141.78894">RigidRearFrame</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156"
+         width="35.231998"
+         height="9"
+         x="30.928167"
+         y="136.21553" />
+    </g>
+    <g
+       id="g18375-4"
+       transform="translate(14.196646,-60.971787)">
+      <g
+         id="g113621"
+         transform="translate(29.925157,31.79548)">
+        <text
+           xml:space="preserve"
+           style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="45.707638"
+           y="142.16032"
+           id="text12578-10"><tspan
+             sodipodi:role="line"
+             id="tspan12576-5"
+             style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+             x="45.707638"
+             y="142.16032">Rider</tspan></text>
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+           id="rect18156-1"
+           width="15"
+           height="9"
+           x="38.336506"
+           y="136.21553" />
+      </g>
+    </g>
+    <g
+       id="g18375-6"
+       transform="translate(-5.6967825,24.722982)">
+      <g
+         id="g85358"
+         transform="translate(29.075011,-20.743575)" />
+    </g>
+    <g
+       id="g36447"
+       transform="translate(117.57228,2.4560123)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="48.827206"
+         y="141.78894"
+         id="text12578-18"><tspan
+           sodipodi:role="line"
+           id="tspan12576-0"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="48.827206"
+           y="141.78894">RigidFrontFrame</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-6"
+         width="36.556"
+         height="9"
+         x="30.928167"
+         y="136.21553" />
+    </g>
+    <g
+       id="g18375-7"
+       transform="translate(117.74178,-13.414199)">
+      <g
+         id="g36452"
+         transform="translate(46.648803,15.870211)">
+        <text
+           xml:space="preserve"
+           style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="48.657703"
+           y="142.09685"
+           id="text12578-5"><tspan
+             sodipodi:role="line"
+             id="tspan12576-9"
+             style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+             x="48.657703"
+             y="142.09685">FrontFrameBase</tspan></text>
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2, 0.999998;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+           id="rect18156-60"
+           width="36.216999"
+           height="9"
+           x="30.928167"
+           y="136.21553" />
+      </g>
+    </g>
+    <g
+       id="g18375-7-2-9"
+       transform="translate(170.73029,-10.962729)" />
+    <g
+       id="g21116"
+       transform="translate(15.908685,1.2575969)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="47.43409"
+         y="127.4791"
+         id="text12578-1"><tspan
+           sodipodi:role="line"
+           id="tspan12576-2"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="47.43409"
+           y="127.4791">RearFrameBase</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-3"
+         width="34.891998"
+         height="9"
+         x="30.367048"
+         y="121.59779" />
+    </g>
+    <g
+       id="g21116-6"
+       transform="translate(15.738685,-14.55857)">
+      <g
+         id="g40360">
+        <text
+           xml:space="preserve"
+           style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="41.940086"
+           y="127.54258"
+           id="text12578-1-0"><tspan
+             sodipodi:role="line"
+             id="tspan12576-2-35"
+             style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+             x="41.940086"
+             y="127.54258">RiderBase</tspan></text>
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999, 0.999998;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+           id="rect18156-3-9"
+           width="23.903999"
+           height="9"
+           x="30.367048"
+           y="121.59779" />
+      </g>
+    </g>
+    <g
+       id="g28184"
+       transform="translate(145.56087,31.629735)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="47.840614"
+         y="127.18067"
+         id="text12578-1-6"><tspan
+           sodipodi:role="line"
+           id="tspan12576-2-3"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="47.840614"
+           y="127.18067">KnifeEdgeWheel</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-3-6"
+         width="35.723999"
+         height="9"
+         x="30.367048"
+         y="121.59779" />
+    </g>
+    <g
+       id="g28184-4"
+       transform="translate(154.29875,60.74171)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="43.352837"
+         y="127.18067"
+         id="text12578-1-6-1"><tspan
+           sodipodi:role="line"
+           id="tspan12576-2-3-4"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="43.352837"
+           y="127.18067">FlatGround</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-3-6-64"
+         width="26"
+         height="9"
+         x="30.367048"
+         y="121.59779" />
+    </g>
+    <g
+       id="g29486"
+       transform="translate(0.52749193,32.889917)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="43.163227"
+         y="127.54258"
+         id="text12578-1-6-7"><tspan
+           sodipodi:role="line"
+           id="tspan12576-2-3-7"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="43.163227"
+           y="127.54258">WheelBase</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999, 0.999998;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-3-6-6"
+         width="25.941"
+         height="9"
+         x="30.367048"
+         y="121.59779" />
+    </g>
+    <g
+       id="g29486-0"
+       transform="translate(150.45237,16.659215)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="84.480347"
+         y="143.18527"
+         id="text12578-1-6-7-9"><tspan
+           sodipodi:role="line"
+           id="tspan12576-2-3-7-4"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="84.480347"
+           y="143.18527">WheelBase</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999, 0.999998;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-3-6-6-4"
+         width="25.941"
+         height="9"
+         x="71.502266"
+         y="137.24048" />
+    </g>
+    <g
+       id="g29486-0-4"
+       transform="translate(149.17133,45.099025)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="84.480347"
+         y="143.18527"
+         id="text12578-1-6-7-9-1"><tspan
+           sodipodi:role="line"
+           id="tspan12576-2-3-7-4-3"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="84.480347"
+           y="143.18527">GroundBase</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999, 0.999998;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-3-6-6-4-5"
+         width="25.941"
+         height="9"
+         x="71.502266"
+         y="137.24048" />
+    </g>
+    <g
+       id="g29486-9"
+       transform="translate(-1.2348032,66.389125)">
+      <g
+         id="g32228"
+         transform="translate(-1.1902052,-17.683048)">
+        <text
+           xml:space="preserve"
+           style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="46.290047"
+           y="127.54258"
+           id="text12578-1-6-7-1"><tspan
+             sodipodi:role="line"
+             id="tspan12576-2-3-7-7"
+             style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+             x="46.290047"
+             y="127.54258">ToroidalWheel</tspan></text>
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+           id="rect18156-3-6-6-6"
+           width="31.846001"
+           height="9"
+           x="30.367048"
+           y="121.59779" />
+      </g>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyTriangleLend)"
+       d="m 43.86504,170.31352 v -6.60218"
+       id="path36496-1"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyTriangleLend)"
+       d="m 211.81287,158.39968 h 10"
+       id="path36496-1-2"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyTriangleLend)"
+       d="m 185.11335,143.13937 9.82871,0.0405"
+       id="path36496-1-45"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyTriangleLend)"
+       d="m 63.721733,138.6812 v -6.60218"
+       id="path36496-1-4"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyTriangleLend)"
+       d="M 82.429406,111.53922 H 70.248573"
+       id="path36496-1-4-0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyDiamondLend)"
+       d="M 95.942641,150.64678 81.935975,143.31282"
+       id="path86471"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyDiamondLend)"
+       d="m 70.295862,171.9063 -9.902315,3.26119"
+       id="path86471-5"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyDiamondLend)"
+       d="m 166.3547,161.67124 9.10034,-3.41526"
+       id="path86471-5-4"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyDiamondLend-7)"
+       d="m 174.10206,186.88111 10.06217,-0.0488"
+       id="path86471-5-4-9"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g28184-5"
+       transform="translate(145.56087,46.185722)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="49.957283"
+         y="127.18067"
+         id="text12578-1-6-5"><tspan
+           sodipodi:role="line"
+           id="tspan12576-2-3-5"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="49.957283"
+           y="127.18067">NonHolonomicTyre</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-3-6-8"
+         width="39"
+         height="9"
+         x="30.367048"
+         y="121.59779" />
+    </g>
+    <g
+       id="g29486-0-2"
+       transform="translate(150.77992,30.543037)">
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="84.480347"
+         y="143.18527"
+         id="text12578-1-6-7-9-8"><tspan
+           sodipodi:role="line"
+           id="tspan12576-2-3-7-4-6"
+           style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+           x="84.480347"
+           y="143.18527">TyreBase</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.99999, 0.999998;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-3-6-6-4-9"
+         width="20"
+         height="9"
+         x="74.677269"
+         y="137.24048" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyTriangleLend-7)"
+       d="m 215.12633,172.28352 h 10"
+       id="path36496-1-2-4"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyTriangleLend-7-2)"
+       d="m 210.73359,186.8395 h 10"
+       id="path36496-1-2-4-2"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyDiamondLend-1)"
+       d="m 153.30679,182.16156 22.11512,-9.94519"
+       id="path86471-5-4-8"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyDiamondLend)"
+       d="M 113.68727,116.83113 97.569307,111.46915"
+       id="path86471-5-9"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyDiamondLend)"
+       d="m 138.11535,147.61367 9.90023,-4.60775"
+       id="path86471-5-8"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g111035"
+       transform="matrix(0.26458333,0,0,0.26458333,-11.236858,203.49803)">
+      <g
+         id="g111011" />
+      <switch
+         id="switch111019">
+        <g
+           requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
+           id="g111013" />
+        <a
+           transform="translate(0,-5)"
+           xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems"
+           target="_blank"
+           id="a111017">
+          <text
+             text-anchor="middle"
+             font-size="10px"
+             x="50%"
+             y="100%"
+             id="text111015">Text is not SVG - cannot display</text>
+        </a>
+      </switch>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="legend"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <g
+       id="g41003"
+       style="display:inline"
+       transform="translate(-27.69204,-104.46082)">
+      <path
+         style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.88976;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;paint-order:markers stroke fill"
+         id="path13196-95-4"
+         sodipodi:type="arc"
+         sodipodi:cx="170.98271"
+         sodipodi:cy="27.859007"
+         sodipodi:rx="1.5"
+         sodipodi:ry="1.5"
+         sodipodi:start="0.22213853"
+         sodipodi:end="0.22199715"
+         sodipodi:open="true"
+         sodipodi:arc-type="arc"
+         d="m 172.44585,28.189481 a 1.5,1.5 0 0 1 -1.79356,1.13268 1.5,1.5 0 0 1 -1.13274,-1.793525 1.5,1.5 0 0 1 1.79348,-1.132807 1.5,1.5 0 0 1 1.13287,1.793445"
+         transform="translate(27.69204,104.46082)" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2, 0.999998;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-60-7"
+         width="10"
+         height="4"
+         x="193.67476"
+         y="117.53996" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="rect18156-60-7-7"
+         width="10"
+         height="4"
+         x="193.67476"
+         y="123.92989" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#EmptyTriangleLend)"
+         d="m 193.55785,106.76009 h 10"
+         id="path36496-1-4-0-5"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyDiamondLend)"
+         d="m 193.56703,113.15003 h 10"
+         id="path86471-5-9-9"
+         sodipodi:nodetypes="cc" />
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
+         x="207.88339"
+         y="108.20488"
+         id="text3791"><tspan
+           sodipodi:role="line"
+           id="tspan3789"
+           style="stroke-width:0.264583"
+           x="207.88339"
+           y="108.20488">Inheritance</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
+         x="208.09372"
+         y="114.16943"
+         id="text3791-7"><tspan
+           sodipodi:role="line"
+           id="tspan3789-2"
+           style="stroke-width:0.264583"
+           x="208.09372"
+           y="114.16943">Aggregation</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
+         x="208.09372"
+         y="120.98474"
+         id="text3791-7-6"><tspan
+           sodipodi:role="line"
+           id="tspan3789-2-8"
+           style="stroke-width:0.264583"
+           x="208.09372"
+           y="120.98474">Abstract class</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
+         x="207.76402"
+         y="127.37468"
+         id="text3791-7-6-3"><tspan
+           sodipodi:role="line"
+           id="tspan3789-2-8-5"
+           style="stroke-width:0.264583"
+           x="207.76402"
+           y="127.37468">Model or Connection</tspan><tspan
+           sodipodi:role="line"
+           style="stroke-width:0.264583"
+           x="207.76402"
+           y="132.22537"
+           id="tspan8567" /></text>
+      <text
+         xml:space="preserve"
+         style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
+         x="207.92508"
+         y="133.72672"
+         id="text3791-7-6-3-4"><tspan
+           sodipodi:role="line"
+           style="stroke-width:0.264583"
+           x="207.92508"
+           y="133.72672"
+           id="tspan8567-1">Connection</tspan></text>
+    </g>
+  </g>
+</svg>
diff --git a/docs/images/rolling-disc-sketch.svg b/docs/images/rolling-disc-sketch.svg
new file mode 100644
index 00000000..5b6b7d3c
--- /dev/null
+++ b/docs/images/rolling-disc-sketch.svg
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+        width="79.638397mm"
+        height="62.389549mm"
+        viewBox="0 0 79.638398 62.389549"
+        version="1.1"
+        id="svg1669"
+        inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+        sodipodi:docname="rolling-disc.svg"
+        xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+        xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+        xmlns="http://www.w3.org/2000/svg"
+>
+    <sodipodi:namedview
+            id="namedview1671"
+            pagecolor="#ffffff"
+            bordercolor="#666666"
+            borderopacity="1.0"
+            inkscape:pageshadow="2"
+            inkscape:pageopacity="0.0"
+            inkscape:pagecheckerboard="0"
+            inkscape:document-units="mm"
+            showgrid="false"
+            inkscape:zoom="1.8844413"
+            inkscape:cx="145.40119"
+            inkscape:cy="193.9567"
+            inkscape:window-width="2560"
+            inkscape:window-height="1351"
+            inkscape:window-x="4471"
+            inkscape:window-y="-9"
+            inkscape:window-maximized="1"
+            inkscape:current-layer="layer1"/>
+    <defs
+            id="defs1666"/>
+    <g
+            inkscape:label="Layer 1"
+            inkscape:groupmode="layer"
+            id="layer1"
+            transform="translate(12.819029,-8.3906311)">
+        <path
+                style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:0.06, 0.06;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill"
+                id="path1310"
+                sodipodi:type="arc"
+                sodipodi:cx="30.000013"
+                sodipodi:cy="25.448975"
+                sodipodi:rx="15"
+                sodipodi:ry="15"
+                sodipodi:start="0.22214551"
+                sodipodi:end="0.22199715"
+                sodipodi:open="true"
+                sodipodi:arc-type="arc"
+                d="M 44.631418,28.753818 A 15,15 0 0 1 26.695712,40.080502 15,15 0 0 1 15.368363,22.145216 15,15 0 0 1 33.303229,10.817202 15,15 0 0 1 44.631908,28.751648"/>
+        <g
+                id="g13254">
+            <g
+                    id="g3226">
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="M 0,50.231273 H 60"
+                        id="path1565"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 7,50.231273 -7,10"
+                        id="path2364"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 11.076923,50.231273 -7.0000001,10"
+                        id="path2364-1"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 15.153846,50.231273 -6.9999997,10"
+                        id="path2364-5"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 19.23077,50.231273 -7,10"
+                        id="path2364-2"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 23.307692,50.231273 -7,10"
+                        id="path2364-4"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 27.384615,50.231273 -7,10"
+                        id="path2364-53"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 31.461539,50.231273 -7,10"
+                        id="path2364-19"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 35.538461,50.231273 -7,10"
+                        id="path2364-3"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 39.615382,50.231273 -7,10"
+                        id="path2364-28"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 43.692306,50.231273 -7,10"
+                        id="path2364-21"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 47.769229,50.231273 -7,10"
+                        id="path2364-47"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 51.846153,50.231273 -7,10"
+                        id="path2364-6"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 55.923075,50.231273 -7,10"
+                        id="path2364-6-7"
+                        sodipodi:nodetypes="cc"/>
+                <path
+                        style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        d="m 60,50.231273 -7,10"
+                        id="path2364-6-1"
+                        sodipodi:nodetypes="cc"/>
+            </g>
+        </g>
+        <path
+                style="fill:none;stroke:#ff0000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                d="m 30,40.350656 c -4.584373,2.734445 -4.749108,7.386904 0,9.880616"
+                id="path3261"
+                sodipodi:nodetypes="cc"/>
+        <text
+                xml:space="preserve"
+                style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+                x="29.825678"
+                y="26.148794"
+                id="text5426"><tspan
+         sodipodi:role="line"
+         id="tspan5424"
+         style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="29.825678"
+         y="26.148794">WheelBase</tspan></text>
+        <text
+                xml:space="preserve"
+                style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
+                x="28.880295"
+                y="46.315296"
+                id="text7974"><tspan
+         sodipodi:role="line"
+         id="tspan7972"
+         style="stroke-width:0.264583"
+         x="28.880295"
+         y="46.315296">TyreBase</tspan></text>
+        <text
+                xml:space="preserve"
+                style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
+                x="29.782099"
+                y="64.97464"
+                id="text12364"><tspan
+         sodipodi:role="line"
+         id="tspan12362"
+         style="text-align:center;text-anchor:middle;stroke-width:0.264583"
+         x="29.782099"
+         y="64.97464">GroundBase</tspan></text>
+        <path
+                style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:1.2, 2.4;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill"
+                id="path23236"
+                sodipodi:type="arc"
+                sodipodi:cx="27.276154"
+                sodipodi:cy="39.586342"
+                sodipodi:rx="39.242954"
+                sodipodi:ry="30.888906"
+                sodipodi:start="0.22214551"
+                sodipodi:end="0.22199715"
+                sodipodi:open="true"
+                sodipodi:arc-type="arc"
+                d="M 65.55479,46.391876 A 39.242954,30.888906 0 0 1 18.631451,69.716467 39.242954,30.888906 0 0 1 -11.003124,32.783043 39.242954,30.888906 0 0 1 35.918016,9.4557117 39.242954,30.888906 0 0 1 65.556073,46.387406"/>
+        <text
+                xml:space="preserve"
+                style="font-size:3.88056px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
+                x="-13.197989"
+                y="12.477739"
+                id="text24794"><tspan
+         sodipodi:role="line"
+         id="tspan24792"
+         style="stroke-width:0.264583"
+         x="-13.197989"
+         y="12.477739">RollingDisc</tspan></text>
+    </g>
+</svg>
diff --git a/src/brim/__init__.py b/src/brim/__init__.py
index 4052cc14..ab35499f 100644
--- a/src/brim/__init__.py
+++ b/src/brim/__init__.py
@@ -13,7 +13,7 @@
 
     "KnifeEdgeWheel",
 
-    "NonHolonomicTyreModel",
+    "NonHolonomicTyre",
 
     "SimplePedals",
 
@@ -45,7 +45,7 @@
 from brim.bicycle import (
     FlatGround,
     KnifeEdgeWheel,
-    NonHolonomicTyreModel,
+    NonHolonomicTyre,
     RigidFrontFrame,
     RigidRearFrame,
     SimplePedals,
diff --git a/src/brim/bicycle/__init__.py b/src/brim/bicycle/__init__.py
index 89b483e7..11644fcc 100644
--- a/src/brim/bicycle/__init__.py
+++ b/src/brim/bicycle/__init__.py
@@ -6,7 +6,7 @@
     "RearFrameBase", "RigidRearFrame", "RigidRearFrameMoore",
     "FrontFrameBase", "RigidFrontFrame", "RigidFrontFrameMoore",
     "WheelBase", "KnifeEdgeWheel", "ToroidalWheel",
-    "TyreModelBase", "NonHolonomicTyreModel",
+    "TyreBase", "NonHolonomicTyre",
     "PedalsBase", "SimplePedals",
 ]
 
@@ -19,6 +19,6 @@
 from brim.bicycle.grounds import FlatGround, GroundBase
 from brim.bicycle.pedals import PedalsBase, SimplePedals
 from brim.bicycle.rear_frames import RearFrameBase, RigidRearFrame, RigidRearFrameMoore
-from brim.bicycle.tyre_models import NonHolonomicTyreModel, TyreModelBase
+from brim.bicycle.tyre_models import NonHolonomicTyre, TyreBase
 from brim.bicycle.wheels import KnifeEdgeWheel, ToroidalWheel, WheelBase
 from brim.bicycle.whipple_bicycle import WhippleBicycle, WhippleBicycleMoore
diff --git a/src/brim/bicycle/tyre_models.py b/src/brim/bicycle/tyre_models.py
index dbdbcfa8..3bc33ea2 100644
--- a/src/brim/bicycle/tyre_models.py
+++ b/src/brim/bicycle/tyre_models.py
@@ -8,7 +8,7 @@
 from brim.bicycle.wheels import KnifeEdgeWheel, ToroidalWheel, WheelBase
 from brim.core import ConnectionBase, ModelRequirement
 
-__all__ = ["TyreModelBase", "NonHolonomicTyreModel"]
+__all__ = ["TyreBase", "NonHolonomicTyre"]
 
 
 def _set_pos_contact_point(contact_point: Point, ground: GroundBase, wheel: WheelBase
@@ -29,7 +29,7 @@ def _set_pos_contact_point(contact_point: Point, ground: GroundBase, wheel: Whee
         f" of {type(ground)} and {type(wheel)}.")
 
 
-class TyreModelBase(ConnectionBase):
+class TyreBase(ConnectionBase):
     """Base class for the tyre model connectors."""
 
     required_models: tuple[ModelRequirement, ...] = (
@@ -61,7 +61,7 @@ def on_ground(self, value: bool) -> None:
         self._on_ground = bool(value)
 
 
-class NonHolonomicTyreModel(TyreModelBase):
+class NonHolonomicTyre(TyreBase):
     """Tyre model connection based on non-holonomic constraints."""
 
     required_models: tuple[ModelRequirement, ...] = (
diff --git a/src/brim/bicycle/whipple_bicycle.py b/src/brim/bicycle/whipple_bicycle.py
index ed8db834..4a3b4b76 100644
--- a/src/brim/bicycle/whipple_bicycle.py
+++ b/src/brim/bicycle/whipple_bicycle.py
@@ -11,7 +11,7 @@
 from brim.bicycle.front_frames import FrontFrameBase
 from brim.bicycle.grounds import GroundBase
 from brim.bicycle.rear_frames import RearFrameBase
-from brim.bicycle.tyre_models import TyreModelBase
+from brim.bicycle.tyre_models import TyreBase
 from brim.bicycle.wheels import WheelBase
 from brim.core import ConnectionRequirement, ModelRequirement, set_default_formulation
 
@@ -39,9 +39,9 @@ class WhippleBicycle(BicycleBase):
         ModelRequirement("front_wheel", WheelBase, "Submodel of the front wheel."),
     )
     required_connections: tuple[ConnectionRequirement, ...] = (
-        ConnectionRequirement("rear_tyre", TyreModelBase,
+        ConnectionRequirement("rear_tyre", TyreBase,
                               "Tyre model for the rear wheel."),
-        ConnectionRequirement("front_tyre", TyreModelBase,
+        ConnectionRequirement("front_tyre", TyreBase,
                               "Tyre model for the front wheel."),
     )
     ground: GroundBase
@@ -49,8 +49,8 @@ class WhippleBicycle(BicycleBase):
     front_frame: FrontFrameBase
     rear_wheel: WheelBase
     front_wheel: WheelBase
-    rear_tyre: TyreModelBase
-    front_tyre: TyreModelBase
+    rear_tyre: TyreBase
+    front_tyre: TyreBase
 
     def define_connections(self) -> None:
         """Define the connections between the submodels."""
diff --git a/src/brim/other/rolling_disc.py b/src/brim/other/rolling_disc.py
index 89ac960b..f139fddd 100644
--- a/src/brim/other/rolling_disc.py
+++ b/src/brim/other/rolling_disc.py
@@ -14,7 +14,7 @@
 from sympy.physics.mechanics._system import System
 
 from brim.bicycle.grounds import GroundBase
-from brim.bicycle.tyre_models import TyreModelBase
+from brim.bicycle.tyre_models import TyreBase
 from brim.bicycle.wheels import WheelBase
 from brim.core import ConnectionRequirement, ModelBase, ModelRequirement
 
@@ -27,11 +27,11 @@ class RollingDisc(ModelBase):
         ModelRequirement("disc", WheelBase, "Disc model."),
     )
     required_connections: tuple[ConnectionRequirement, ...] = (
-        ConnectionRequirement("tyre", TyreModelBase, "Tyre model."),
+        ConnectionRequirement("tyre", TyreBase, "Tyre model."),
     )
     ground: GroundBase
     disc: WheelBase
-    tyre: TyreModelBase
+    tyre: TyreBase
 
     @property
     def descriptions(self) -> dict[Any, str]:


Test patch:
diff --git a/tests/bicycle/test_tyre_models.py b/tests/bicycle/test_tyre_models.py
index cd942463..0f343881 100644
--- a/tests/bicycle/test_tyre_models.py
+++ b/tests/bicycle/test_tyre_models.py
@@ -3,7 +3,7 @@
 import pytest
 from brim.bicycle.grounds import FlatGround
 from brim.bicycle.rear_frames import RigidRearFrameMoore
-from brim.bicycle.tyre_models import NonHolonomicTyreModel, _set_pos_contact_point
+from brim.bicycle.tyre_models import NonHolonomicTyre, _set_pos_contact_point
 from brim.bicycle.wheels import KnifeEdgeWheel, ToroidalWheel
 from brim.core import ConnectionRequirement, ModelBase, ModelRequirement
 from sympy import cos, sin
@@ -61,12 +61,12 @@ class Model(ModelBase):
                 ModelRequirement("wheel", KnifeEdgeWheel, "Submodel of the wheel."),
             )
             required_connections: tuple[ConnectionRequirement, ...] = (
-                ConnectionRequirement("tyre_model", NonHolonomicTyreModel,
+                ConnectionRequirement("tyre_model", NonHolonomicTyre,
                                       "Tyre model for the wheel."),
             )
             ground: FlatGround
             wheel: KnifeEdgeWheel
-            tyre_model: NonHolonomicTyreModel
+            tyre_model: NonHolonomicTyre
 
             def define_connections(self) -> None:
                 super().define_connections()
@@ -92,7 +92,7 @@ def define_constraints(self) -> None:
         self.model = Model("model")
         self.model.ground = FlatGround("ground")
         self.model.wheel = KnifeEdgeWheel("wheel")
-        self.model.tyre_model = NonHolonomicTyreModel("tyre_model")
+        self.model.tyre_model = NonHolonomicTyre("tyre_model")
 
     def test_default(self) -> None:
         self.model.define_connections()
diff --git a/tests/bicycle/test_whipple_bicycle.py b/tests/bicycle/test_whipple_bicycle.py
index 26e602f6..acd276a3 100644
--- a/tests/bicycle/test_whipple_bicycle.py
+++ b/tests/bicycle/test_whipple_bicycle.py
@@ -7,7 +7,7 @@
 from brim import (
     FlatGround,
     KnifeEdgeWheel,
-    NonHolonomicTyreModel,
+    NonHolonomicTyre,
     RigidFrontFrame,
     RigidRearFrame,
 )
@@ -89,8 +89,8 @@ def _setup_default(self) -> None:
         self.bike.front_frame = RigidFrontFrame("front_frame")
         self.bike.rear_wheel = KnifeEdgeWheel("rear_wheel")
         self.bike.front_wheel = KnifeEdgeWheel("front_wheel")
-        self.bike.rear_tyre = NonHolonomicTyreModel("rear_tyre")
-        self.bike.front_tyre = NonHolonomicTyreModel("front_tyre")
+        self.bike.rear_tyre = NonHolonomicTyre("rear_tyre")
+        self.bike.front_tyre = NonHolonomicTyre("front_tyre")
 
     def test_basu_mandal(self, _setup_default) -> None:
         t = dynamicsymbols._t
diff --git a/tests/brim/test_bicycle_rider.py b/tests/brim/test_bicycle_rider.py
index fd6c2c60..7605c54e 100644
--- a/tests/brim/test_bicycle_rider.py
+++ b/tests/brim/test_bicycle_rider.py
@@ -4,7 +4,7 @@
 from brim.bicycle import (
     FlatGround,
     KnifeEdgeWheel,
-    NonHolonomicTyreModel,
+    NonHolonomicTyre,
     RigidFrontFrame,
     RigidRearFrame,
     SimplePedals,
@@ -40,8 +40,8 @@ def _bicycle_setup(self) -> None:
         self.bicycle.rear_frame = RigidRearFrame("rear_frame")
         self.bicycle.front_wheel = KnifeEdgeWheel("front_wheel")
         self.bicycle.rear_wheel = KnifeEdgeWheel("rear_wheel")
-        self.bicycle.front_tyre = NonHolonomicTyreModel("front_tyre")
-        self.bicycle.rear_tyre = NonHolonomicTyreModel("rear_tyre")
+        self.bicycle.front_tyre = NonHolonomicTyre("front_tyre")
+        self.bicycle.rear_tyre = NonHolonomicTyre("rear_tyre")
         self.bicycle.pedals = SimplePedals("pedals")
         self.bicycle.ground = FlatGround("ground")
 
diff --git a/tests/core/test_model_base.py b/tests/core/test_model_base.py
index 2c5ab90d..f9476f3e 100644
--- a/tests/core/test_model_base.py
+++ b/tests/core/test_model_base.py
@@ -1,7 +1,7 @@
 from __future__ import annotations
 
 import pytest
-from brim.bicycle import FlatGround, KnifeEdgeWheel, NonHolonomicTyreModel
+from brim.bicycle import FlatGround, KnifeEdgeWheel, NonHolonomicTyre
 from brim.core import ModelBase, Registry, set_default_formulation
 from brim.other.rolling_disc import RollingDisc
 from sympy.physics.mechanics._system import System
@@ -21,7 +21,7 @@ def _create_model(self) -> None:
         self.disc = RollingDisc("rolling_disc")
         self.disc.disc = KnifeEdgeWheel("disc")
         self.disc.ground = FlatGround("ground")
-        self.disc.tyre = NonHolonomicTyreModel("tyre")
+        self.disc.tyre = NonHolonomicTyre("tyre")
         self.disc.define_connections()
         self.disc.define_objects()
 
diff --git a/tests/core/test_registry.py b/tests/core/test_registry.py
index da761c28..ddbe9da1 100644
--- a/tests/core/test_registry.py
+++ b/tests/core/test_registry.py
@@ -1,5 +1,5 @@
 import pytest
-from brim.bicycle import KnifeEdgeWheel, NonHolonomicTyreModel, ToroidalWheel, WheelBase
+from brim.bicycle import KnifeEdgeWheel, NonHolonomicTyre, ToroidalWheel, WheelBase
 from brim.core import Registry
 from brim.other.rolling_disc import RollingDisc
 
@@ -10,7 +10,7 @@ class TestRegistry:
     def test_models_registered(self, model) -> None:
         assert model in Registry().models
 
-    @pytest.mark.parametrize("conn", [NonHolonomicTyreModel])
+    @pytest.mark.parametrize("conn", [NonHolonomicTyre])
     def test_connections_registered(self, conn) -> None:
         assert conn in Registry().connections
 
diff --git a/tests/other/test_rolling_disc.py b/tests/other/test_rolling_disc.py
index 2c26b871..aa73699b 100644
--- a/tests/other/test_rolling_disc.py
+++ b/tests/other/test_rolling_disc.py
@@ -1,7 +1,7 @@
 from typing import TYPE_CHECKING
 
 import pytest
-from brim.bicycle import FlatGround, KnifeEdgeWheel, NonHolonomicTyreModel
+from brim.bicycle import FlatGround, KnifeEdgeWheel, NonHolonomicTyre
 from brim.other.rolling_disc import RollingDisc, rolling_disc_manual
 from sympy import Symbol, lambdify
 from sympy.physics.mechanics import dynamicsymbols
@@ -25,7 +25,7 @@ def _arbitrary_values() -> dict[str, float]:
     def _rolling_disc_brim(self) -> None:
         self.rolling_disc = RollingDisc("rolling_disc")
         self.rolling_disc.disc = KnifeEdgeWheel("disc")
-        self.rolling_disc.tyre = NonHolonomicTyreModel("tyre")
+        self.rolling_disc.tyre = NonHolonomicTyre("tyre")
         self.rolling_disc.ground = FlatGround("ground")
         self.rolling_disc.define_connections()
         self.rolling_disc.define_objects()
diff --git a/tests/utilities/test_parametrize.py b/tests/utilities/test_parametrize.py
index 63a911f8..8f2a9b79 100644
--- a/tests/utilities/test_parametrize.py
+++ b/tests/utilities/test_parametrize.py
@@ -6,7 +6,7 @@
 from brim.bicycle.grounds import FlatGround
 from brim.bicycle.pedals import SimplePedals
 from brim.bicycle.rear_frames import RigidRearFrameMoore
-from brim.bicycle.tyre_models import NonHolonomicTyreModel
+from brim.bicycle.tyre_models import NonHolonomicTyre
 from brim.bicycle.wheels import KnifeEdgeWheel
 from brim.bicycle.whipple_bicycle import WhippleBicycleMoore
 from brim.brim.bicycle_rider import BicycleRider
@@ -45,7 +45,7 @@ def _check_dir(bicycle: str, rider: str) -> bool:
         if not (os.path.isfile(
                 os.path.join(raw_data_dir, f"{rider}{bicycle}YeadonCFG.txt")) and
                 os.path.isfile(
-                    os.path.join(raw_data_dir, f"{rider}{bicycle}YeadonMeas.txt"))):
+                    os.path.join(raw_data_dir, f"{rider}YeadonMeas.txt"))):
             return False
     return True
 
@@ -68,9 +68,9 @@ def _setup_moore_bicycle(self) -> None:
         self.bike.rear_frame = RigidRearFrameMoore("rear_frame")
         self.bike.front_frame = RigidFrontFrameMoore("front_frame")
         self.bike.rear_wheel = KnifeEdgeWheel("rear_wheel")
-        self.bike.rear_tyre = NonHolonomicTyreModel("rear_tyre")
+        self.bike.rear_tyre = NonHolonomicTyre("rear_tyre")
         self.bike.front_wheel = KnifeEdgeWheel("front_wheel")
-        self.bike.front_tyre = NonHolonomicTyreModel("front_tyre")
+        self.bike.front_tyre = NonHolonomicTyre("front_tyre")
         self.bike.ground = FlatGround("ground")
         self.bike.define_all()
 
@@ -81,8 +81,8 @@ def _setup_full_model(self) -> None:
         self.bike.rear_frame = RigidRearFrameMoore("rear_frame")
         self.bike.front_wheel = KnifeEdgeWheel("front_wheel")
         self.bike.rear_wheel = KnifeEdgeWheel("rear_wheel")
-        self.bike.front_tyre = NonHolonomicTyreModel("front_tyre")
-        self.bike.rear_tyre = NonHolonomicTyreModel("rear_tyre")
+        self.bike.front_tyre = NonHolonomicTyre("front_tyre")
+        self.bike.rear_tyre = NonHolonomicTyre("rear_tyre")
         self.bike.pedals = SimplePedals("pedals")
         self.bike.ground = FlatGround("ground")