added aligned property.
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Log.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Log.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Main.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Main.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Options.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Options.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
old mode 100644
new mode 100755
index a05c50f..0114cd8
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
@@ -125,6 +125,7 @@
 					handlePackage(line);
 				} else if (line.startsWith("version: ")) {
 					handleVersion(line);
+					handleExtraProperty(line);
 				} else if (line.startsWith("installed: ")) {
 					handleInstalled(line);
 				} else if (line.startsWith("depends: ")) {
@@ -139,8 +140,11 @@
 					handleRecommends(line);
 				} else if (line.startsWith("keep: ")) {
 					handleKeep(line);
-				} else if (sumProperty != null && line.startsWith(sumProperty + ":")) {
-					handleSumProperty(line, sumProperty);
+				} else {
+					handleExtraProperty(line);
+					if (sumProperty != null && line.startsWith(sumProperty + ":")) {
+						handleSumProperty(line, sumProperty);
+					}
 				}
 			}
 		} catch (FileNotFoundException e) {
@@ -170,6 +174,12 @@
 		return currentRequest;
 	}
 
+	private void handleExtraProperty(String line) {
+		String[] values = line.split(":", 2);
+		assert values.length == 2;
+		currentIU.addExtraProperty(values[0].trim(), values[1].trim());
+	}
+
 	private void handleSumProperty(String line, String sumProperty) {
 		String value = line.substring(sumProperty.length() + 1).trim();
 		try {
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/IProvidedCapability.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/IProvidedCapability.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/IRequiredCapability.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/IRequiredCapability.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/InstallableUnit.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/InstallableUnit.java
old mode 100644
new mode 100755
index 771a17f..52f7740
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/InstallableUnit.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/InstallableUnit.java
@@ -11,6 +11,9 @@
  *******************************************************************************/
 package org.eclipse.equinox.p2.cudf.metadata;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public class InstallableUnit implements Comparable {
 
 	public static final IProvidedCapability[] NO_PROVIDES = new IProvidedCapability[0];
@@ -28,6 +31,8 @@
 
 	private long sumProperty;
 
+	private Map<String, String> properties = new HashMap<String, String>();
+
 	public InstallableUnit() {
 		super();
 	}
@@ -143,4 +148,12 @@
 	public void setSumProperty(long sumProperty) {
 		this.sumProperty = sumProperty;
 	}
+
+	public void addExtraProperty(String key, String value) {
+		this.properties.put(key, value);
+	}
+
+	public String getExtraPropertyValue(String key) {
+		return this.properties.get(key);
+	}
 }
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/NotRequirement.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/NotRequirement.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/ORRequirement.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/ORRequirement.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/ProvidedCapability.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/ProvidedCapability.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/RequiredCapability.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/RequiredCapability.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/Version.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/Version.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/VersionRange.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/VersionRange.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/CapabilityQuery.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/CapabilityQuery.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/Collector.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/Collector.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/IQueryable.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/IQueryable.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/MatchQuery.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/MatchQuery.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/Query.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/Query.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/QueryableArray.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/query/QueryableArray.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/AlignedMeasurementHelper.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/AlignedMeasurementHelper.java
new file mode 100755
index 0000000..434dc5d
--- /dev/null
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/AlignedMeasurementHelper.java
@@ -0,0 +1,119 @@
+package org.eclipse.equinox.p2.cudf.solver;
+
+import java.util.*;
+import org.eclipse.equinox.p2.cudf.metadata.InstallableUnit;
+
+public class AlignedMeasurementHelper {
+
+	private String firstLvlProperty;
+	private String secondLvlProperty;
+
+	protected Map<String, Map<String, List<InstallableUnit>>> clusterMap = new HashMap<String, Map<String, List<InstallableUnit>>>();
+
+	public AlignedMeasurementHelper(String firstLvlProperty, String secondLvlProperty) {
+		this.firstLvlProperty = firstLvlProperty;
+		this.secondLvlProperty = secondLvlProperty;
+	}
+
+	public void addIU(InstallableUnit iu) {
+		String firstLvlPropertyValue = iu.getExtraPropertyValue(this.firstLvlProperty);
+		String secondLvlPropertyValue = iu.getExtraPropertyValue(this.secondLvlProperty);
+		checkPropertyValuesAreNotNull(iu, firstLvlPropertyValue, secondLvlPropertyValue);
+		Map<String, List<InstallableUnit>> secondLevelMap = this.clusterMap.get(firstLvlPropertyValue);
+		if (secondLevelMap == null) {
+			secondLevelMap = new HashMap<String, List<InstallableUnit>>();
+			this.clusterMap.put(firstLvlPropertyValue, secondLevelMap);
+		}
+		List<InstallableUnit> ius = secondLevelMap.get(secondLvlPropertyValue);
+		if (ius == null) {
+			ius = new ArrayList<InstallableUnit>();
+			secondLevelMap.put(secondLvlPropertyValue, ius);
+		}
+		ius.add(iu);
+	}
+
+	private void checkPropertyValuesAreNotNull(InstallableUnit iu, String firstLvlPropertyValue, String secondLvlPropertyValue) {
+		if ((firstLvlPropertyValue == null) || (secondLvlPropertyValue == null)) {
+			String exceptionMessage1 = (firstLvlPropertyValue == null) ? ("IU \"" + iu.toString() + "\" has no property \"" + this.firstLvlProperty + "\"") : ("");
+			String exceptionMessage2 = (secondLvlPropertyValue == null) ? ("IU \"" + iu.toString() + "\" has no property \"" + this.secondLvlProperty + "\"") : ("");
+			String exceptionMessageSep = ((firstLvlPropertyValue == null) || (secondLvlPropertyValue == null)) ? ("") : ("\n");
+			String exceptionMessage = exceptionMessage1 + exceptionMessageSep + exceptionMessage2;
+			throw new IllegalArgumentException(exceptionMessage);
+		}
+	}
+
+	public Iterator<List<InstallableUnit>> firstLvlClustersIterator() {
+		return new FirstLvlClusterIUsIterator();
+	}
+
+	public Iterator<List<InstallableUnit>> secondLvlClustersIterator() {
+		return new SecondLvlClusterIUsIterator();
+	}
+
+	private class FirstLvlClusterIUsIterator implements Iterator<List<InstallableUnit>> {
+
+		private Iterator<String> clusterMapKeysetIt;
+
+		public FirstLvlClusterIUsIterator() {
+			this.clusterMapKeysetIt = clusterMap.keySet().iterator();
+		}
+
+		public boolean hasNext() {
+			return this.clusterMapKeysetIt.hasNext();
+		}
+
+		public List<InstallableUnit> next() {
+			String currentKey = this.clusterMapKeysetIt.next();
+			List<InstallableUnit> res = new ArrayList<InstallableUnit>();
+			Map<String, List<InstallableUnit>> secondLvlMap = clusterMap.get(currentKey);
+			Iterator<String> secondLvlMapKeysetIt = secondLvlMap.keySet().iterator();
+			while (secondLvlMapKeysetIt.hasNext()) {
+				res.addAll(secondLvlMap.get(secondLvlMapKeysetIt.next()));
+			}
+			return res;
+		}
+
+		public void remove() {
+			throw new UnsupportedOperationException();
+		}
+
+	}
+
+	private class SecondLvlClusterIUsIterator implements Iterator<List<InstallableUnit>> {
+
+		private Iterator<String> clusterMapKeysetIt;
+
+		private Iterator<String> currentClusterKeysetIt = null;
+
+		private Map<String, List<InstallableUnit>> secondLvlMap;
+
+		public SecondLvlClusterIUsIterator() {
+			this.clusterMapKeysetIt = clusterMap.keySet().iterator();
+			if (this.clusterMapKeysetIt.hasNext()) {
+				nextSecondLvlIt();
+			}
+		}
+
+		public boolean hasNext() {
+			return this.clusterMapKeysetIt.hasNext() || (this.currentClusterKeysetIt != null && this.currentClusterKeysetIt.hasNext());
+		}
+
+		public List<InstallableUnit> next() {
+			if (!this.currentClusterKeysetIt.hasNext()) {
+				nextSecondLvlIt();
+			}
+			return new ArrayList<InstallableUnit>(this.secondLvlMap.get(this.currentClusterKeysetIt.next()));
+		}
+
+		private void nextSecondLvlIt() {
+			String firstKey = this.clusterMapKeysetIt.next();
+			this.secondLvlMap = clusterMap.get(firstKey);
+			this.currentClusterKeysetIt = secondLvlMap.keySet().iterator();
+		}
+
+		public void remove() {
+			throw new UnsupportedOperationException();
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Explanation.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Explanation.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/ExplanationJob.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/ExplanationJob.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Messages.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Messages.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
old mode 100644
new mode 100755
index 089498e..4da784c
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
@@ -31,6 +31,8 @@
 	protected List unmetVariables = new ArrayList();
 	protected List upVariables = new ArrayList();
 	protected List downVariables = new ArrayList();
+	protected List firstLvlAlignedVariables = new ArrayList();
+	protected List secondLvlAlignedVariables = new ArrayList();
 	protected List optionalityVariables;
 	protected List optionalityPairs;
 
@@ -328,6 +330,78 @@
 		}
 	}
 
+	protected void aligned(List weightedObjects, boolean minimize, InstallableUnit metaIu, String prop1, String prop2) {
+		AlignedMeasurementHelper helper = new AlignedMeasurementHelper(prop1, prop2);
+		fillHelper(metaIu, helper);
+		processOnSecondLvlClusters(weightedObjects, minimize, helper);
+		processOnFirstLvlClusters(weightedObjects, minimize, helper);
+	}
+
+	private void processOnFirstLvlClusters(List weightedObjects, boolean minimize, AlignedMeasurementHelper helper) {
+		Iterator<List<InstallableUnit>> firstLvlClusterIt = helper.firstLvlClustersIterator();
+		int cpt = 0;
+		BigInteger weight = (!minimize) ? (BigInteger.ONE) : (BigInteger.valueOf(-1));
+		while (firstLvlClusterIt.hasNext()) {
+			List<InstallableUnit> ius = firstLvlClusterIt.next();
+			if (ius.size() > 1) {
+				try {
+					Projector.AbstractVariable abs = new Projector.AbstractVariable("aligned_lvl1_" + cpt);
+					firstLvlAlignedVariables.add(abs);
+					dependencyHelper.or("align_lvl1", abs, ius.toArray());
+					weightedObjects.add(WeightedObject.newWO(abs, weight));
+				} catch (ContradictionException e) {
+					// should never happen
+					e.printStackTrace();
+				}
+				++cpt;
+			} else {
+				InstallableUnit iu = ius.get(0);
+				firstLvlAlignedVariables.add(iu);
+				weightedObjects.add(WeightedObject.newWO(iu, weight));
+			}
+		}
+	}
+
+	private void processOnSecondLvlClusters(List weightedObjects, boolean minimize, AlignedMeasurementHelper helper) {
+		Iterator<List<InstallableUnit>> secondLvlClusterIt = helper.secondLvlClustersIterator();
+		int cpt = 0;
+		BigInteger weight = (minimize) ? (BigInteger.ONE) : (BigInteger.valueOf(-1));
+		while (secondLvlClusterIt.hasNext()) {
+			List<InstallableUnit> ius = secondLvlClusterIt.next();
+			if (ius.size() > 1) {
+				try {
+					Projector.AbstractVariable abs = new Projector.AbstractVariable("aligned_lvl2_" + cpt);
+					secondLvlAlignedVariables.add(abs);
+					dependencyHelper.or("align_lvl2", abs, ius.toArray());
+					weightedObjects.add(WeightedObject.newWO(abs, weight));
+				} catch (ContradictionException e) {
+					// should never happen
+					e.printStackTrace();
+				}
+				++cpt;
+			} else {
+				InstallableUnit iu = ius.get(0);
+				secondLvlAlignedVariables.add(iu);
+				weightedObjects.add(WeightedObject.newWO(iu, weight));
+			}
+
+		}
+	}
+
+	private void fillHelper(InstallableUnit metaIu, AlignedMeasurementHelper helper) {
+		Set s = slice.entrySet();
+		for (Iterator iterator = s.iterator(); iterator.hasNext();) {
+			Map.Entry entry = (Map.Entry) iterator.next();
+			if (entry.getKey() == metaIu.getId())
+				continue;
+			Collection versions = ((HashMap) entry.getValue()).values();
+			for (Iterator iterator2 = versions.iterator(); iterator2.hasNext();) {
+				InstallableUnit iuv = (InstallableUnit) iterator2.next();
+				helper.addIU(iuv);
+			}
+		}
+	}
+
 	public abstract String getName();
 
 }
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/P2OptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/P2OptimizationFunction.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Pair.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Pair.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/ParanoidOptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/ParanoidOptimizationFunction.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/ProfileChangeRequest.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/ProfileChangeRequest.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Projector.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Projector.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/SimplePlanner.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/SimplePlanner.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Slicer.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Slicer.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/SolverConfiguration.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/SolverConfiguration.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Tracing.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/Tracing.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/TrendyOptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/TrendyOptimizationFunction.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/TwoTierMap.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/TwoTierMap.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java
old mode 100644
new mode 100755
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction2012.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction2012.java
old mode 100644
new mode 100755
index 53005a5..679246e
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction2012.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction2012.java
@@ -58,6 +58,16 @@
 				weightedObjects.clear();
 				down(weightedObjects, criteria[i].startsWith("+") ? currentWeight.negate() : currentWeight, metaIu);
 				currentWeight = currentWeight.divide(weight);
+			} else if (criteria[i].contains("aligned")) {
+				weightedObjects.clear();
+				StringTokenizer tokenizer = new StringTokenizer(criteria[i].substring(9), ";)");
+				// tokenizer.nextToken();
+				String prop1 = tokenizer.nextToken();
+				String prop2 = tokenizer.nextToken();
+				aligned(weightedObjects, criteria[i].charAt(0) == '-', metaIu, prop1, prop2);
+				dependencyHelper.addWeightedCriterion(weightedObjects);
+				System.out.println("# criteria " + criteria[i].substring(1) + " size is " + weightedObjects.size());
+				continue;
 			} else if (criteria[i].contains("sum")) {
 				weightedObjects.clear();
 				sum(weightedObjects, criteria[i].charAt(0) == '-', metaIu, Options.extractSumProperty(criteria[i]));
@@ -220,6 +230,25 @@
 				System.out.println("# " + criteria[i] + " criteria value: " + sum);
 				continue;
 			}
+
+			if (criteria[i].endsWith("aligned")) {
+				proof.clear();
+				counter = 0;
+				for (int j = 0; j < secondLvlAlignedVariables.size(); j++) {
+					Object var = secondLvlAlignedVariables.get(j);
+					if (dependencyHelper.getBooleanValueFor(var)) {
+						counter++;
+					}
+				}
+				for (int j = 0; j < firstLvlAlignedVariables.size(); j++) {
+					Object var = firstLvlAlignedVariables.get(j);
+					if (dependencyHelper.getBooleanValueFor(var)) {
+						counter--;
+					}
+				}
+				System.out.println("# " + criteria[i] + " criteria value: " + counter);
+				continue;
+			}
 		}
 	}
 }