 CollOfScalar equelleCUDA::operator+ (const CollOfScalar& lhs,
 					 const CollOfScalar& rhs)
 {
-    CudaArray val = lhs.val_ + rhs.val_;
+    //CudaArray val = lhs.val_ + rhs.val_;
     std::cout << "pluss completed\n";
-    return CollOfScalar(val);
+    return CollOfScalar(lhs.val_ + rhs.val_);
 }
 
 
 
 CollOfScalar equelleCUDA::operator-(const CollOfScalar& lhs, const CollOfScalar& rhs) {
-
-    CollOfScalar out = lhs;
-    kernelSetup s = out.setup();
-    minus_kernel <<<s.grid, s.block>>>(out.data(), rhs.data(), out.size());
-    return out;
-}
-
-//CollOfScalar equelleCUDA::operator+(const CollOfScalar& lhs, const CollOfScalar& rhs) {
-//
-//    CollOfScalar out = lhs;
-//    kernelSetup s = out.setup();
-//    plus_kernel <<<s.grid, s.block>>>(out.data(), rhs.data(), out.size());
-//    return out;
-//}
+    return CollOfScalar( lhs.val_ - rhs.val_);
+}
 
 CollOfScalar equelleCUDA::operator*(const CollOfScalar& lhs, const CollOfScalar& rhs) {
-
-    CollOfScalar out = lhs;
-    kernelSetup s = out.setup();
-    multiplication_kernel <<<s.grid, s.block>>>(out.data(), rhs.data(), out.size());
-    return out;
+    return CollOfScalar(lhs.val_ * rhs.val_);
 }
 
 CollOfScalar equelleCUDA::operator/(const CollOfScalar& lhs, const CollOfScalar& rhs) {
-
-    CollOfScalar out = lhs;
-    kernelSetup s = out.setup();
-    division_kernel <<<s.grid, s.block>>>(out.data(), rhs.data(), out.size());
-    return out;
+    return CollOfScalar(lhs.val_ / rhs.val_);
 }
 
 CollOfScalar equelleCUDA::operator*(const Scalar lhs, const CollOfScalar& rhs) {
-    CollOfScalar out = rhs;
-    kernelSetup s = out.setup();
-    multScalCollection_kernel<<<s.grid,s.block>>>(out.data(), lhs, out.size());
-    return out;
+    return CollOfScalar( lhs * rhs.val_);
 }
 
 CollOfScalar equelleCUDA::operator*(const CollOfScalar& lhs, const Scalar rhs) {
-    return (rhs * lhs);
+    return ( rhs * lhs);
 }
 
 CollOfScalar equelleCUDA::operator/(const CollOfScalar& lhs, const Scalar rhs) {


// >=
CollOfBool equelleCUDA::operator>=(const CollOfScalar& lhs, const CollOfScalar& rhs) {
    CollOfBool out(lhs.size());
    bool* out_ptr = thrust::raw_pointer_cast( &out[0] );
    kernelSetup s = lhs.setup();
    comp_collGEcoll_kernel<<<s.grid,s.block>>>(out_ptr, lhs.data(), rhs.data(), lhs.size());
    return out;
}

CollOfBool equelleCUDA::operator>=(const CollOfScalar& lhs, const Scalar rhs) {
    CollOfBool out(lhs.size());
    bool* out_ptr = thrust::raw_pointer_cast( &out[0] );
    kernelSetup s = lhs.setup();
    comp_collGEscal_kernel<<<s.grid, s.block>>>(out_ptr, lhs.data(), rhs, lhs.size());
    return out;
}

CollOfBool equelleCUDA::operator>=(const Scalar lhs, const CollOfScalar& rhs) {
    CollOfBool out(rhs.size());
    bool* out_ptr = thrust::raw_pointer_cast( &out[0] );
    kernelSetup s = rhs.setup();
    comp_scalGEcoll_kernel<<<s.grid, s.block>>>(out_ptr, lhs, rhs.data(), rhs.size());
    return out;
}




// ==
CollOfBool equelleCUDA::operator==(const CollOfScalar& lhs, const CollOfScalar& rhs) {
    return ( lhs.val_ == rhs.val_ );
}

CollOfBool equelleCUDA::operator==(const CollOfScalar& lhs, const Scalar rhs) {
    return ( lhs.val_ == rhs );
}

CollOfBool equelleCUDA::operator==(const Scalar lhs, const CollOfScalar& rhs) {
