Issue 1:
I'm using Glide v3.6.0 (awesome library BTW 👍 )

I have an ImageView with constant dimens

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/list_selector"
android:orientation="vertical"
android:padding="@dimen/space_xsmall">

<ImageView
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:contentDescription="@string/accessibility_image_desc"
android:scaleType="centerInside" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textSize="@dimen/text_size_medium" />

</LinearLayout>

And I'm filling the image using the following request

Glide.with(activity)
.load(imageUrl)
.placeholder(R.drawable.progress_drawable)
.error(R.drawable.ic_failed_loading)
.into(imageView);

This is the result

This one is after first run

While this one is after destroying the app and opening it again (top images already cached), but bottom images weren't cached yet

This was solved by using

Glide.with(activity)
.load(imageUrl)
.placeholder(R.drawable.progress_drawable)
.error(R.drawable.ic_failed_loading)
.dontAnimate() // This solved the problem
.into(imageView);

Issue 2:
Glide Version/Integration library (if any): 3.5.2

Device/Android Version: S4/4.4

Issue details/Repro steps: Load a different sized thumbnail and image, or placeholder and image and note the result:

Glide load line:

class Delay extends UnitTransformation {
private final int sleepTime;
public Delay(int sleepTime) { this.sleepTime = sleepTime; }
@Override public Resource transform(Resource resource, int outWidth, int outHeight) {
try { Thread.sleep(sleepTime); } catch (InterruptedException ex) {}
return super.transform(resource, outWidth, outHeight);
}
}

@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ImageView image = new ImageView(this);
setContentView(image);

// Saved as R.drawable.placeholder
String placeholder = "http://placehold.it/300x500/eedddd.png&text=PLACEHOLDER";
// Square image
String thumb = "http://placehold.it/300x300/eeeedd.png&text=THUMB";
// Wide image
final String full = "http://placehold.it/300x100/eedddd.png&text=FULL";
// Prepared request with unimportant clutter
final DrawableRequestBuilder<String> req = Glide
.with(this)
.fromString()
.diskCacheStrategy(DiskCacheStrategy.SOURCE) // disable network delay for demo
.skipMemoryCache(true) // make sure transform runs for demo
.crossFade(2000) // default, just stretch time for noticability
;

req.clone()
.thumbnail(req.clone()
.transform(new Delay(500)) // wait a little
.load(thumb)
)
.transform(new Delay(1000)) // wait before going from thumbnail to image
//.dontAnimate() // solves the problem
.load(full)
.into(image);

image.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
req.clone()
.load(full)
.placeholder(R.drawable.placeholder)
.transform(new Delay(1000))
//.animate(R.anim.abc_fade_in) // also solves the problem
.into(image);
}
});

By removing all the delaying parts, the end result is better, but the now the thumbnail is messed up: