diff --git a/ess/TraceWin.py b/ess/TraceWin.py
index d6df4ab2192c4e6e686236d96f7c604d1f64dc29..28c66bdcf2f4ac057f6ec211837c809bc50cfebe 100644
--- a/ess/TraceWin.py
+++ b/ess/TraceWin.py
@@ -577,10 +577,71 @@ class density_file:
         '''
         returns the average of the parameter
         weighted by how many Nruns in self and other object
+
+        This allows for different lengths of the two arrays..
         '''
         mine=getattr(self,param)
         new=getattr(other,param)
-        return (mine*self.Nrun+new*other.Nrun)/(self.Nrun+other.Nrun)
+        if len(mine)>len(new):
+            ret = mine.copy()
+            ret[:len(new)] = (mine[:len(new)]*self.Nrun+new*other.Nrun)/(self.Nrun+other.Nrun)
+        elif len(mine)<len(new):
+            ret = new.copy()
+            ret[:len(mine)] = (mine*self.Nrun+new[:len(mine)]*other.Nrun)/(self.Nrun+other.Nrun)
+        else:
+            ret = (mine*self.Nrun+new*other.Nrun)/(self.Nrun+other.Nrun)
+        return ret
+
+    def _sum_merge(self,other,param):
+        '''
+        returns the sum of the parameter
+
+        This allows for different lengths of the two arrays..
+        '''
+        mine=getattr(self,param)
+        new=getattr(other,param)
+        if len(mine)>len(new):
+            ret = mine.copy()
+            ret[:len(new)] += new
+        elif len(mine)<len(new):
+            ret = new.copy()
+            ret[:len(mine)] += mine
+        else:
+            ret = mine+new
+        return ret
+
+    def _concatenate_merge(self,other,param):
+        '''
+        returns the concatenation of the two matrices
+
+        This allows for different lengths of the two arrays/matrices..
+        '''
+        import numpy
+
+        mine=getattr(self,param)
+        new=getattr(other,param)
+        ret=numpy.zeros(( max([len(mine),len(new)]), len(mine[0])+len(new[0]) ))
+        ret[:len(mine),:len(mine[0])]=mine
+        ret[:len(new),len(mine[0]):]=new
+        return ret
+
+    def _fun_merge(self,other,function,param):
+        '''
+        returns the function applied on the parameter
+
+        This allows for different lengths of the two arrays..
+        '''
+        mine=getattr(self,param)
+        new=getattr(other,param)
+        if len(mine)>len(new):
+            ret = mine.copy()
+            ret[:len(new)] = function(mine[:len(new)],new)
+        elif len(mine)<len(new):
+            ret = new.copy()
+            ret[:len(mine)] = function(mine,new[:len(mine)])
+        else:
+            ret = function(mine,new)
+        return ret
 
     def merge(self,objects):
         '''
@@ -598,28 +659,31 @@ class density_file:
 
         # merge info..
         for o in objects:
+            if len(self.ib)<len(o.ib):
+                raise ValueError("Sorry, not implemented yet. Complain to Yngve")
+
             self.ib=self._avg_merge(o,'ib')
 
             # this looks strange to me, but it is what TraceWin does..
-            self.moy+=o.moy
-            self.moy2+=o.moy2
+            self.moy=self._sum_merge(o,'moy')
+            self.moy2=self._sum_merge(o,'moy')
 
-            self._max=numpy.maximum(self._max,o._max)
-            self._min=numpy.minimum(self._min,o._min)
+            self._max=self._fun_merge(o,numpy.maximum,'_max')
+            self._min=self._fun_merge(o,numpy.minimum,'_min')
 
             if self.version>=5:
                 # this looks strange to me, but it is what TraceWin does..
-                self.rms_size+=o.rms_size
-                self.rms_size2+=o.rms_size2
+                self.rms_size=self._sum_merge(o,'rms_size')
+                self.rms_size2=self._sum_merge(o,'rms_size2')
 
             if self.version>=6:
-                self.max_pos_moy=numpy.maximum(self.max_pos_moy,o.max_pos_moy)
-                self.min_pos_moy=numpy.minimum(self.min_pos_moy,o.min_pos_moy)
+                self.max_pos_moy=self._fun_merge(o,numpy.maximum,'max_pos_moy')
+                self.min_pos_moy=self._fun_merge(o,numpy.minimum,'min_pos_moy')
 
             if self.version>=7:
                 # this looks strange to me, but it is what TraceWin does..
-                self.rms_emit+=o.rms_emit
-                self.rms_emit2+=o.rms_emit2
+                self.rms_emit=self._sum_merge(o,'rms_emit')
+                self.rms_emit2=self._sum_merge(o,'rms_emit2')
 
             if self.version>=8:
                 # Warning: TraceWin does NOT merge these data in any way
@@ -631,22 +695,21 @@ class density_file:
             # particles are lost, because we have written zeroes for
             # the rest of the tables
 
-            # numpy.c_ == column stack objects..
-            self.lost=numpy.c_[self.lost,o.lost]
-            self.powlost=numpy.c_[self.powlost,o.powlost]
+            self.lost=self._concatenate_merge(o,'lost')
+            self.powlost=self._concatenate_merge(o,'powlost')
 
-            self.lost2+=o.lost2
-            self.powlost2+=o.powlost2
+            self.lost2=self._sum_merge(o,'lost2')
+            self.powlost2=self._sum_merge(o,'powlost2')
 
-            self.Minlost=numpy.minimum(self.Minlost,o.Minlost)
-            self.Maxlost=numpy.maximum(self.Maxlost,o.Maxlost)
-            self.Minpowlost=numpy.minimum(self.Minpowlost,o.Minpowlost)
-            self.Maxpowlost=numpy.maximum(self.Maxpowlost,o.Maxpowlost)
+            self.Minlost=self._fun_merge(o,numpy.minimum,'Minlost')
+            self.Maxlost=self._fun_merge(o,numpy.maximum,'Maxlost')
+            self.Minpowlost=self._fun_merge(o,numpy.minimum,'Minpowlost')
+            self.Maxpowlost=self._fun_merge(o,numpy.maximum,'Maxpowlost')
 
             # Note: We are ignoring tab/tabp data...
 
             # merge final info (make sure to do this last!)
-            self.Np+=o.Np
+            self.Np=self._sum_merge(o,'Np')
             self.Nrun+=o.Nrun
 
     def savetohdf(self,filename='Density.h5',group='TraceWin'):