diff --git a/config.js b/config.js
index 3aab88380442279d7b084208871159902cab5b62..d2a7fad042fa5e010b4f27d010145299fef77cfc 100644
--- a/config.js
+++ b/config.js
@@ -4,8 +4,9 @@ module.exports = {
   FOLDER_INDEX: {
     SCENELAYER: "3dSceneLayer.json.gz",
     NODE: "3dNodeIndexDocument.json.gz",
+    SHARED: "sharedResource.json.gz",
     FEATURES: "0.json.gz",
     GEOMETRIES: "0.bin.gz",
-    SHARED: "sharedResource.json.gz"
+    ATTRIBUTES: "0.bin.gz"
   }
 };
\ No newline at end of file
diff --git a/routes/nodes.js b/routes/nodes.js
index d8a4c039ebc6e4789bcd027b0c5981c72f59b7a3..15d5f06af1271cff5cd6b4d6f77c35f3b4d2d6cd 100644
--- a/routes/nodes.js
+++ b/routes/nodes.js
@@ -3,19 +3,43 @@ const getHandler = require('../src/handler');
 
 let router = express.Router();
 
-router.route("/").get((req, res) => {
+router.route("/:nodeid/?").get((req, res) => {
 
-  res.sendStatus(404);
-  res.end();
+  let param = req.params.nodeid;
+  let handler = getHandler(param);
+  handler(req, res);
+
+});
+
+router.route("/:nodeid/:resource").get((req, res) => {
+
+  let param = req.params.resource;
+  let handler = getHandler(param);
+  handler(req, res);
 
 });
 
-router.route("[/]?*/:leaf").get((req, res) => {
+router.route("/:nodeid/:resource/0").get((req, res) => {
 
-  let leaf = req.params.leaf;
-  let handler = getHandler(leaf);
+  let param = req.params.resource;
+  let handler = getHandler(param);
   handler(req, res);
 
 });
 
+router.route("/:nodeid/:resource/:resourceid/0").get((req, res) => {
+
+  let param = req.params.resource;
+  let handler = getHandler(param);
+  handler(req, res);
+
+});
+
+router.route("*").get((req, res) => {
+
+  res.sendStatus(404);
+  res.end();
+
+});
+
 module.exports = router;
\ No newline at end of file
diff --git a/routes/scenelayers.js b/routes/scenelayers.js
index a0c2f5b0b9cb9c309518902356e9f746728bca07..5ed3954d7aca930d95dbf46db676683689168a14 100644
--- a/routes/scenelayers.js
+++ b/routes/scenelayers.js
@@ -22,7 +22,7 @@ router.route("/").get((req, res) => {
 
 });
 
-router.route("/:layer").get((req, res) => {
+router.route("/:layer/layers/0").get((req, res) => {
 
   let handler = getHandler("layer");
   handler(req, res);
diff --git a/src/attributes.js b/src/attributes.js
new file mode 100644
index 0000000000000000000000000000000000000000..dcb3789996a5b366c6d179a7a9f95c8fc3f5c723
--- /dev/null
+++ b/src/attributes.js
@@ -0,0 +1,19 @@
+const config = require('../config');
+const fs = require('fs');
+
+const handle = (req, res) => {
+
+  let baseUrl = req.baseUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${baseUrl}/${req.params.nodeid}/${req.params.resource}/${req.params.resourceid}/${config.FOLDER_INDEX.ATTRIBUTES}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
+
+  res.set({
+    'Content-Disposition': 'attachment; filename=0.bin',
+    'Content-Type': 'application/octet-stream',
+    'Content-Encoding': 'gzip'
+  });
+  res.sendFile(resourse);
+
+};
+
+module.exports = handle;
\ No newline at end of file
diff --git a/src/default.js b/src/default.js
index e8d4fa20d7d538cc103d2ee8ac087316a7ac52c3..b9a11002ebd8f876cd838c7d1194e1e60e8dc24d 100644
--- a/src/default.js
+++ b/src/default.js
@@ -3,13 +3,9 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}${req.originalUrl}/${config.FOLDER_INDEX.NODE}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let originalUrl = req.originalUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${originalUrl}/${config.FOLDER_INDEX.NODE}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Type': 'application/json',
diff --git a/src/features.js b/src/features.js
index 545e3c30602029ba185e6c93d028d0a84c70b8a4..dd3e731281ce0ca934f61a9435630d2efa2bad5e 100644
--- a/src/features.js
+++ b/src/features.js
@@ -3,13 +3,9 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}${req.originalUrl}/${config.FOLDER_INDEX.FEATURES}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let baseUrl = req.baseUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${baseUrl}/${req.params.nodeid}/${req.params.resource}/${config.FOLDER_INDEX.FEATURES}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Type': 'application/json',
diff --git a/src/geometries.js b/src/geometries.js
index a9182dd263c0743790deb2a2a2baf5202ad227ef..c2bafda36b7890487f94e6dc1b503626e0dfdb75 100644
--- a/src/geometries.js
+++ b/src/geometries.js
@@ -3,13 +3,9 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}${req.originalUrl}/${config.FOLDER_INDEX.GEOMETRIES}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let baseUrl = req.baseUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${baseUrl}/${req.params.nodeid}/${req.params.resource}/${config.FOLDER_INDEX.GEOMETRIES}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Disposition': 'attachment; filename=0.bin',
diff --git a/src/handler.js b/src/handler.js
index dd5c68b611de6be00f45152b15416122f7943b83..73554cd0daadd1f8ba1af7e00448a9158e194aec 100644
--- a/src/handler.js
+++ b/src/handler.js
@@ -1,15 +1,17 @@
 const _default_ = require('./default');
+const shared = require('./shared');
 const features = require('./features');
 const geometries = require('./geometries');
-const shared = require('./shared');
+const attributes = require('./attributes');
 const layer = require('./layer');
 const layers = require('./layers');
 
 const handlers = {
   _default_: _default_,
+  shared: shared,
   features: features,
   geometries: geometries,
-  shared: shared,
+  attributes: attributes,
   layer: layer,
   layers: layers
 }
diff --git a/src/layer.js b/src/layer.js
index 66bb183728a4d447e6e7d591ba021ff5ff408c06..b6d5d3baa7f74051f6ab86247a38f53b0f81b5f4 100644
--- a/src/layer.js
+++ b/src/layer.js
@@ -3,13 +3,8 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}/scenelayers/${req.params.layer}/${config.FOLDER_INDEX.SCENELAYER}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let resourse = `${config.BASE_DIR}/scenelayers/${req.params.layer}/layers/0/${config.FOLDER_INDEX.SCENELAYER}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Type': 'application/json',
diff --git a/src/shared.js b/src/shared.js
index 2fa08a2f32ea946df5159316d4f89872acb080df..bb98e7937c46bdbf980ae02afabbc3e8b1f29952 100644
--- a/src/shared.js
+++ b/src/shared.js
@@ -3,13 +3,9 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}${req.originalUrl}/${config.FOLDER_INDEX.SHARED}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let baseUrl = req.baseUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${baseUrl}/${req.params.nodeid}/${req.params.resource}/${config.FOLDER_INDEX.SHARED}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Type': 'application/json',
diff --git a/views/sceneLayers.pug b/views/sceneLayers.pug
index 4abe40770401e621b64e7f655f80bdbde274f2bd..c338603960240090dccdbd6965b2760b1a1c99f6 100644
--- a/views/sceneLayers.pug
+++ b/views/sceneLayers.pug
@@ -7,4 +7,4 @@ style.
 ul
   each layer in layers
     li
-      a(href=`${layer}`)= layer
\ No newline at end of file
+      a(href=`${layer}/layers/0`)= layer
\ No newline at end of file