diff --git a/targets/PROJECTS/TDDREC/calibration_beamforming.m b/targets/PROJECTS/TDDREC/beamforming.m
similarity index 57%
rename from targets/PROJECTS/TDDREC/calibration_beamforming.m
rename to targets/PROJECTS/TDDREC/beamforming.m
index 44195036696c578851229ac58996a467351ed06c..1210ad2b1c195bb5df1a5704a9f39de81f830129 100644
--- a/targets/PROJECTS/TDDREC/calibration_beamforming.m
+++ b/targets/PROJECTS/TDDREC/beamforming.m
@@ -1,122 +1,93 @@
-initparams;
-N = 100; % N is number ofr time-measurements
-Nt = 3; % Nt is the number of antennas at node B
-N_loc = 3; %check
-CHA2B = {}; %this should be a cell array
-CHB2A = {}; %this should be a cell array
-
-% run measurements for all location
-for loc = 1:N_loc
-    run_measwoduplex;
-    % alternatively load the measurements from file for testing
-    % now you should have chanestA2B, fchanestA2B, tchanestA2B, chanestB2A,
-    % fchanestB2A, tchanestB2A
-    CHA2B{loc} = chanestA2B; %to check
-    CHA2B{loc} = chanestA2B; %to check
-    disp('Please move the antenna to another location and press key when finished')
-    pause
-end
-
-%% calculate full F matrix
-for s=1:301
-	[F, HA]=alterproj(CHB2A,CHA2B, s, N, N_loc, Nt); 
-	Fs{s}=F;
-	HAs{s}=HA;
-end
-
-%% plot F
-figure(1)
-clf
-hold on;
-for s=1:size(Fs,3);
-  F=Fs(:,:,s);
-  plot(diag(F),'bo')
-  plot(diag(F,1),'r+')
-  plot(diag(F,2),'gx')
-end
-%axis([-1 1 -1 1])
-hold off;
-
-% do some beamforming
-signalA2B=zeros(N,4);
-signalB2A=zeros(N,4);
-signalB2A_prec=zeros(N,4);
-
-%%----------Node A to B transmission---------%%
-for i=1:4
-    if(indA(ia)==i)
-        [Da2b_T, tmps]=genrandpskseq(N,M,amp);
-        signalA2B(:,i)=tmps*2; %make sure LSB is 0 (switch=tx)
-    else
-        signalA2B(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
-    end
-end
-
-oarf_send_frame(card,signalA2B,n_bit);
-%keyboard
-sleep(0.01);
-receivedA2B=oarf_get_frame(card);
-%oarf_stop(card); %not good, since it does a reset
-sleep(0.01);
-
-%% ------- Do the A to B channel estimation ------- %%
-for i=0:119;
-    ifblock=receivedA2B(i*640+[1:640],indB);
-    ifblock(1:128,:)=[];
-    fblock=fft(ifblock);
-    fblock(1,:)=[];
-    fblock(151:360,:)=[];
-    Da2b_R=vec(fblock);
-end
-chanestsA2B=reshape(diag(repmat(Da2b_T,Nantb)'*Da2b_R)/size(Da2b_T,1),301,Nantb);
-%fchanestsA2B(:,:,meas)=[zeros(1,Nantb); chanestsA2B([1:150],:,meas); zeros(210,Nantb); chanestsA2B(151:301,:,meas)];
-%tchanestsA2B(:,:,meas)=ifft(fchanestsA2B(:,:,meas));
-
-%% calculate beamformer based on chanestA2B 
-for i=1:301
-    YA=squeeze(chanestA2B(i,:,:));
-    F=Fs(:,:,i);
-    Bd(:,i) = conj(F*YA);
-end
-
-%% generate normal and beamformed signals
-[seqf, tmps]=genrandpskseq(N,M,amp);
-for i=1:size(seqf,1)
-    % precoding
-    for j=1:size(seqf,2)
-        symbol_prec(:,j)=Bd(:,j)*seqf(i,j);
-    end
-    % insert zero subcarriers
-    symbol_prec=cat(2,zeros(3,1),symbol_prec(:,1:150),zeros(3,210),symbol_prec(:,151:301));
-    % ofdm modulation
-    symbol_prec_t=ifft(symbol_prec,512,2);
-    % Adding cycl. prefix making the block of 640 elements
-    symbol_prec_cp = cat(2,symbol_prec_t(:,end-127:end), symbol_prec_t);
-    tmps_prec(:,[1:640]+i*640)=floor(amp*symbol_prec_cp);
-end
-
-for i=1:4
-    if(indB(ib)==i)
-        signalB2A(:,i)=tmps*2; %make sure LSB is 0 (switch=tx)
-        signalB2A_prec(:,i)=tmps_prec(i,:)*2; %make sure LSB is 0 (switch=tx)
-    else
-        signalB2A(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
-        signalB2A_prec(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
-    end
-end
-
-%% send normal signal
-oarf_send_frame(card,signalB2A,n_bit);
-%keyboard
-sleep(0.01);
-receivedB2A=oarf_get_frame(card);
-sleep(0.01);
-% measure SNR
-
-%% send beamformed DL signal
-oarf_send_frame(card,signalB2A_prec,n_bit);
-%keyboard
-sleep(0.01);
-receivedB2A=oarf_get_frame(card);
-sleep(0.01);
-% measure SNR
+% do some beamforming
+signalA2B=zeros(N,4);
+signalB2A=zeros(N,4);
+signalB2A_prec=zeros(N,4);
+
+%%----------Node A to B transmission---------%%
+for i=1:4
+    if(active_rfA(i))
+        [Da2b_T, tmps]=genrandpskseq(N,M,amp);
+        signalA2B(:,i)=tmps*2; %make sure LSB is 0 (switch=tx)
+    else
+        signalA2B(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
+    end
+end
+
+oarf_send_frame(card,signalA2B,n_bit);
+%keyboard
+sleep(0.01);
+receivedA2B=oarf_get_frame(card);
+%oarf_stop(card); %not good, since it does a reset
+sleep(0.01);
+
+%% ------- Do the A to B channel estimation ------- %%
+for i=0:119;
+    ifblock=receivedA2B(i*640+[1:640],indB);
+    ifblock(1:128,:)=[];
+    fblock=fft(ifblock);
+    fblock(1,:)=[];
+    fblock(151:360,:)=[];
+    Da2b_R(i+1,:)=vec(fblock);
+end
+chanestsA2B=reshape(diag(repmat(Da2b_T,1,Nantb)'*Da2b_R)/size(Da2b_T,1),301,Nantb);
+%fchanestsA2B(:,:,meas)=[zeros(1,Nantb); chanestsA2B([1:150],:,meas); zeros(210,Nantb); chanestsA2B(151:301,:,meas)];
+%tchanestsA2B(:,:,meas)=ifft(fchanestsA2B(:,:,meas));
+
+%% calculate beamformer based on chanestA2B 
+for i=1:301
+    YA=chanestsA2B(i,:).';
+    F=Fs(:,:,i);
+    Bd(:,i) = conj(F*YA)./norm(F*YA);
+end
+
+%% generate normal and beamformed signals
+[seqf, tmps]=genrandpskseq(N,M,amp);
+for i=1:size(seqf,1)
+    % precoding
+    for j=1:size(seqf,2)
+        symbol_prec(:,j)=Bd(:,j)*seqf(i,j);
+    end
+    % insert zero subcarriers
+    symbol_prec=cat(2,zeros(3,1),symbol_prec(:,1:150),zeros(3,210),symbol_prec(:,151:301));
+    % ofdm modulation
+    symbol_prec_t=ifft(symbol_prec,512,2);
+    % Adding cycl. prefix making the block of 640 elements
+    symbol_prec_cp = cat(2,symbol_prec_t(:,end-127:end), symbol_prec_t);
+    tmps_prec(:,[1:640]+(i-1)*640)=floor(amp*symbol_prec_cp);
+end
+
+for i=1:4
+    if(active_rfB(i))
+      signalB2A(:,i)=floor(tmps/sqrt(3))*2; %make sure LSB is 0 (switch=tx)
+        signalB2A_prec(:,i)=tmps_prec(i-1,:)*2; %make sure LSB is 0 (switch=tx)
+    else
+        signalB2A(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
+        signalB2A_prec(:,i)=repmat(1+1j,76800,1); %make sure LSB is 1 (switch=rx)
+    end
+end
+
+%% send normal signal
+P_tx = 10*log10(sum(mean(abs(signalB2A(:,2:4)).^2)))
+oarf_send_frame(card,signalB2A,n_bit);
+%keyboard
+sleep(0.01);
+receivedB2A=oarf_get_frame(card);
+sleep(0.01);
+% measure SNR
+P_rx = 10*log10(mean(abs(receivedB2A(:,1)).^2))
+
+%% send beamformed DL signal
+P_tx_prec = 10*log10(sum(mean(abs(signalB2A_prec(:,2:4)).^2)))
+oarf_send_frame(card,signalB2A_prec,n_bit);
+%keyboard
+sleep(0.01);
+receivedB2A_prec=oarf_get_frame(card);
+sleep(0.01);
+% measure SNR
+P_rx_prec = 10*log10(mean(abs(receivedB2A_prec(:,1)).^2))
+
+figure(10)
+bar([P_tx P_tx_prec; P_rx P_rx_prec]);
+legend('normal','beamformed')
+ylim([0 60])
+drawnow
diff --git a/targets/PROJECTS/TDDREC/calibration.m b/targets/PROJECTS/TDDREC/calibration.m
new file mode 100644
index 0000000000000000000000000000000000000000..0efd5b9b8f6922e8ed8332bc49d0ff74cd58b283
--- /dev/null
+++ b/targets/PROJECTS/TDDREC/calibration.m
@@ -0,0 +1,38 @@
+initparams;
+N_loc = 3; %check
+CHA2B = {}; %this should be a cell array
+CHB2A = {}; %this should be a cell array
+
+% run measurements for all location
+for loc = 1:N_loc
+    runmeas_woduplex;
+    % alternatively load the measurements from file for testing
+    % now you should have chanestA2B, fchanestA2B, tchanestA2B, chanestB2A,
+    % fchanestB2A, tchanestB2A
+    CHA2B{loc} = chanestsA2B; %to check
+    CHB2A{loc} = chanestsB2A; %to check
+    disp('Please move the antenna to another location and press key when finished')
+    pause
+end
+
+%% calculate full F matrix
+Fs = zeros(Nantb,Nantb,301);
+for s=1:301
+	[F, HA]=alterproj(CHB2A,CHA2B, s, Nantb, N_loc, Nmeas); 
+        Fs(:,:,s)=F;
+	%HAs{s}=HA;
+end
+
+%% plot F
+figure(1)
+clf
+hold on;
+for s=1:size(Fs,3);
+  F=Fs(:,:,s);
+  plot(diag(F),'bo')
+  plot(diag(F,1),'r+')
+  plot(diag(F,2),'gx')
+end
+%axis([-1 1 -1 1])
+hold off;
+
diff --git a/targets/PROJECTS/TDDREC/initparams.m b/targets/PROJECTS/TDDREC/initparams.m
index b006a68d4c4b1a4fb1faea7a47edad319bbbf776..f059a903c410053ad0d8b36116eb690da9e8c177 100644
--- a/targets/PROJECTS/TDDREC/initparams.m
+++ b/targets/PROJECTS/TDDREC/initparams.m
@@ -2,19 +2,21 @@
 # % Organisation: Eurecom (and Linkoping University)
 # % E-mail: mirsad.cirkic@liu.se
 
-addpath('/homes/kaltenbe/Devel/openair/openair4G/trunk/targets/ARCH/EXMIMO/USERSPACE/OCTAVE');
+addpath([getenv('OPENAIR_TARGETS') '/ARCH/EXMIMO/USERSPACE/OCTAVE']);
+
+clear all
+close all
 
-clear
 paramsinitialized=false;
 limeparms;
-rxgain=0;
-txgain=10;
+rx_gain=[0 0 0 0];
+tx_gain=[20 20 20 20];
 eNB_flag = 0;
 card = 0;
 Ntrx=4;
 dual_tx=0;
 active_rfA=[1 0 0 0];
-active_rfB=[0 1 1 0];
+active_rfB=[0 1 1 1];
 active_rf=active_rfA+active_rfB;
 
 if(active_rfA*active_rfB'!=0) error("The A and B transceive chains must be orthogonal./n") endif
@@ -34,16 +36,17 @@ syncmode = SYNCMODE_FREE;
 rf_local = [8254744   8255063   8257340   8257340]; %eNB2tx 1.9GHz
 rf_vcocal=rf_vcocal_19G*active_rf;
 
-rffe_rxg_low = 61*active_rf;
-rffe_rxg_final = 61*active_rf;
+rffe_rxg_low = 63*active_rf;
+rffe_rxg_final = [30 40 30 20];
 rffe_band = B19G_TDD*active_rf;
 
 rf_rxdc = rf_rxdc*active_rf;
 
 freq_rx = fc*active_rf; 
 freq_tx = freq_rx; %+1.92e6;
-tx_gain = txgain.*active_rf;
-rx_gain = rxgain*active_rf;
+
+oarf_stop(card);
+sleep(0.1);
 oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,eNB_flag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal_mode);
 autocal_mode=0*active_rf; % Autocalibration is only needed the first time we conf. exmimo
 amp = pow2(14)-1;
diff --git a/targets/PROJECTS/TDDREC/runmeas_woduplex.m b/targets/PROJECTS/TDDREC/runmeas_woduplex.m
index b56a31e742efb21d1ffe2ffb2870f99db72f6a67..1ac5e3989074fe5432cf716aa4e8a0e71d64a2ba 100644
--- a/targets/PROJECTS/TDDREC/runmeas_woduplex.m
+++ b/targets/PROJECTS/TDDREC/runmeas_woduplex.m
@@ -21,7 +21,7 @@ if(paramsinitialized && ~LSBSWITCH_FLAG)
   if(Niter!=1) 
     error("We should only use one get_frame at each run.\n"); 
   endif
-  Nmeas = 100;
+  Nmeas = 10;
   
 # %% ------- Prepare the signals for A2B ---------- %%
   signalA2B=zeros(N,4);
@@ -54,17 +54,17 @@ if(paramsinitialized && ~LSBSWITCH_FLAG)
       Db2a_T=[Db2a_T tmpd];
       if(length(indB)> ib) ib=ib+1; endif
     endif   
-   endfor
+  endfor
 
-   if (!chanest_full)
+  if (!chanest_full)
      signalB2A(1:38400,3)=0;
      signalB2A(38401:end,2)=0;
      Db2a_T(1:60,302:end) = 0;
      Db2a_T(61:end,1:301) = 0;
-   end
+  end
 
-   Da2b_R=zeros(Niter*120,Nantb*301,Nmeas);
-   Db2a_R=zeros(Niter*120,Nanta*301,Nmeas);
+  Da2b_R=zeros(Niter*120,Nantb*301,Nmeas);
+  Db2a_R=zeros(Niter*120,Nanta*301,Nmeas);
 
 for meas=1:Nmeas
 # %% ------- Node A to B transmission ------- %%	
@@ -156,14 +156,16 @@ end
   plot(t,20*log10(abs(tchanests)))
   xlabel('time')
   ylabel('|h|')
-  legend('A->B1','A->B2','B1->A','B2->A');
+  legend('A->B1','A->B2','A->B3','B1->A','B2->A','B3->A');
+  %legend('A->B1','A->B2','B1->A','B2->A');
   
   figure(4)
   plot(20*log10(abs(fchanests)));
   ylim([40 100])
   xlabel('freq')
   ylabel('|h|')
-  legend('A->B1','A->B2','B1->A','B2->A');
+  legend('A->B1','A->B2','A->B3','B1->A','B2->A','B3->A');
+  %legend('A->B1','A->B2','B1->A','B2->A');
 
   if (0)
   figure(3)