diff --git a/classes/Endpoint.php b/classes/Endpoint.php
index 42da91c4934ac26e60573d6264e68f4e562c3c1e..d05c38658e95de4b89059033c37f142446728dc1 100644
--- a/classes/Endpoint.php
+++ b/classes/Endpoint.php
@@ -42,6 +42,9 @@ class Endpoint{
         if(preg_match("/describe/i", $q)){
           return $aux;
         }
+        if(preg_match("/construct/i", $q)){
+          return $aux;
+        }
   }
   
   public function queryPost($q){
diff --git a/classes/Utils.php b/classes/Utils.php
index 7e49e97b9c2e396641cecf5507553c677f2342b1..2cd85bc6f90a57f67ced7b817d380df0d4b4a452 100644
--- a/classes/Utils.php
+++ b/classes/Utils.php
@@ -156,12 +156,39 @@ class Utils{
   	return $ct;
   }
   
+  
+  private static function travelTree($tree){
+  	$results = array();
+  	if(is_string($tree)){
+  	  return $tree;
+  	}
+  	foreach($tree as $t){
+  	  $aux = Utils::travelTree($t);
+  	  if(is_array($aux)){
+  	  	$results = array_merge($results, $aux);
+  	  }else{
+  	  	array_push($results, $aux);
+  	  }
+  	}
+  	return $results;
+  }
+  
+  
   private static function serializeRdf($data, $extension){
   	global	$conf;
-  	require('lib/arc2/ARC2.php');
+  	$ser;
+  	$dPointer;
+  	$docs = Utils::travelTree($data);
+  	require_once('lib/arc2/ARC2.php');
   	$parser = ARC2::getRDFParser();
-  	$parser->parse($conf['basedir'], $data);
-  	$triples = $parser->getTriples();
+  	 $triples = array();
+  	 
+  	foreach($docs as $d){
+  	  $parser->parse($conf['basedir'], $d);
+  	  $t = $parser->getTriples();
+  	  $triples = array_merge($triples, $t);
+  	}
+
   	if($conf['mirror_external_uris']){
   	  global $uri;
   	  global $localUri;
@@ -175,7 +202,6 @@ class Utils{
   	  $t['p']      = "http://www.w3.org/2000/10/swap/pim/contact#preferredURI";
   	  array_push($triples, $t);
   	}
-  	$ser;
   	switch ($extension){
   	case 'ttl':
   	  $ser = ARC2::getTurtleSerializer();
@@ -200,7 +226,7 @@ class Utils{
   	$extension = Utils::getExtension($contentType); 
   	
   	header('Content-Type: '.$contentType);
-  	if(!is_object($data)){
+  	if($extension != 'html'){
   	  $data = Utils::serializeRdf($data, $extension);
   	}
   	Utils::showView($base, $data, $viewFile);  	
@@ -265,16 +291,18 @@ class Utils{
   	}
   	closedir($handle);
   	$originalDir = $base['model']['directory'];
-  	foreach($subDirs as $v){
-  	  if(!isset($r[$modelDir])){
-  	  	$r[$modelDir] = array();
-  	  }
-  	  if($modelDir != $base['type']){
-  	  	Utils::queryDir($v, $r[$modelDir]);
-  	  }else{
-  	  	Utils::queryDir($v, $r);
-  	  }
-  	}  	
+  	if(isset($subDIrs)){
+  	  foreach($subDirs as $v){
+  	  	if(!isset($r[$modelDir])){
+  	  	  $r[$modelDir] = array();
+  	  	}
+  	  	if($modelDir != $base['type']){
+  	  	  Utils::queryDir($v, $r[$modelDir]);
+  	  	}else{
+  	  	  Utils::queryDir($v, $r);
+  	  	}
+  	  }  	
+  	}
   	chdir($conf['home']);
   	//return $data;
   }
@@ -288,8 +316,6 @@ class Utils{
   	$uri = $base['this']['value'];
   	$data = array();
   	$strippedModelFile = str_replace('.query', '',$modelFile); 	  
-
-  	
  	if(!is_dir($modelFile)){
   	  require_once($conf['home'].'lib/Haanga/lib/Haanga.php');
   	  Haanga::configure(array(
@@ -306,12 +332,73 @@ class Utils{
   	  $r = Convert::array_to_object($r2);
   	  $f = Convert::array_to_object($first);
  	  $vars = compact('uri', 'base', 'r', 'f');
+ 	  
  	  $fnc = Haanga::compile(file_get_contents($modelFile));
   	  $query = $fnc($vars, TRUE);
+  	  
   	  if(is_object($base)){
   	  	$baseObj = Convert::object_to_array($base);
   	    $base = $baseObj;
   	  }
+  	  
+  	  
+  	  if($base['transform_select_query']==true){
+  	  	include_once($conf['home'].'lib/arc2/ARC2.php');
+  	  	$parser = ARC2::getSPARQLParser();
+  	  	$parser->parse($query);
+  	  	$sparqlConstruct = array();
+  	  	if (!$parser->getErrors()) {
+  	  	  $resultVars = array();
+  	  	  $q_infos = $parser->getQueryInfos();
+  	  	  foreach($q_infos['query']['result_vars'] as $v){
+  	  	  	if($v['type'] == 'var'){
+  	  	  	  $resultVars[$v['value']] = 1;
+  	  	  	}
+  	  	  };
+  	  	  $x = Utils::extractTriples($q_infos['query']['pattern']);
+  	  	  foreach($x as $v){
+  	  	  	if(($resultVars[$v['s']] && $v['s_type'] == 'var')
+  	  	  	  || ($resultVars[$v['p']] && $v['p_type'] == 'var')
+	  	  	|| ($resultVars[$v['o']] && $v['o_type'] == 'var')){
+	  	  	array_push($sparqlConstruct, $v);
+	  	  	}	  	  
+	  	  }
+	  	  $construct = "";
+	  	  foreach($sparqlConstruct as $v){
+	  	  	if($v['s_type'] == 'uri'){
+	  	  	  $construct .= "<".$v['s']."> ";
+	  	  	}elseif($v['s_type'] == 'var'){
+	  	  	  $construct .= '?'.$v['s'].' ';
+	  	  	}else{
+	  	  	  $construct.= $v['s']." ";
+	  	  	}
+	  	  	
+	  	  	if($v['p_type'] == 'uri'){
+	  	  	  $construct .= "<".$v['p']."> ";
+	  	  	}elseif($v['p_type'] == 'var'){
+	  	  	  $construct .= '?'.$v['p'].' ';
+	  	  	}else{
+	  	  	  $construct.= $v['p']." ";
+	  	  	}
+	  	  	
+	  	  	if($v['o_type'] == 'uri'){
+	  	  	  $construct .= "<".$v['o']."> ";
+	  	  	}elseif($v['o_type'] == 'literal'){
+	  	  	  $construct .= '"'.$v['o'].'" ';
+	  	  	}elseif($v['o_type'] == 'var'){
+	  	  	  $construct .= '?'.$v['o'].' ';
+	  	  	}else{
+	  	  	  $construct.= $v['o']." ";
+	  	  	}
+	  	  	
+	  	  	$construct .= ".\n";
+	  	  }
+	  	  $query = preg_replace('/select.*where/i', 'CONSTRUCT {'.$construct.'} WHERE', $query);
+	  	}else {
+	  	  Utils::send500("invalid query: " . $parser->getErrors());
+	  	}
+	  }
+	  
   	  if($conf['debug']){
   	  	echo $query;
   	  }
@@ -395,8 +482,11 @@ class Utils{
   
   public static function showView($baseData, $data, $view){
   	global $conf;
+  	global $uri;
+  	global $extension;
   	$base = $conf['view']['standard'];
   	$base = $baseData;
+  	
   	if(isset($baseData['params'])){
   	  $base['this']['params'] = $baseData['params'];
   	}
@@ -408,11 +498,13 @@ class Utils{
   	$r = $data;
   	$first = $base['first'];
   	unset($base['first']);
-  	$vars = compact('base', 'r', 'first');
+  	$vars = compact('uri','base', 'r', 'first');
  	if($conf['debug']){
  	  var_dump($vars); 	
  	}
-	if(is_file($base['view']['directory'].$view)){
+	if(is_string($data)){
+	  echo($data);
+	}elseif(is_file($base['view']['directory'].$view)){
 	  Haanga::Load($view, $vars);
 	}else{
 	  $fnc = Haanga::compile($view);
@@ -421,7 +513,25 @@ class Utils{
   	
   }
   
-    
+  private static function extractTriples($obj){
+  	$triples = array();
+  	if(is_array($obj)){
+  	  foreach($obj as $k => $v){
+  	  	if($v['type'] != 'triple'){
+  	  	  $aux = Utils::extractTriples($v);
+  	  	  if($aux['type'] != 'triple'){
+  	  	  	$triples = array_merge($triples,$aux);
+  	  	  }else{
+  	  	  	$triples = array_merge($triples, $aux);
+  	  	  }
+  	  	}else{  	  	
+  	  	  array_push($triples, $v);
+  	  	}
+  	  }
+  	}
+  	return $triples;
+  }
+  
 }
 
 ?>
diff --git a/modules/classModule.php b/modules/classModule.php
index 66ae43d9f7415738af93833fb2461caad8195ee7..3f4d7a55da2d50d4893e0ed38cefb53c8a39de46 100644
--- a/modules/classModule.php
+++ b/modules/classModule.php
@@ -63,12 +63,16 @@ class ClassModule extends abstractModule{
   	
   	list($modelFile, $viewFile) = $this::getModelandView($t, $extension);
   	$base = $conf['view']['standard'];
+  	if($viewFile == null){
+  	  	  $base['transform_select_query'] = true;
+  	}
   	$base['type'] = $modelFile;
   	$base['this']['value'] = $uri;
   	$base['this']['curie'] = Utils::uri2curie($uri);
   	$base['thislocal']['value'] = $localUri;
   	$base['thislocal']['curie'] = Utils::uri2curie($localUri);
   	
+  	$base['this']['extension'] = $extension;
   	$base['this']['contentType'] = $acceptContentType;
   	$base['model']['directory'] = $conf['model']['directory'];
   	$base['view']['directory'] = $conf['view']['directory'];
@@ -95,6 +99,7 @@ class ClassModule extends abstractModule{
   	global $conf;
   	global $results;
   	global $rPointer;
+  	global $base;
   	//Defining default views and models
   	$curieType="";
   	$modelFile = 'class.rdfs:Resource/'.$extension.'.queries';
@@ -117,6 +122,13 @@ class ClassModule extends abstractModule{
   	  	$viewFile = $conf['class']['prefix'].$v.'/'.$extension.'.template';
   	  	$modelFile = $conf['class']['prefix'].$v.'/'.$extension.'.queries';
   	  	break;
+  	  }elseif($extension != 'html' &&
+  	  	file_exists($conf['view']['directory'].$conf['class']['prefix'].$v.'/html.template') &&
+  	  	file_exists($conf['model']['directory'].$conf['class']['prefix'].$v.'/html.queries') && $v != null){
+  	  $modelFile = $conf['class']['prefix'].$v.'/html.queries';
+  	  $viewFile = null;//$conf['class']['prefix'].$v.'/html.queries';
+  	  trigger_error("LODSPeaKr can't find the proper query. Using HTML query instead.", E_USER_NOTICE);
+  	  break;
   	  }
   	}
   	return array($modelFile, $viewFile);
diff --git a/utils/ldspkr.sh b/utils/ldspkr.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b06509735d02563334c918caf8a26a3fd52ca00b
--- /dev/null
+++ b/utils/ldspkr.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+USAGE="Usage: $0 create|delete uri|class|service foo [html|rdf|ttl|nt|json]"
+formats=( html rdf ttl nt json all )
+operations=( create delete )
+modules=( class service uri )
+
+currentOperation=
+currentFormat=
+currentModule=
+
+if [[ ${operations[@]} =~ $1 ]]
+then
+  currentOperation=$1
+else
+  echo "Operation \"$1\" not valid"
+  echo $USAGE
+  exit 1
+fi
+
+if [[ ${modules[@]} =~ $2 ]]
+then
+  currentModule=$2
+else
+  echo "Module \"$2\" not valid"
+  echo $USAGE
+  exit 1
+fi
+
+if [[ ${formats[@]} =~ $4 ]]
+then
+  currentFormat=$4 
+else
+  if [ -z "$4" ]
+  then
+    currentFormat="all"
+  else
+    echo "Format \"$4\" not valid"
+  echo $USAGE
+    exit 1
+  fi
+fi
+
+
+currentUnit=$3
+
+
+if [[ $currentOperation == "create" ]]
+then
+      $DIR/modules/create-$currentModule.sh "$currentUnit" "$currentFormat"
+fi
+if [[ $currentOperation == "delete" ]]
+then
+      $DIR/modules/delete-$currentModule.sh "$currentUnit" "$currentFormat"
+fi
+
+
diff --git a/utils/modules/create-class.sh b/utils/modules/create-class.sh
index bf86e068b9aac12456651e27ff76e4d85ac0ae9d..a39ae2664e46b909042ac444880ecc8580794eca 100755
--- a/utils/modules/create-class.sh
+++ b/utils/modules/create-class.sh
@@ -76,7 +76,7 @@ DESCRIBE ?resource WHERE {
 QUERY)
 
 viewRdf=$(cat <<VIEW
-{{r|safe}}
+{{r.main|safe}}
 VIEW)
 
 modelTtl=$modelRdf