diff --git a/scripts/schema.ts b/scripts/schema.ts
index 1a8ced75b1fadc8e461afd1d436addc168035dd1..c8a8d39e313e21ca36080e75a593b33b26787789 100755
--- a/scripts/schema.ts
+++ b/scripts/schema.ts
@@ -23,6 +23,7 @@
 import { Engine } from "../src/core/engine";
 import { PostgresAdapter } from "../src/adapter/postgres";
 import { ConfigParser } from "../src/util/configParser";
+import { QueryOpts, Query } from "../src/common/query";
 import * as path from "path";
 import * as fs from "fs";
 
@@ -37,13 +38,11 @@ const configFile = process.argv[2];
 const schemaFile = process.argv[3];
 const config = ConfigParser.parse(configFile);
 const referencePath = path.dirname(configFile);
-const engine = new Engine();
-const adapter = new  PostgresAdapter(config.connection);
 
-let schema = "";
+const engine = new Engine(config);
+const adapter = new PostgresAdapter(config.connection);
 
-config.metrics.forEach ((met) => engine.addMetric(met));
-config.dimensions.forEach ((dim) => engine.addDimension(dim));
+let schema = "";
 
 for (let i = 0; i < config.buildViews.length; ++i) {
     const view = config.buildViews[i].view;
@@ -77,11 +76,9 @@ for (let i = 0; i < config.buildViews.length; ++i) {
     const view = config.buildViews[i].view;
     const alias = config.buildViews[i].alias;
     if (!view.origin) {
-        const materializedView = engine.query({
-            metrics: view.metrics,
-            dimensions: view.dimensions,
-            clauses: view.clauses
-        });
+        const qOpt: QueryOpts = { metrics: view.metrics,dimensions: view.dimensions,
+            clauses: view.clauses };
+        const materializedView = engine.query(new Query(qOpt));
 
         const table = adapter.getQueryFromView(materializedView);
         let query = "-- View: " + alias + "\n";
diff --git a/src/adapter/postgres.spec.ts b/src/adapter/postgres.spec.ts
index acdd1a4f31e1532028f58a4b338848aed4a787f1..a1d08fe1a96d04cdee0f5926906d29e46a1b01ba 100644
--- a/src/adapter/postgres.spec.ts
+++ b/src/adapter/postgres.spec.ts
@@ -24,41 +24,36 @@ import { MonetAdapter, MonetConfig } from "./monet";
 import { Adapter } from "../core/adapter";
 import { Fixture as FixPostgres } from "../../test/postgres/fixture";
 import { Fixture as FixMonet } from "../../test/monet/fixture";
-import { ConfigParser } from "../util/configParser";
 import { adapterScenario } from "../../test/scenario";
 
 describe("Sql adapter", () => {
 
-    // Initializing
-    let config: any;
     let adapter: Adapter;
     let fixture;
     before(function (done): void {
-        // Arrow function not used to get acces to this and skip the test
-        const configPath =  process.env.BLENDB_SCHEMA_FILE;
-        config = ConfigParser.parse(configPath);
-        if (config.adapter === "postgres") {
-            fixture = new FixPostgres(config.connection);
-            fixture.load(config.loadViews, (err) => {
+
+        if (adapterScenario.config.adapter === "postgres") {
+            fixture = new FixPostgres(adapterScenario.config.connection);
+            fixture.load(adapterScenario.config.loadViews, (err) => {
                 if (err) {
                     throw err;
                 }
-                adapter = new PostgresAdapter(config.connection);
+                adapter = new PostgresAdapter(adapterScenario.config.connection);
                 done();
             });
         }
-        else if (config.adapter === "monet") {
-            fixture = new FixMonet(config.connection);
-            fixture.load(config.loadViews, (err) => {
+        else if (adapterScenario.config.adapter === "monet") {
+            fixture = new FixMonet(adapterScenario.config.connection);
+            fixture.load(adapterScenario.config.loadViews, (err) => {
                 if (err) {
                     throw err;
                 }
                 let parsedConfig: MonetConfig = {
-                    user: config.connection.user,
-                    dbname: config.connection.database,
-                    password: config.connection.password,
-                    host: config.connection.host,
-                    port: config.connection.port
+                    user: adapterScenario.config.connection.user,
+                    dbname: adapterScenario.config.connection.database,
+                    password: adapterScenario.config.connection.password,
+                    host: adapterScenario.config.connection.host,
+                    port: adapterScenario.config.connection.port
                 };
                 adapter = new MonetAdapter(parsedConfig);
                 done();
diff --git a/src/api/middlewares/engine.ts b/src/api/middlewares/engine.ts
index bec7ae41b46b62eb470d2d9a08079241e5238f5c..6230f2b6ac423376f342269cf3ce7980ba6064bc 100644
--- a/src/api/middlewares/engine.ts
+++ b/src/api/middlewares/engine.ts
@@ -28,13 +28,7 @@ import { Middleware } from "../types";
  * @param config - Parsed database schema.
  */
 export function EngineMw (config: ParsedConfig): Middleware {
-    let engine: Engine = new  Engine();
-
-    config.metrics.forEach ((met) => engine.addMetric(met));
-    config.dimensions.forEach ((dim) => engine.addDimension(dim));
-    config.views.forEach ((view) => engine.addView(view));
-    config.enumTypes.forEach ((enumt) => engine.addEnumType(enumt));
-    config.sources.forEach ((sourc) => engine.addSource(sourc));
+    let engine: Engine = new Engine(config);
 
     return function engineMiddleware(req, res, next) {
         req.engine = engine;
diff --git a/src/core/engine.spec.ts b/src/core/engine.spec.ts
index 6d8973a9f871635284a461bc3e807301fe9e19c4..5d459854b9684a75f297f75485204cdb92747e91 100644
--- a/src/core/engine.spec.ts
+++ b/src/core/engine.spec.ts
@@ -25,28 +25,10 @@ import { View } from "./view";
 import { engineScenario } from "../../test/scenario";
 
 describe("engine class", () => {
-    const engine = new Engine();
 
-    const met = engineScenario.metrics;
-    const dim = engineScenario.dimensions;
+    const engine = new Engine(engineScenario.config);
     const subdim = engineScenario.subDimensions;
-    const views = engineScenario.views;
 
-    for (let key in met){
-        if (met[key]){
-            engine.addMetric(met[key]);
-        }
-    }
-    for (let key in dim){
-        if (dim[key]){
-            engine.addDimension(dim[key]);
-        }
-    }
-    for (let key in views){
-        if (views[key]){
-            engine.addView(views[key]);
-        }
-    }
     for (let key in subdim){
         if (subdim[key]){
             engine.addDimension(subdim[key]);
@@ -166,7 +148,7 @@ describe("engine class", () => {
         expect(clause.filters[0]).to.have.property("target");
         expect(clause.filters[0]).to.have.property("value");
         expect(clause.filters[0]).to.have.property("operator");
-        expect(clause.filters[0].target).to.be.equal(dim["dim:client:name"]);
+        expect(clause.filters[0].target).to.be.equal(engine.getDimensionByName("dim:client:name"));
         expect(clause.filters[0].value).to.be.equal("Laci");
         expect(clause.filters[0].operator).to.be.equal(FilterOperator.EQUAL);
     });
@@ -183,7 +165,7 @@ describe("engine class", () => {
         expect(clause.filters[0]).to.have.property("target");
         expect(clause.filters[0]).to.have.property("operator");
         expect(clause.filters[0]).to.have.property("value");
-        expect(clause.filters[0].target).to.be.equal(met["met:product:avg:pricein"]);
+        expect(clause.filters[0].target).to.be.equal(engine.getMetricByName("met:product:avg:pricein"));
         expect(clause.filters[0].value).to.be.equal("0");
         expect(clause.filters[0].operator).to.be.equal(FilterOperator.NOTEQUAL);
     });
@@ -284,7 +266,7 @@ describe("engine class", () => {
             expect(clause.filters[0]).to.have.property("target");
             expect(clause.filters[0]).to.have.property("operator");
             expect(clause.filters[0]).to.have.property("value");
-            expect(clause.filters[0].target).to.be.equal(dim["dim:sell:datein"]);
+            expect(clause.filters[0].target).to.be.equal(engine.getDimensionByName("dim:sell:datein"));
             expect(clause.filters[0].value).to.be.equal("2018-02-17");
             expect(clause.filters[0].operator).to.be.equal(operators[op]);
         }
@@ -301,7 +283,7 @@ describe("engine class", () => {
             expect(clause.filters[0]).to.have.property("target");
             expect(clause.filters[0]).to.have.property("operator");
             expect(clause.filters[0]).to.have.property("value");
-            expect(clause.filters[0].target).to.be.equal(dim["dim:seller:id"]);
+            expect(clause.filters[0].target).to.be.equal(engine.getDimensionByName("dim:seller:id"));
             expect(clause.filters[0].value).to.be.equal("0");
             expect(clause.filters[0].operator).to.be.equal(operators[op]);
         }
diff --git a/src/core/engine.ts b/src/core/engine.ts
index 1678e216ca84e986db251db81163d7561fdeff27..799b736e7c62f0f5617fba58e629f2fe40c05bd6 100644
--- a/src/core/engine.ts
+++ b/src/core/engine.ts
@@ -28,6 +28,7 @@ import { Graph } from "../util/graph";
 import { EnumType, EnumTypeOptions} from "./enumType";
 import { Source , SourceStrOptions } from "./source";
 import { ViewHandler } from "../util/viewHandler";
+import { ParsedConfig } from "../util/configParser";
 
 /**
  * Represents the database schema from the BlenDB perspective.
@@ -39,26 +40,35 @@ import { ViewHandler } from "../util/viewHandler";
  */
 export class Engine {
     /** Set of views available in the database */
-    private views: View[] = [];
+    private views: View[];
     /** Set of metrics available in the database. */
-    private metrics: Metric[] = [];
+    private metrics: Metric[];
     /** Set of enumerable types available in the database. */
-    private enumTypes: EnumType[] = [];
+    private enumTypes: EnumType[];
     /** Set of dimensions available in the database. */
-    private dimensions: Dimension[] = [];
+    private dimensions: Dimension[];
     /** Set of sources available in the database. */
-    private sources: Source[] = [];
+    private sources: Source[];
     /** Graph which represents the database schema. */
     private graph: Graph;
 
     /** Constructs an empty database schema. */
-    constructor () {
+    constructor (config: ParsedConfig) {
+
+        this.graph = new Graph();
+
         this.enumTypes = [];
         this.views = [];
         this.metrics = [];
         this.dimensions = [];
         this.sources = [];
-        this.graph = new Graph();
+
+        config.metrics.forEach ((met) => this.addMetric(met));
+        config.dimensions.forEach ((dim) => this.addDimension(dim));
+        config.views.forEach ((view) => this.addView(view));
+        config.enumTypes.forEach ((enumt) => this.addEnumType(enumt));
+        config.sources.forEach ((sourc) => this.addSource(sourc));
+
     }
 
     /** Gets all the available */
diff --git a/src/util/scenarioHandler.ts b/src/util/scenarioHandler.ts
index f0b55945d495a56d9cae9c52cd8d969fa924b31c..a36b3459b9dda16557082bbc68dc50ce478e37c9 100644
--- a/src/util/scenarioHandler.ts
+++ b/src/util/scenarioHandler.ts
@@ -22,16 +22,9 @@ import { View } from "../core/view";
 import { Metric } from "../core/metric";
 import { Dimension } from "../core/dimension";
 import { Query } from "../common/query";
+import { ParsedConfig } from "./configParser";
 
 export interface EngineScenario {
-    /**
-     * All metrics from /config/*
-     */
-    metrics: {[key: string]: Metric};
-    /**
-     * All dimensions from /config/*
-     */
-    dimensions: {[key: string]: Dimension};
     /**
      * subDimensions from scenario
      */
@@ -44,10 +37,6 @@ export interface EngineScenario {
      * Dimension that does not exist on /config/*
      */
     wrongDim: Dimension;
-    /**
-     * All views from /config/*
-     */
-    views: {[key: string]: View};
     /**
      * Query that have all metrics and dimensions
      */
@@ -84,6 +73,10 @@ export interface EngineScenario {
      * A query that contains a subdimentions without a parent
      */
     queryNoParent: Query;
+    /**
+     * ParsedConfig that is load in scenario
+     */
+    config: ParsedConfig;
 }
 
 export interface AdapterScenario {
@@ -143,6 +136,10 @@ export interface AdapterScenario {
      * View that contains the seller id and how many sell's he has done
      */
     JoinWithAncestors: View;
+    /**
+     * ParsedConfig that is load in scenario
+     */
+    config: ParsedConfig;
 }
 
 export interface DataCtrlScenario {
diff --git a/test/scenario.ts b/test/scenario.ts
index 882c8405069fab3eab5e73ebe4e2772aa3f88a70..9d3831261bf23e218f7574e1e134734f9450624e 100644
--- a/test/scenario.ts
+++ b/test/scenario.ts
@@ -365,12 +365,9 @@ const viewActiveSeller = views["view:ActiveSeller"];
 // Exports
 
 export const engineScenario: EngineScenario = {
-    metrics: mets,
-    dimensions: dims,
     wrongMet: wrongMet,
     wrongDim: wrongDim,
     subDimensions: subdims,
-    views: views,
     queryMetsDims: queries["queryMetsDims"],
     queryNoMets: queries["queryNoMets"],
     queryNoDims: queries["queryNoDims"],
@@ -379,7 +376,8 @@ export const engineScenario: EngineScenario = {
     queryActive: queries["queryActive"],
     viewActiveSeller: viewActiveSeller,
     querySubDim: queries["querySubDim"],
-    queryNoParent: queries["queryNoParent"]
+    queryNoParent: queries["queryNoParent"],
+    config: config
 };
 
 export const adapterScenario: AdapterScenario = {
@@ -395,6 +393,7 @@ export const adapterScenario: AdapterScenario = {
     joinWithNoMetrics: joinWithNoMetrics,
     growOneView: growOneView,
     JoinWithAncestors:JoinWithAncestors,
+    config: config
 };
 
 export const dataCtrlScenario: DataCtrlScenario = {